2011-12-28 53 views
1

我正在爲不是由我製作的遊戲的客戶端加載程序。我已經建立了一個鼠標和鍵盤事件庫發送給客戶,他們大部分工作。然而,有一點我似乎無法弄清楚。要使用哪個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

和其他人也許不多,但沒有運氣。有誰知道哪個命令可能工作?

回答

4

你將不得不幸運的這個工作。鍵盤輸入不僅僅是一個消息。它也影響(其中包括)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

0

嘗試WM_KEYDOWN,然後是WM_KEYUP。用VK_ENTER代碼(我認爲)。

+0

我忘了提及我也嘗試過這些。這是我在Char沒有工作後的第二次猜測。將它添加到列表中。 – ozdrgnaDiies 2011-12-28 01:48:33