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

runerback 2015-08-15 10:55:10
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);
}

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

整理一下我想问的:怎样给另一个程序中当前焦点控件比如文本框之类的发送按键消息?
...全文
424 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2015-08-16
  • 打赏
  • 举报
回复
有人回答真好,可以结贴啦
runerback 2015-08-15
  • 打赏
  • 举报
回复


事理 2015-08-15
  • 打赏
  • 举报
回复
如果使用spy++无法指向窗口中的那个控件,只能指向窗口,说明输入框是没有句柄的,就不能通过句柄了,得通过鼠标定位,然后模拟按键发送了
事理 2015-08-15
  • 打赏
  • 举报
回复
首先使用spy++工具获取到窗口类名和输入控件的类名,然后通过api获取句柄,就像这样 [DllImport("user32.dll")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.DLL")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); IntPtr myIntPtr = FindWindow(null, "QQ游戏"); IntPtr handle1 = FindWindowEx(myIntPtr, IntPtr.Zero, "ComboBox", null);//找账号输入框句柄 IntPtr handle2 = FindWindowEx(myIntPtr, handle1, "Edit", null);//找密码输入框句柄 if (handle1 != null && handle2 != null) { InputStr(handle1, "555544555"); //输入QQ号码 InputStr(handle2, "1111111111111"); //输入游戏密码 PostMessage(handle2, WM_KEYDOWN, 13, 0); //输入ENTER PostMessage(handle2, WM_KEYUP, 13, 0); } http://www.cnblogs.com/slyzly/articles/1966012.html

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧