发送给当前活动进程的PostMessage并不是对所有进程都有效

本文关键字:进程 有效 并不是 PostMessage 活动进程 | 更新日期: 2023-09-27 18:11:04

我有这样的代码:

    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时,它只适用于某些进程,如文本编辑器,visual studio等进程。

但不能在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上我得到空行…

发送给当前活动进程的PostMessage并不是对所有进程都有效

在Windows应用程序中有多种读取键盘状态的方法,响应WM_KEYDOWNWM_KEYUP只是其中之一。应用程序也可以使用GetKeyState或GetAsyncKeyState。应用程序也可以响应WM_CHAR, WM_SYSKEYDOWN和WM_SYSKEYUP消息。不同的应用程序会使用不同的方法,如果你不是模拟应用程序正在寻找的方法,它将不会响应。

你遇到的问题与Raymond提到的问题略有不同,但解决方案可能是一样的。即使用SendInput而不是PostMessage