6

プログラムがバックグラウンドで実行されている場合でも、キーストロークをプログラムに送信したい。しかし、私はこのようなメモ帳に対してのみこれを行うことができます、

[DllImport("user32.dll")]
protected static extern byte VkKeyScan(char ch);

[DllImport("user32.dll", SetLastError = true)]
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

char Key = // key value to send

IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null);   // _handle is the windows handle of the program (here its notepad)
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0);

しかし、他のすべてのアプリケーションでは、バックグラウンドでキーストロークを送信することはできません。そのプログラムの名前がわからないのでlpszClass(これはそのプログラムの入力領域のuserControl名だと思います。メモ帳の場合はそうです"edit"。このサーフィンインターネットを見つけました)。

私が行っている他のすべてのアプリケーションの場合、アプリケーションをフォアグラウンドに移動し、キーを送信してから、プログラムをフォアグラウンドに戻します。プログラムを常にフォアグラウンドで実行する必要があります。

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

SetForegroundWindow(_handle);       // _handle is the windows handle of the program

System.Threading.Thread.Sleep(50);       // Waiting few milliseconds till application coming to foreground.                    
wsh.SendKeys(Key.ToString(), ref wait);  // wsh is WshShellClass wsh= new WshShellClass();
SetForegroundWindow(_mainHandle);    // _mainHandle is the windows handle of my application

しかし、この方法は機能していません。いくつかのキーが見落とされ、プログラムの前景->背景->前景->背景......ダンスのように...

バックグラウンドで実行されている場合に他のアプリケーションにキーを送信する方法。lpszClassまたは、プログラムを見つける方法/ソースはありますか?

必要な情報を見逃してしまった場合は申し訳ありません。これは大きなアプリケーションです。ここに必要な部品だけを掲載しました。誰かが追加情報を必要とする場合、plsは尋ねます。

4

2 に答える 2

3

私は、バックグラウンドプログラムにwin32関数SetWindowsHookEx()を介して低レベルのキーボードフックをインストールさせる必要があると思います。

SetWindowsHookEX()のMSDNドキュメントは次のとおりです。

http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

そして、これがC#からそれを行う方法に関するKB記事です

http://support.microsoft.com/kb/318804

この記事も詳細に説明しています:http://www.codeguru.com/columns/vb/article.php/c4829

ただし、あなたのアプリは、キーボードロガーとしてさまざまなスパイウェア/ウイルス対策ソフトウェアに捕らえられると思います。

幸運を。

于 2011-01-13T18:38:03.650 に答える
2

WinSpy++lpszClassなどの検査ツールを使用して、プログラムの内容を把握できる場合があります。目的のコントロールにドラッグして配置できる十字線が表示されます。これにより、メモ帳の「編集」クラス名を簡単に提供できました。

うまくいかない場合は、WinSpy++ の右下にある [More>>] ボタンをクリックし、次に [Locate] ボタンをクリックしてコントロール階層を表示します。代わりに、親または子コントロールのいずれかに WM_KEYDOWN メッセージをポストする必要がある場合があります。

于 2011-01-13T18:41:02.877 に答える