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

本文介绍了一种获取QQ聊天输入框内容的方法,首先通过遍历窗体找到类名为'#32770'且进程为'qq.exe'的聊天窗口,然后利用Windows API函数获取富文本编辑框(RichEdit20A)中的非只读内容。通过发送消息和内存操作读取输入框文本。
摘要由CSDN通过智能技术生成
// 首先得到输入框的句柄。通过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(
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
要获取AutoJS输入框内容,可以使用以下方法: 1. 首先,确保输入框已经定义并且具有唯一的ID。例如,可以使用以下代码定义一个输入框: ``` "ui"; ui.layout( <vertical> <input id="inputBox" w="*" h="300" gravity="top"/> </vertical> ); ``` 在这个例子输入框的ID是"inputBox"。 2. 然后,可以使用`obj.getText()`方法来获取输入框的文本内容。例如,如果要获取上述例子输入框内容,可以使用以下代码: ``` var inputText = inputBox.getText(); ``` 这样,`inputText`变量将包含输入框的文本内容。 需要注意的是,确保在获取输入框内容之前,输入框已经被用户输入内容,否则获取到的内容可能为空。 希望这个回答对您有帮助! #### 引用[.reference_title] - *1* [autojs点击输入框不弹出键盘怎么办?](https://blog.csdn.net/m0_74176885/article/details/128322970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Auto.js 输入框 input](https://blog.csdn.net/qq_25226575/article/details/123170093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Auto.js实现自动填充文本](https://blog.csdn.net/qq_52697994/article/details/117174026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值