2010-11-27 35 views
2

首先, 我試圖鍵盤輸入發送到後臺應用程序(即一點兒也不具有焦點或者甚至可能不會出現對用戶可見的窗口)。C#PostMessage的不發送,並沒有錯誤

我驗證過的窗口句柄和常數是正確的。 問題是後臺應用程序似乎並沒有得到消息,除非 我設置的PostMessage的()行設置斷點,然後按F10(步過)或F5(繼續),當它到達那裏,然後 擊鍵神奇地被髮送。

什麼給? 相關代碼:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)] 
    public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam); 

    PostMessage(winHandle, (uint)WM_KEYDOWN, 66, 0); 

使用Win7的64和MS Visual Studio 2008中的親,控制檯應用程序。如果有幫助,上面的代碼在一個線程上。

+0

可能,這是獲得發送是F10或F5的主要行程;) – 2010-11-27 16:30:00

回答

2

使用Win7的64

這是有點相關,該聲明是錯誤的。在32位模式下工作,但在64位模式下很麻煩。最後兩個參數是指針,而不是整數。 8字節,而不是4.修復:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)] 
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); 

PostMessage(winHandle, (uint)WM_KEYDOWN, (IntPtr)66, IntPtr.Zero); 

但是,這可能不會真正解決您的問題。在x64模式下,非實例方法的前4個參數傳遞到寄存器中,而不是堆棧中。只是碰巧這個方法有4個參數,你不會得到PInvokeStackImbalance MDA警告。而64位寄存器值的高32位常常是零,所以P/Invoke編組器生成32位或64位參數值並不重要。

小心,這種方法在實踐中是相當麻煩。您無法控制目標進程中鍵盤的狀態。您正在發送B的按鍵。根據修改鍵的狀態,可能會變成B,b,Alt + B或Ctrl + B。只有SendInput()可以可靠地工作。那麼,從窗口焦點問題。

+0

A-HA!現在我清楚了。按鍵WAS實際上正在發送,但由於ALT被按下,目標應用程序沒有正確解釋它。似乎我可能不得不採取另一種方法。 – Simon 2010-11-27 17:13:18

相關問題