3

レガシ プログラムでマウスがクリックされたときのキーストロークをシミュレートするにはどうすればよいですか。ノート!プログラムは、マウスがクリックされたことを認識していない可能性があります

私は実験しています

 IntPtr module = LoadLibrary("user32.dll");
 _mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0);

から -1 を返すようにテストしHookProcます。ただし、そうするときはSendInput、入力をアプリケーションに送信しないでください。から結果を返すと CallNextHookExSendInput動作しますが、マウス クリックはレガシー アプリケーションに送信されます。

バックグラウンド

特別なキーボードで制御されるプログラムがあります。キーボードのキーを押すと、ESC と文字のシーケンスが送信されます。次に、プログラムは、マウスが画面上に置かれたものに基づいて操作を実行します。

この特別なキーボードがなくてもアプリケーションを制御できるように、オンスクリーン キーボードを開発しています。ユーザーは、マウスでスクリーン キーボードのボタンを選択します。次に、コマンドを送信したいオブジェクトにマウス ポインタを移動し、もう一度クリックします。ただし、マウスクリックはプログラムに渡されない可能性があり、プログラムはマウスクリックで別の操作を実行します。

4

3 に答える 3

2

考えられる方法の 1 つとして、単純な SendMessage を使用して、任意のウィンドウ メッセージをターゲット ウィンドウに直接送信できます。外部アプリケーションのウィンドウで使用できます。(ただし、この関数を使用するには、ターゲット ウィンドウのハンドルを見つける必要があります)。このようにして、キーボードとマウスのイベントも送信できます。

マウスイベントを無視することはより困難です。そのウィンドウをサブクラス化する必要があります。つまり、独自のカスタム ウィンドウ プロシージャをアタッチして、ウィンドウ メッセージをフィルター処理する必要があります。これを実現するには、制御されたプロセスに DLL を挿入する必要があります。
全体的なタスクは非常に複雑で、コピーして貼り付けることができる単純なコード スニペットではありません。

于 2012-05-22T07:26:06.343 に答える
0

スクリーン キーボード アプリケーションがレガシー アプリケーションとは別のプロセスである場合は、かなり簡単です。

キーボード アプリでは、ユーザーがどのキーをクリックしたかがわかります。そのため、SendMessage() API を使用して、この情報をレガシー アプリに渡すだけです。

物理キーボードが ESC と文字を送信するということですか? そのため、コマンド シーケンスに対するキーボード キーのある種のルックアップ テーブルが必要になります。

また、FindWindow()/FindWindowEx() API を使用して実行できるレガシー アプリケーションの HWND を取得する必要があります。アプリには、これを簡単にする一意のカスタム クラス名があると思います。

ここで SendMessage() を使用してコマンド シーケンス文字を送信する方法の詳細:

「SendMessage」でアプリケーションのキーストロークを送信する (vb.net)

于 2012-05-27T11:40:31.663 に答える
0

あなたが何を求めているのか理解できたら、MouseClick イベントのコードまたは System.Windows.Form.SendKeys -> Send({KeyBoardKey}) を使用したスクリプトで SendKeys を実行できます。

ドキュメント : http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

于 2012-05-23T14:53:43.913 に答える