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 中 怎么做线程单元里调用主窗口单元的控件事件 给个例子····等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)