C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DirectInputでも認識できる自動キー入力について


(過去ログ 41 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■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#で出来なければ他の言語でも構わないので、案がある方は助言よろしくお願いします<(_ _)>
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -