web-dev-qa-db-ja.com

Sendkey関数を使用してキーを別のアプリケーションに送信するC#

特定のキー(kなど)をnotepadという名前の別のプログラムに送信したいのですが、使用したコードは次のとおりです。

void sendkey ()
{
    [DllImport ("User32.dll")]
    static extern int SetForegroundWindow(IntPtr point);

    Process p = Process.GetProcessesByName("notepad")[0];
    IntPtr pointer = p.Handle;
    SetForegroundWindow(pointer);
    SendKeys.Send("k");
}

しかし、コードは機能しません。コードの何が問題になっていますか?

編集済み:アクティブなウィンドウにするために、メモ帳なしでメモ帳に「K」を送信することは可能ですか? (例:アクティブウィンドウ=「Googleクロム」、メモ帳は背景にあります。これは、バックグラウンドアプリケーションにキーを送信することを意味します)

25
User2012384

メモ帳が既に起動している場合は、次のように記述する必要があります。

// import the function in your class
[DllImport ("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);

//...

Process p = Process.GetProcessesByName("notepad").FirstOrDefault();
if( p != null)
{
    IntPtr h = p.MainWindowHandle;
    SetForegroundWindow(h);
    SendKeys.SendWait("k");
}

GetProcessesByName はプロセスの配列を返すため、最初のプロセスを取得する(または必要なプロセスを見つける)必要があります。

notepadを起動してキーを送信する場合は、次のように記述する必要があります。

Process p = Process.Start("notepad.exe");
p.WaitForInputIdle();
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("k");

コードが機能しない唯一の状況は、notepadが管理者として起動され、アプリケーションが起動されない場合です。

45