要使用哪个WM_Message?

问题描述:

我正在为不是由我制作的游戏的客户端加载程序。我已经建立了一个鼠标和键盘事件库发送给客户,他们大部分工作。然而,有一点我似乎无法弄清楚。要使用哪个WM_Message?

我做了我的代码这个打字部分:

[DllImport("user32.dll")] 
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam); 

//Send each character of string one at a time 
foreach(Char c in Input) 
    PostMessage(mainwnd, (uint)WM.CHAR, c, 1); 
//Send final enter key to send message in game 
PostMessage(mainwnd, (uint)WM.CHAR, 0x0D, 1); 

这工作得很好,但有两件事情是不占。

  1. 在游戏中的你需要按下回车键式打开聊天之前
  2. 有热键打开菜单

我已经试过的东西像PostMessage(mainwnd, (uint)WM.CHAR, 0x0D, 1);送一开始就进入键,但游戏并没有处理它。同样的事情发生,如果我使用PostMessage尝试打开菜单。除非聊天窗口在发送消息之前已经打开,否则没有任何内容被分析。

我想我正在使用错误的WM_Message,但我找不到我需要的一个。我曾尝试:

  1. WM_CHAR
  2. WM_SYSCHAR
  3. WM_MENUCHAR
  4. WM_HOTKEY
  5. WM_APPCOMMAND
  6. WM_KEYDOWN之后WM_KEYUP

和其他人也许不多,但没有运气。有谁知道哪个命令可能工作?

你将不得不幸运的这个工作。键盘输入不仅仅是一个消息。它也影响(其中包括)GetKeyboardStateGetAsyncKeyState - 并且用这些模拟输入并不重要。如果键盘焦点在其他地方,它可能会把事情搞砸。

您可以尝试发布WM_KEYDOWNWM_KEYUP以生成稍低级别的消息。

低级仍然是SendInput它模拟来自键盘驱动程序的输入。键盘焦点必须放在正确的位置,否则会将输入发送到错误的窗口。

+0

SendInput看起来是最好的选择,但从查看参数它不需要窗口句柄。我需要PostMessage的原因是我可以在屏幕最小化时发送数据。也许我读错了,但SendInput似乎需要完整的屏幕焦点。 – ozdrgnaDiies 2011-12-28 01:51:53

+1

你不明白; “重点”是键盘输入如何工作。一次只有一个窗口可以接收键盘输入消息:具有键盘焦点的窗口。如果您尝试将键盘输入发送到未聚焦的窗口,那么您就是赌博,在这种情况下,听起来就像输了。 – tenfour 2011-12-28 01:53:43

+0

解释这个问题的另一种方法是......如果你可以指定一个窗口,你在模拟键盘输入方面做得并不好。键盘驱动程序不知道关于窗口句柄的任何信息。 – tenfour 2011-12-28 01:58:25

尝试WM_KEYDOWN,然后是WM_KEYUP。用VK_ENTER代码(我认为)。

+0

我忘了提及我也尝试过这些。这是我在Char没有工作后的第二次猜测。将它添加到列表中。 – ozdrgnaDiies 2011-12-28 01:48:33