Delphi中如何获取外部程序焦点所在控件的句柄

Delphi中如何获取外部程序焦点所在控件的句柄,第1张

function GetFocusHandle: HWND;

var

h: HWND;

c: array[0102432] of Char;

idAttach: Cardinal;

begin

H := GetForegroundWindow;

idAttach := GetWindowThreadProcessId(h, nil);

if not AttachThreadInput(idAttach , GetCurrentThreadId(), True) then Exit;

Result := GetFocus;

AttachThreadInput(idAttach, GetCurrentThreadId(), false );

end;

1、通过窗口获取到目标进程的PID, 然后通过PID,获取到进程HANDLE

2、利用VirtualAllocEx() 在目标进程中分配一个可读取的缓存地址

3、向目标窗口发送WM_GETTEXT消息, 消息的LPARAM参数为第二步分配的缓存地址

4、ReadProcessMemory() 读取内容

这有很多方法,你可以在线程里面写个方法,方法里面的代码恰好是控件事件里面的代码就行啦,然后在线程run里面调用。但是如果窗口中的控件事件涉及到界面的刷新,则不应该在线程中调用,应该由线程发送一个消息给窗口,窗口捕获到该消息后,调用相应控件的事件。下面是我的部分代码,可一参考:

ShowCollectDataFrmfShowTxt := '正在采集'+DataCollectFrmfSelDevicer[i]TypeName+

'['+DataCollectFrmfSelDevicer[i]ModelID+']'+'的数据,请稍候';

PostMessage(ShowCollectDataFrmHandle,WM_ThreadChangeMsg,SelfThreadID,0);

这两句代码是在线程的run里面,是指线程运行到这里要更新窗口的提示信息,则发送一个消息到ShowCollectDataFrm,消息定义为WM_ThreadChangMsg。

const

WM_ThreadChangeMsg = WM_USER + 20;

这是在主窗体中定义的消息常量

procedure ThreadChange(var AMessage: TMessage);Message WM_ThreadChangeMsg;

这是捕获消息的方法的定义,他是回调函数,不需要手动调用

procedure TShowCollectDataFrmThreadChange(var AMessage: TMessage);

begin

if fCollectThreadID = Cardinal(AMessageWParam) then

begin

ApplicationProcessMessages;

lblShowTxtCaption := fShowTxt; //更改提示文字

ApplicationProcessMessages;

end;

end;

这是捕获到消息后的处理,你可以把里面改成你要调用的控件的事件,如:btnStopClick(nil)。

以上就是关于Delphi中如何获取外部程序焦点所在控件的句柄全部的内容,包括:Delphi中如何获取外部程序焦点所在控件的句柄、Delphi 如何得到其它程序窗口中的一按钮上面的名称、delphi 中 怎么做线程单元里调用主窗口单元的控件事件 给个例子····等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9318625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存