获得QQ聊天输入框中的内容

// 首先得到输入框的句柄。通过spy++这类工具分析,聊天窗体的类名为“#32770”// 但当前系统里不只一个类名为“#32770”的窗体,这就需要全体遍历一次。// 类名为“#32770”标题含“聊天”基本能确定。为保险起见还判断一下所在进程是否为“qq.exe”
uses PsAPI, RichEdit;
function Process_ReadRichEditText(AHandle: THandle): WideString;var  vGetTextEx: GETTEXTEX;  vGetTextLengthEx: GETTEXTLENGTHEX;  L: Integer;
  vProcessId: DWORD;  vProcess: THandle;  vPointer: Pointer;  vNumberOfBytesRead: Cardinal;begin  Result := ‘‘;  if not IsWindow(AHandle) then Exit;  GetWindowThreadProcessId(AHandle, @vProcessId);  vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or    PROCESS_VM_WRITE, False, vProcessId);  try    vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,      PAGE_READWRITE);    vGetTextLengthEx.flags := GTL_DEFAULT;    vGetTextLengthEx.codepage := 1200; // Unicode    WriteProcessMemory(vProcess, vPointer, @vGetTextLengthEx,      SizeOf(vGetTextLengthEx), vNumberOfBytesRead);    L := SendMessage(AHandle, EM_GETTEXTLENGTHEX, Integer(vPointer), 0);    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);    if L <= 0 then Exit;    vPointer := VirtualAllocEx(vProcess, nil, SizeOf(vGetTextEx) + L * 2 + 2,      MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);    SetLength(Result, L);    vGetTextEx.cb := L * 2 + 2;    vGetTextEx.flags := GT_DEFAULT;    vGetTextEx.codepage := 1200; // Unicode    vGetTextEx.lpDefaultChar := nil;    vGetTextEx.lpUsedDefChar := nil;    WriteProcessMemory(vProcess, vPointer, @vGetTextEx,      SizeOf(vGetTextEx), vNumberOfBytesRead);    SendMessage(AHandle, EM_GETTEXTEX, Integer(vPointer),      Integer(vPointer) + SizeOf(vGetTextEx));    ReadProcessMemory(vProcess, Pointer(Integer(vPointer) + SizeOf(vGetTextEx)),      @Result[1], L * 2, vNumberOfBytesRead);    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);  finally    CloseHandle(vProcess);  end;end; { Process_ReadRichEditText }
function GetProcessName(AProcessID: THandle): string;var  vBuffer: array[0..MAX_PATH] of Char;  vProcess: THandle;begin  vProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,    AProcessID);  try    if GetModuleBaseName(vProcess, 0, vBuffer, SizeOf(vBuffer)) > 0 then      Result := vBuffer    else Result := ‘‘;  finally    CloseHandle(vProcess);  end;end; { GetProcessName }
function EnumChild(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;var  vBuffer: array[0..255] of Char;begin  Result := True;  if not IsWindowVisible(hwnd) then Exit; // 不可见  GetClassName(hwnd, vBuffer, SizeOf(vBuffer));  if SameText(vBuffer, ‘RichEdit20A‘) then  begin    if GetWindowLong(hwnd, GWL_STYLE) and ES_READONLY <> ES_READONLY then // 非只读    begin      PInteger(lParam)^ := hwnd;      Result := False;    end;  end;end; { EnumChild }
function EnumFunc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;var  vBuffer: array[0..255] of Char;  vProcessId: THandle;begin  Result := True;  if not IsWindowVisible(hwnd) then Exit; // 不可见  GetClassName(hwnd, vBuffer, SizeOf(vBuffer));  if SameText(vBuffer, ‘#32770‘) then  begin    GetWindowThreadProcessId(hwnd, vProcessId);    if SameText(GetProcessName(vProcessId), ‘qq.exe‘) then    begin      GetWindowText(hwnd, vBuffer, SizeOf(vBuffer));      if Pos(‘聊天中‘, vBuffer) > 0 then // 标题中含"聊天中"      begin        EnumChildWindows(hwnd, @EnumChild, lParam);        Result := False;      end;    end;  end;end; { EnumFunc }
procedure TForm1.Button1Click(Sender: TObject);var  vHandle: THandle;begin  vHandle := 0;  EnumWindows(@EnumFunc, Integer(@vHandle));  if vHandle = 0 then Exit;  Memo1.Text := Process_ReadRichEditText(vHandle);end;

using System.Runtime.InteropServices;

[DllImport("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);

[DllImport("user32.dll")]
public static extern int EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent, 
    WNDENUMPROC lpEnumFunc, int lParam);
[DllImport("user32.dll")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString,
    int nMaxCount);
[DllImport("user32.dll")]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,
    int nMaxCount);
[DllImport("user32.dll")]
public static extern bool IsWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,
    IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd,
    out uint dwProcessId);

[DllImport("psapi.dll")]
public static extern uint GetModuleBaseName(IntPtr hProcess, IntPtr hModule,
    StringBuilder lpBaseName, uint nSize);

public const uint PROCESS_VM_OPERATION = 0x0008;
public const uint PROCESS_VM_READ = 0x0010;
public const uint PROCESS_VM_WRITE = 0x0020;
public const uint PROCESS_QUERY_INFORMATION = 0x0400;

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess,
    bool bInheritHandle, uint dwProcessId);

[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr handle);

[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
public const int GWL_STYLE = -16;
public const int ES_READONLY = 0x800;

public const uint MEM_COMMIT = 0x1000;
public const uint MEM_RELEASE = 0x8000;

public const uint MEM_RESERVE = 0x2000;
public const uint PAGE_READWRITE = 4;

[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress,
    uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
   uint dwSize, uint dwFreeType);

[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
   IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
   IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead); 

private IntPtr richHandle;

public string GetProcessName(uint AProcessId)
{
    StringBuilder vBuffer = new StringBuilder(256);
    IntPtr vProcess = OpenProcess(
        PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, AProcessId);
    try
    {
        if (GetModuleBaseName(vProcess, IntPtr.Zero, vBuffer, 
            (uint)vBuffer.Capacity) > 0)
            return vBuffer.ToString();
        else return string.Empty;
    }
    finally
    {
        CloseHandle(vProcess);
    }
}

public bool EnumChild(IntPtr hwnd, int lParam)
{
    if (!IsWindowVisible(hwnd)) return true; // 不可见
    StringBuilder vBuffer = new StringBuilder(256);
    GetClassName(hwnd, vBuffer, vBuffer.Capacity);
    if (vBuffer.ToString().ToLower() == "richedit20a")
    {
        if ((GetWindowLong(hwnd, GWL_STYLE) & ES_READONLY) != ES_READONLY) // 非只读
        {
            richHandle = hwnd;
            return false;
        }
    }
    return true;
}

public bool EnumFunc(IntPtr hwnd, int lParam)
{
    if (!IsWindowVisible(hwnd)) return true; // 不可见
    StringBuilder vBuffer = new StringBuilder(256);
    GetClassName(hwnd, vBuffer, vBuffer.Capacity);
    if (vBuffer.ToString() == "#32770")
    {
        uint vProcessId;
        GetWindowThreadProcessId(hwnd, out vProcessId);
        if (GetProcessName(vProcessId).ToLower() == "qq.exe")
        {
            GetWindowText(hwnd, vBuffer, vBuffer.Capacity);
            if (vBuffer.ToString().IndexOf("聊天中") >= 0) // 标题中含"聊天中"
            {
                EnumChildWindows(hwnd, @EnumChild, lParam);
                return false;
            }
        }
    }
    return true;
}

[StructLayout(LayoutKind.Sequential)]
public struct GETTEXTLENGTHEX
{
    public uint flags;
    public uint codepage;
}

[StructLayout(LayoutKind.Sequential)]
public struct GETTEXTEX
{
    public int cb;
    public int flags;
    public int codepage;
    public IntPtr lpDefaultChar;
    public IntPtr lpUsedDefChar;
};

public const int GTL_DEFAULT = 0;
public const int GT_DEFAULT = 0;
public const int WM_USER = 0x0400;
public const int EM_GETTEXTEX = WM_USER + 94; 
public const int EM_GETTEXTLENGTHEX = WM_USER + 95;

public string Process_ReadRichEditText(IntPtr AHandle)
{
    if (!IsWindow(AHandle)) return string.Empty;
    string vReturn = string.Empty;
    uint vProcessId;
    GetWindowThreadProcessId(AHandle, out vProcessId);
    IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
        PROCESS_VM_WRITE, false, vProcessId);
    try
    {
        uint vNumberOfBytesRead = 0;
        IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 0x1000, 
            MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
        GETTEXTLENGTHEX vGetTextLengthEx = new GETTEXTLENGTHEX();
        vGetTextLengthEx.flags = GTL_DEFAULT;
        vGetTextLengthEx.codepage = 1200; // Unicode
        IntPtr vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextLengthEx));
        Marshal.StructureToPtr(vGetTextLengthEx, vAddress, false);
        WriteProcessMemory(vProcess, vPointer, vAddress,
            Marshal.SizeOf(vGetTextLengthEx), ref vNumberOfBytesRead);
        Marshal.FreeCoTaskMem(vAddress);
        int L = SendMessage(AHandle, EM_GETTEXTLENGTHEX, (int)vPointer, 0);
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        if (L <= 0) return vReturn;
        GETTEXTEX vGetTextEx = new GETTEXTEX();
        vGetTextEx.cb = L * 2 + 2;
        vGetTextEx.flags = GT_DEFAULT;
        vGetTextEx.codepage = 1200; // Unicode
        vGetTextEx.lpDefaultChar = IntPtr.Zero;
        vGetTextEx.lpUsedDefChar = IntPtr.Zero;
        vPointer = VirtualAllocEx(vProcess, IntPtr.Zero,
            (uint)(Marshal.SizeOf(vGetTextEx) + L * 2 + 2),
            MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
        vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextEx));
        Marshal.StructureToPtr(vGetTextEx, vAddress, false);
        WriteProcessMemory(vProcess, vPointer, vAddress,
            Marshal.SizeOf(vGetTextEx), ref vNumberOfBytesRead);
        Marshal.FreeCoTaskMem(vAddress);
        SendMessage(AHandle, EM_GETTEXTEX, (int)vPointer,
            (int)vPointer + Marshal.SizeOf(vGetTextEx));
        vAddress = Marshal.AllocCoTaskMem(L * 2);
        ReadProcessMemory(vProcess, 
            (IntPtr)((int)vPointer + Marshal.SizeOf(vGetTextEx)),
            vAddress, L * 2, ref vNumberOfBytesRead);
        vReturn = Marshal.PtrToStringUni(vAddress, L * 2);
        Marshal.FreeCoTaskMem(vAddress);
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
    }
    finally
    {
        CloseHandle(vProcess);
    }
    return vReturn;
}

private void button1_Click(object sender, EventArgs e)
{
    richHandle = IntPtr.Zero;
    EnumWindows(EnumFunc, 0);
    if (richHandle == IntPtr.Zero) return;
    Console.WriteLine(Process_ReadRichEditText(richHandle));
}

http://blog.csdn.net/zswang/article/details/2009868

时间: 2024-08-07 07:24:37

获得QQ聊天输入框中的内容的相关文章

初学js---获取输入框中的内容并添加到表格中

按下添加按钮将输入框中的内容添加到表格中: 这里涉及到的动态创建表格单元的已讲略过 只讲获取数据添加到表格:通过getElementById(*).value分别获取输入框中的值,通过以上代码将其加入到表格中 完整代码:(注释部分为更复杂的方法) <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>取值填入表格</ti

屏蔽QQ聊天对话框中的广告

原文地址: 怎么在QQ聊天对话框中屏蔽广告_百度经验 http://jingyan.baidu.com/article/48a42057ca12c1a924250402.html     QQ已经成为当前主要的聊天工具之一,但是,自从QQ商业化之后,广告也占用了聊天框的半壁江山.虽然会员用户可以屏蔽广告,但是作为一个合格的免费用户,怎么才能享受相同的待遇呢?请阅读下文. 工具/原料 Windows 8 腾讯 QQ 方法/步骤 按键盘上的 Win+R 快捷键打开运行框,然后复制并粘贴 Applic

Javascript 对输入框中的内容进行 “全选/反选”

<</span>script> document.write("<</span>ul>"); for(var i=0;i<</span>18;i++){ document.write("<</span>li>"); document.write('<</span>input type="checkbox" value='+ i +'/>

UI基础--UITableView实现仿QQ聊天页面

需求:类似于QQ聊天页面的展示,内容包括有头像.时间.聊天内容.相同时间发生的内容,只显示第一条内容的时间,并且点击输入框时,可以滚动到最后一条内容信息.具体效果图: 实例的文件结构: 实现的具体步骤: 1.布局界面,主要包括一个UIImageView.3个UIButton.1个UITextField: 2.自定义数据模型类,并测试数据是否能正常加载: 3.自定义cell,由于每行数据的高度都是不规则的,所以考虑先自定义好frame再来写自定义cell.属性包括frame模型以及生成可重用cel

QQ聊天界面的输入法顶起界面底部输入框效果的实现

转载请注明:http://www.cnblogs.com/frank-zouxu/p/4127115.html 今天在公司做项目的时候遇到一个需求:需要做一个界面,效果类似QQ聊天界面,如图1,当我们点击内容输入框准备输入内容的时候,底部的表情框的那一栏会被输入法的软键盘给顶起来,默认状态下,输入法会覆盖掉我们的表情输入框.起初,百思不得解的我费尽了心思,未果,偶然看到此篇博客http://blog.csdn.net/twoicewoo/article/details/7384398.其实,欲达

在网页中添加QQ聊天

1在网站 http://wp.qq.com/index.html上登录自己的QQ 2填写 3.点击“复制公开代码” 在网页中添加QQ聊天

APPium连接真机输入框中输入的内容与代码中不一致

今天解决了上一个问题,又碰到了一个新的问题. 问题:连接真机输入框中输入的内容与代码中不一致. 描述: 想实现登录页面输入用户名和密码自动登录,可是在输入用户名和密码的框中输入的内容总是与代码中的不一致,初步感觉到应该和输入发有关系,于是把用户名和密码都换成数字可以成功登录,但是真实的用户名很有可能含有字母,所以继续学习实践.把手机默认输入法换成英文的,再运行一次代码,用户名"clinvab001"可以正常输入,但是密码输入又出了问题,在网上各种寻找,几经实践终于找到了解决的办法了,在

获取textarea文本框所选字符光标位置索引,以及选中的文本值;textarea高度自适应,随着内容增加高度增加;获取输入框中的光标位置

获取textarea文本框所选字符光标位置索引,以及选中的文本值 $.fn.selection = function () { var s, e, range, stored_range; if (this[0].selectionStart == undefined) { var selection = document.selection; if (this[0].tagName.toLowerCase() != "textarea") { var val = this.val()

Input Text关键字——模拟向一个输入框中输入文字内容

Input Text关键字:模拟向一个输入框中输入文字内容. 该关键字接受2个参数 [ locator | text ]:locator参数指的是定位界面元素的方式,text参数指的是需要输入的内容. ==================================================================================== 示例:打开百度页面,输入“robot framework”,这里采用id的方式来定位界面输入框元素. Open Browser