PostMessage到当前活动进程不适用于所有进程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostMessage到当前活动进程不适用于所有进程?相关的知识,希望对你有一定的参考价值。

我有这个代码:

    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时,它仅适用于某些进程,如text editos,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上我得到空行..

答案

在Windows应用程序中有多种方法可以读取键盘状态,并且响应WM_KEYDOWNWM_KEYUP只是其中之一。应用程序也可以使用GetKeyStateGetAsyncKeyState。应用程序还可以响应WM_CHARWM_SYSKEYDOWNWM_SYSKEYUP消息。不同的应用程序将使用不同的方法,如果您没有模拟应用程序正在寻找的方法,它将不会响应。

您遇到的问题与Raymond关联的问题中提出的问题略有不同,但解决方案可能相同。即使用SendInput而不是PostMessage

以上是关于PostMessage到当前活动进程不适用于所有进程?的主要内容,如果未能解决你的问题,请参考以下文章

类型活动中的方法 startactivity(intent,bundle) 不适用于参数 (int,intent)

Android 杀掉当前程序的进程

TerminateProcess 不适用于已验证的进程 ID

hook时如何获得当前进程各

自动缩放到当前位置不适用于特定区域

使用重定向输入和输出的 C++ 进程间通信不适用于发布版本