| 
          
            □投稿者/ yus (3回)-(2008/07/06(Sun) 18:30:00)
              | ■21628 / inTopicNo.1) | DirectInputでも認識できる自動キー入力について |  
 
          
            
              
                |  | 分類:[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#で出来なければ他の言語でも構わないので、案がある方は助言よろしくお願いします<(_ _)>
 
 |  |