■21628 / inTopicNo.1) |
DirectInputでも認識できる自動キー入力について |
□投稿者/ yus (3回)-(2008/07/06(Sun) 18:30:00)
|
分類:[C#]
あるアプリケーションにキーボードの入力をC#を用いて送信したいと考えています。 SendInput、PostMessage、SendMessageを使って対象のアプリにキー入力を送信してみたのですが、 全く反応しないので困っています。
そこで、C#でManagedDirectXのDirectInputを用いて実験してみたところ、こちらでも反応していないことが 分かりました。 なので、質問は「DirectInputにも反応するキー入力をプログラムから送信する方法は無いか?」です。
〜自分がやってみたことについて〜
キー入力の判定には、以下のサイトの「KeyboardHook3.cs」を使って、グローバルフックをしています。 http://hongliang.seesaa.net/article/7539988.html
SendInputに関しては、以下のサイトにある「SendKeys名前空間の、SendKeysクラス」を使っています。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42587&forum=7
PostMessage、SendMessageに関しては ----------------------------------------------------------------------------------------------- [DllImport("user32.dll")] private extern static int PostMessage(IntPtr hwnd, IntPtr wMsg, IntPtr wParam, uint lParam);
private const int WM_KEYDOWN = 0x100; private const int WM_KEYUP = 0x101;
uint param1 = 0x002E0001; uint param2 = 0xC02E0001;
PostMessage((IntPtr)handle, (IntPtr)WM_KEYDOWN, (IntPtr)SendKeys.SendKeys.wVk.VK_C, param1); Thread.Sleep(50); PostMessage((IntPtr)handle, (IntPtr)WM_KEYUP, (IntPtr)SendKeys.SendKeys.wVk.VK_C, param2); ----------------------------------------------------------------------------------------------- このように使用しました。SendMessageにするときは、定義と呼び出し名を変えただけです。
SendInput、Post(Send)Messageいずれに関しても、DirectInputで識別しているわけではないアプリに関して (メモ帳等)はきちんとキー入力の送信が出来ています。 また、spy++を用いて、実際にキーを入力したときと全く同じメッセージが対象のアプリに送信されている ことを確認しました(PostMessageでしか全く同じメッセージを送ることが出来ませんでした)。 以下に「c」を押したときに、spy++の出力を示します。
メッセージ1・・・<(番号)> (ハンドル) P WM_KEYDOWN nVirtKey:'C' cRepeat1 ScanCode:2E fExteded:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000043 lParam:002E0001 time:(時間) point:(ポイント)
メッセージ2・・・<(番号)> (ハンドル) P WM_CharCode:'0063'(99) cRepeat1 ScanCode:2E fExteded:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000063 lParam:002E0001 time:(時間) point:(ポイント)
メッセージ3・・・<(番号)> (ハンドル) P WM_KEYUP nVirtKey:'C' cRepeat1 ScanCode:2E fExteded:0 fAltDown:0 fRepeat:0 fUp:1 [wParam:00000043 lParam:C02E0001 time:(時間) point:(ポイント)
PostMessageでは全く同じメッセージを送信できています。 SendMessageでは、timeとpointの値が存在しません。 SendInputでは、time、point共に存在しますが、ScanCodeが00になり、lParamもキーダウン時は00000001、 アップ時はC0000001となっていて、実際の入力時のメッセージとは異なります。
この結果からPostMessageでも機能しないということは、やはりDirectInputでも認識できるようにしないと いけないのではないかと考えました。
C#で出来なければ他の言語でも構わないので、案がある方は助言よろしくお願いします<(_ _)>
|
|