c#を使用してバックグラウンドにある場合でも、キーストロークをプログラムに送信します

StackOverflow https://stackoverflow.com/questions/4683649

質問

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

[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

しかし、この方法は機能していません。いくつかのキーが見逃され、プログラムは前景 - > background-> foregound-> background ......その踊りのように...

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

必要な情報を見逃した場合は申し訳ありません。これは大きなアプリケーションです。ここに必要な部品のみを投稿しました。誰かが追加情報が必要な場合、plsは尋ねます。

役に立ちましたか?

解決

あなたはそれを理解できるかもしれません lpszClass 次のような検査ツールを使用したプログラムの winspy ++. 。それはあなたがあなたが望ましいコントロールの上にドラッグして配置できる十字線を与えます。これにより、メモ帳の「編集」クラス名を簡単に提供できました。

物事が機能していない場合は、winspy ++の右下にある「more >>」ボタンをクリックし、[locate]ボタンをクリックしてコントロール階層を表示します。代わりに、wm_keydownメッセージを親または子のコントロールのいずれかに投稿する必要がある場合があります。

他のヒント

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

ただし、アプリは、キーボードロガーとしてさまざまなスパイウェア/アンチウイルスソフトウェアにキャッチされると思います。

幸運を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top