0

私はこのコードを持っています:

    const UInt32 WM_KEYDOWN = 0x0100;

    const int VK_DOWN = 0x28;
    const int VK_UP = 0x26;

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    private static Process GetProcessByHandle(IntPtr hwnd)
    {
        try
        {
            uint processID;
            GetWindowThreadProcessId(hwnd, out processID);
            return Process.GetProcessById((int)processID);
        }
        catch { return null; }
    }

    public static Process GetActiveProcess()
    {
        IntPtr hwnd = GetForegroundWindow();
        return hwnd != null ? GetProcessByHandle(hwnd) : null;
    }

    public static void KeyUp()
    {
        PostMessage(GetActiveProcess().MainWindowHandle, WM_KEYDOWN, VK_UP, 0);
    }

    public static void KeyDown()
    {
        PostMessage(GetActiveProcess().MainWindowHandle, WM_KEYDOWN, VK_DOWN, 0);
    }

KeyUp/KeyDown を呼び出すと、一部のプロセス、テキスト編集、ビジュアル スタジオなどのプロセスでのみ機能します。

ただし、Explorer.exe、iTunes.exe、Chrome.exe、Outlook.exe、FileZilla.exe などでは動作しません..

コンソールでデバッグを実行しました:

    while (true)
    {
        Process currentProcess = GetActiveProcess();
        if (currentProcess != null)
            Console.WriteLine(currentProcess.MainWindowTitle);
        Thread.Sleep(1000);
    }

ここで、いくつかのアプリケーションから得たもの:

ProjName - Microsoft Visual Studio (Administrator)
?PostMessage to Current Active Proccess doesn't work for all proccess ? - StackOverFlow - Google Chrome?
FileZilla
Inbox - Outlook Data File - Microsoft Outlook

そして Explorer.exe で空の行が表示されます..

4

1 に答える 1

3

Windows アプリケーションでキーボードの状態を読み取る方法は複数あり、 と への応答WM_KEYDOWNWM_KEYUPその 1 つにすぎません。アプリケーションはGetKeyStateまたはGetAsyncKeyStateも使用できます。アプリケーションは、WM_CHARWM_SYSKEYDOWN、およびWM_SYSKEYUPメッセージにも応答できます。アプリケーションが異なれば、使用するメソッドも異なります。アプリケーションが探しているものをシミュレートしていない場合、アプリケーションは応答しません。

あなたが抱えている問題は、レイモンドがリンクした質問で提起されたものとは少し異なりますが、解決策は同じかもしれません. つまり、PostMessageの代わりに SendInputを使用する

于 2011-10-12T17:24:59.450 に答える