2016-06-19 21 views
2

私はPostMessageを使って、最小化されたfirefoxインスタンスに鍵を送信しています。以下のコードは大文字ではうまく動作しますが、Lowercaseを送信すると送信された各文字のうち3文字を送信するようです。小文字キーを送信するときにPostMessageが複数のキーを送信するのはなぜですか?

これは、「c」文字を送信するためのカットダウンの例です。私はそれがメモ帳で同じことをするので、Firefoxではないことを知っています。

これは私が手動でウィンドウ

<000001> 000204B6 P WM_KEYDOWN nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000002> 000204B6 P WM_CHAR chCharCode:'99' (99) cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000003> 000204B6 P WM_KEYUP nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:1 fUp:1 

に入力を送信するときのためspy++出力は、この私のコードは、それを送信するときのためspy++出力が

<000001> 000906D4 P WM_KEYDOWN nVirtKey:'C' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000002> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000003> 000906D4 P WM_KEYUP nVirtKey:'C' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000004> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<000005> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 

私がここで間違って何をしていているのですか?

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);  

const int WM_KEYDOWN = 0x100; 
const int WM_KEYUP = 0x101; 
const Int32 WM_CHAR = 0x0102; 

IntPtr val = new IntPtr((Int32)'c'); 
PostMessage(WindowHandle, WM_KEYDOWN, (IntPtr)(val - 0x020), new IntPtr(0)); 
PostMessage(WindowHandle, WM_CHAR,  (IntPtr)val, new IntPtr(0)); 
PostMessage(WindowHandle, WM_KEYUP,  (IntPtr)(val - 0x020), new IntPtr(0)); 
+0

「cc」が送信され、spy ++出力が間違って表示されます。私はlParamを正しく理解する必要があります。それは私がC#/デスクトップ開発の初心者として私には全く外国人だと思います。 – jamie

+0

私はSpy ++のLparamとWparamを持っていますが、それらの使い方はわかりません! PostMessage(WindowHandle、WM_KEYDOWN、(IntPtr)(00000041)、(IntPtr)(001E0001)); PostMessage(WindowHandle、WM_CHAR、(IntPtr)(00000061)、(IntPtr)(001E0001)); PostMessage(WindowHandle、WM_KEYUP、(IntPtr)(00000061)、(IntPtr)(C01E0001)); – jamie

+0

PostMessage(WindowHandle、WM_KEYDOWN、(IntPtr)(0x00000041)、(IntPtr)(0x001E0001)); PostMessage(WindowHandle、WM_CHAR、(IntPtr)(0x00000061)、(IntPtr)(0x001E0001)); PostMessage(WindowHandle、WM_KEYUP、(IntPtr)(0x00000061)、(IntPtr)(0xC01E0001)); これは私にアルゴリズムのオーバーフローをもたらします。 – jamie

答えて

1

これを実証しました。私が必要としたのは以下のものでした!

char Letter = 'a'; 
PostMessage(WindowHandle, WM_CHAR, (IntPtr)Letter, new IntPtr(0)); 
関連する問題