怎样获取当前具有输入焦点控件的窗口句柄?

runerback runerback 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
WindowAPI那里发帖没人理


WinAPI.AttachThreadInput((uint)_p.Id, (uint)selfPID, true);
IntPtr focusdhandle = WinAPI.GetFocus();
WinAPI.AttachThreadInput((uint)_p.Id, (uint)selfPID, false);
Console.WriteLine(focusdhandle);

其中 _p 是目标程序的 Process 实例,selfPID 是 创建前者进程 的 主程序进程ID。。获取到的 focusdhandle 一直是 0

我是想监控程序收到的按键消息,同时也可以发送消息给目标进程有焦点的控件

之前给目标窗体发消息,在目标进程的 WndProc 截获到了发送过去的消息,然而里面仅有的一个文本框句柄竟然获取不到。。

Process _p = Process.GetProcessById(pInfo.dwProcessId);
while (!_p.HasExited)
{
if (_p.MainWindowHandle.ToInt32() != 0)
{
mainWindowHandle = _p.MainWindowHandle;
break;
}
}
_p.WaitForInputIdle();
WinAPI.PostMessageSafe(mainWindowHandle, 0x0100, 0x41, 0);
_p.WaitForExit();


至于监控目标程序收到的消息,我想用钩子来做但是失败了,无法获取ModelHandle

private static void SetHook(PROCESS_INFORMATION pInfo)
{
WinAPI.HookProc hook = myHookProc;
Process p = Process.GetProcessById(pInfo.dwProcessId);
IntPtr modelhandle = WinAPI.GetModuleHandle(p.MainModule.ModuleName);//获取不到,一直返回 0
curHook = WinAPI.SetWindowsHookEx(HookType.WH_KEYBOARD, myHookProc, modelhandle, (uint)pInfo.dwThreadId);
int error = Marshal.GetLastWin32Error();
if (error != 0)
{
throw new Win32Exception(error);
}
}

private static IntPtr myHookProc(int code, IntPtr wParam, IntPtr lParam)
{
Keys key = (Keys)wParam.ToInt32();
Console.WriteLine(key);
return WinAPI.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
}

常见的单机游戏如果全屏运行的话,是不是只要给这个主窗体发消息就可以了?

整理一下我想问的:怎样给另一个程序中当前焦点控件比如文本框之类的发送按键消息?
...全文
评论 4
收藏 已收藏
分享
返回顶部
runerback
C# 111,129 成员 642,539 内容