我如何知道另一个进程上按钮的Msg类型,例如WM_COMMAND
我的目标是
我想点击那个按钮,即使它被禁用了。我知道我可以简单地使用EnableWindow
然后使用来启用目标按钮
PostMessage(hButton, WM_KEYDOWN, VK_RETURN, 0);
问题是如果有一个线程来验证某些东西,例如
if TRUE then
buttonX.enabled := True
else
buttonX.enabled := False;
即使线程是这样运行的,也可以点击那个按钮吗。
PostMessage(hTargetApp, WM_COMMAND, XXXX, 0);
这是我的DLL
function WindowProcMain(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
case Msg of
WM_COMMAND:MessageBoxW(HWND_DESKTOP, PChar('The WM_COMMAND code is: '+IntToStr(wParam)), 'WM_COMMAND', MB_OK);
end;
Result := CallWindowProc(MainWndProc, hWnd, Msg, wParam, lParam);
end;
我已经把它注入一个有这个buton 的进程
procedure TMainForm.btn1Click(Sender: TObject);
begin
ShowMessage('You Click Me');
end;
但是什么都没有出现
如果我的理解是错误的,请纠正,并给我指明正确的方向。
用WM_COMMAND
消息模拟按钮点击的正确方法如下:
PostMessage(GetParent(hButton), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hButton), BN_CLICKED), hButton);
但是,如果按钮窗口实际上被禁用,这并不能保证按钮的单击处理程序会被调用。对于VCL TButton
组件,它将被调用。但是,如果您将代码注入到一个非VCL进程中,谁知道它会遵循什么规则呢。