delphi 使用api findwindow

snowwolf_wei 2005-09-13 04:30:02
我想编一个delphi程序,窗口里填写的内容有姓名,身份证,然后点击提交按钮,程序打开外部程序,外部程序的窗口里的姓名,身份证文本编辑栏自动填写好,内容是前面一个窗口的内容,请问怎么实现,能不能给些源代码,谢谢!
...全文
330 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowwolf_wei 2005-09-15
  • 打赏
  • 举报
回复
谢谢Larry1030(阿摯)
Larry1030 2005-09-14
  • 打赏
  • 举报
回复
接分!

function FindQQWindow: THandle;

function GetSpecialButtonHandle(hwnd: HWND; lParam: LPARAM):Boolean; stdcall;
var
cName: array[0..128] of Char;
wName: array[0..128] of Char;
begin
result := true;
GetClassName(hwnd, cName, 128);
if StrPas(cName) = 'Button' then
begin
GetWindowText(hwnd, wName, 128);
if StrPas(wName) = '软键盘'then
begin
FQQVersion := 'V2004Beta';
PInteger(lParam)^ := hwnd;
result := false;
end;
if StrPas(wName) = '注册向导' then
begin
FQQVersion := 'V2003';
PInteger(lParam)^ := hwnd;
result := false;
end;
end;
end;

function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
var
eName: array[0..180] of Char;
begin
Result := true;
if hwnd = 0 then Exit;
GetClassName(hwnd, eName, 32);

If CompareText('#32770', StrPas(eName))<>0 Then Exit;

EnumChildWindows(hwnd, @GetSpecialButtonHandle, Integer(@HSpecialHandle));
if HSpecialHandle <> 0 then
Begin
QQHandle:= hwnd;
Result := False;
End;
end;
begin
QQHandle:= 0;
EnumWindows(@EnumWindowsProc, 0);
Result:= QQHandle;
end;

{-------------------------------------------------------------------------------
说明: 取得QQ窗口的各个编辑框以及登陆按钮的句柄
-------------------------------------------------------------------------------}
procedure GetQQHandle;
Var
eHandle: THandle;
begin
eHandle:= FindQQWindow;
if eHandle<>0 then
begin
HPasswordEdit:= FindWindowEx(eHandle, 0, 'Edit', nil);
HNumberEdit:= FindWindowEx(eHandle, 0, 'Combobox', nil);
HLoginButton:= FindWindowEx(eHandle, 0, 'Button', '登录');
end;
end;

{-------------------------------------------------------------------------------
说明: 启动QQ后,计时器开始检测QQ窗口的存在,
检测到了,发送用户名密码到指定编辑框再模拟点击QQ登陆按钮完成登陆
-------------------------------------------------------------------------------}
procedure TQQLogin.FTimerTimer(Sender: TObject);
var
i: integer;
begin
GetQQHandle;

If (HNumberEdit=0) or (HPasswordEdit=0) or (HLoginButton=0) Then Exit;

SendMessage(HNumberEdit, WM_SETTEXT, 0, Integer(FUserId));

if FQQVersion = 'V2004Beta' then
begin
For I:= 1 To Length(FPassword) Do
SendMessage(HPasswordEdit, WM_USER+513, Integer(FPassword[I]), 0);
end
else
begin
For I:= 1 To Length(FPassword) Do
begin
SendMessage(HPasswordEdit, WM_CHAR, Integer(FPassword[I]), 0);
end;
end;

SendMessage(HLoginButton, WM_LBUTTONDOWN, 0, 0);
SendMessage(HLoginButton, WM_LBUTTONUP, 0, 0);

FTimer.Enabled := False;
Free;
end;
MNBSG 2005-09-13
  • 打赏
  • 举报
回复
对啊!这个我也有兴趣学习啊!
snowwolf_wei 2005-09-13
  • 打赏
  • 举报
回复
能不能给一些例子,我在这方面是菜鸟,谢谢啊
Larry1030 2005-09-13
  • 打赏
  • 举报
回复
步骤如下:
  1 先用findWindow或者EnumChildWindows 找到外部窗口的句柄
  2 然后用GetWindow找到子窗口句柄
  3 最后用sendmessage发送消息
snowwolf_wei 2005-09-13
  • 打赏
  • 举报
回复
外部程序不是我自己做的
ztenv 2005-09-13
  • 打赏
  • 举报
回复
外部程序如果是你自己编的就好办了,可以通过发送消息或共享内存块来实现;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧