安装CBT钩子后,监控另一个应用程序,只要另一个应用程序打开一个窗口,
就找到其中一个文本框,往里面写入数据.
现在的问题是:有个别的窗口第一次没有效果,点一下别的窗口再点该程序就可以.
不知是为什么?
// 钩子回调
function CBTHookProc(nCode: integer; wParam: wParam; LParam: LParam): LRESULT; stdcall;
var
Dialog: HWND;
buffer: array[0..255] of char;
begin
Result := 0;
if nCode < 0 then
begin
Result := CallNextHookEx(aHook, nCode, wParam, LParam);
Exit;
end
else
begin
case nCode of
HCBT_ACTIVATE:
begin
Dialog := HWND(wParam);
// 约束条件
GetClassName(Dialog, buffer, 255);
if buffer = 'TSubForm' then
begin
SetLength(HandleList, 0);
EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog)); //找到控件handle后填充数据
SendMessage(HandleList[3], WM_SETTEXT, 0, Longint(PChar('哈哈哈哈萨克')));
end;
end;
end;
end;
end;
就找到其中一个文本框,往里面写入数据.
现在的问题是:有个别的窗口第一次没有效果,点一下别的窗口再点该程序就可以.
不知是为什么?
// 钩子回调
function CBTHookProc(nCode: integer; wParam: wParam; LParam: LParam): LRESULT; stdcall;
var
Dialog: HWND;
buffer: array[0..255] of char;
begin
Result := 0;
if nCode < 0 then
begin
Result := CallNextHookEx(aHook, nCode, wParam, LParam);
Exit;
end
else
begin
case nCode of
HCBT_ACTIVATE:
begin
Dialog := HWND(wParam);
// 约束条件
GetClassName(Dialog, buffer, 255);
if buffer = 'TSubForm' then
begin
SetLength(HandleList, 0);
EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog)); //找到控件handle后填充数据
SendMessage(HandleList[3], WM_SETTEXT, 0, Longint(PChar('哈哈哈哈萨克')));
end;
end;
end;
end;
end;
解决方案 »
- 招DELPHI开发人员
- access数据库中的SQL代码怎样使用“*=“?
- 给CSDN的建议
- 各位大虾,谁能帮帮忙!
- 在线求救
- 存储过程调用时:commandtext does not return a result set出错提示why??在线等
- 我每次调用DLL时,是这样做的,但是我感觉调用完成后内存没有全部释放,太浪费资源了
- 程序中有两个form怎么实现form1执行后在执行form2?
- 谁帮我说说override的具体用法?详细点的书上介绍的太简单看了还是不清楚!
- idhttp post 方法疑问,懂者请进解疑~~~~
- 有什么办法可以把查找标题包含于'聊天中'的窗体句柄?
- 小问题:如何使EDIT和COMBOBOX文本框前面空出几个字符???
EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog));
SetLength(HandleList, 0);
EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog)); Application.MessageBox('执行了!', '提示'); //找到控件handle后填充数据
SendMessage(HandleList[3], WM_SETTEXT, 0, Longint(PChar('哈哈哈哈萨克'))); 能正常弹出提示,但就是看不到效果.只有重新获得一次焦点才可以.
不使用dll的话有效果.
如果是新建TSubForm就可以
本身就是激活的状态不会收到这个消息吧
点下别的窗口再点回来就触发了
直接做到EXE里面去吧……
点击一个按钮才调出隐藏的SubForm来
这个过程应该会有激活的消息吧