9

Stackoverflowとgoogleについて多くの調査を行った結果、ハンドルを使用してキーストロークの組み合わせをバックグラウンドウィンドウに送信するのは難しいようです。たとえば、CTRL + Fを送信したいのですが、Sendmessageが機能していないようで、ウィンドウにフォーカスが必要なため、sendinputは効果的ではありません。

だから私の最後の考えはフックについてです:とにかくその方法を使用して組み合わせを送信することはありますか?

4

2 に答える 2

8

回避策を見つけましたが、すべてのアプリケーションで機能するとは限りません。それ以外の場合は、キーストロークの組み合わせで制御したいプログラムであるpuTTYで動作します。また、アプリケーションがフォーカスされていなくても機能します。これで完了です。

class SendMessage
{
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public static void sendKeystroke()
{
    const uint WM_KEYDOWN = 0x100;
    const uint WM_KEYUP = 0x0101;

    IntPtr hWnd;
    string processName = "putty";
    Process[] processList = Process.GetProcesses();

    foreach (Process P in processList)
    {
        if (P.ProcessName.Equals(processName))
        {
            IntPtr edit = P.MainWindowHandle;
            PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.Control), IntPtr.Zero);
            PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.A), IntPtr.Zero);
            PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.Control), IntPtr.Zero);
        }
    }                           
}

}
于 2012-10-15T20:43:22.803 に答える
5

キーストロークをバックグラウンドウィンドウに送信するプログラムをいくつか作成しましたが、通常はPostMessage/SendMessageを実装しました。私はここにすべての発見を文書化しました!

ただし、基本的には、低レベルのc呼び出しを使用して、メッセージをWindowsメッセージキューに入れ、アプリケーションがキーの押下を検出できるようにします。

PostMessage

メッセージを送る

ご不明な点がありましたらお知らせください。私のライブラリはC#で記述されており、喜んで共有させていただきます。この方法では、バックグラウンドウィンドウでのマウスの使用も可能です:)

すべてのコードがGitHubにチェックインされました:https ://github.com/EasyAsABC123/Keyboard

于 2013-01-22T18:48:11.163 に答える