使用哪个WM_Message?

时间:2011-12-28 01:39:18

标签: c# winapi postmessage

我正在为一个非由我制作的游戏开发客户端加载程序。我已经建立了一个鼠标和关键事件库,可以发送给客户端,它们大部分都可以工作。但是,有一点我似乎无法弄清楚。

我将代码的输入部分设为:

[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. 在游戏中,您需要在输入之前按Enter键才能打开聊天
  2. 有热键可以打开菜单
  3. 我尝试了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
    7. 也许还有其他几个,但没有运气。有谁知道哪个命令可能有效?

2 个答案:

答案 0 :(得分:4)

你必须幸运才能工作。键盘输入不仅仅是一条消息。它还影响(以及其他)GetKeyboardStateGetAsyncKeyState - 并且用这些模拟输入是非平凡的。如果键盘焦点在其他地方,它可能搞砸了。

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

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

答案 1 :(得分:0)

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