Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当前活动进程的PostMessage不';不适用于所有流程?_C#_Winapi_Process_Desktop_User32 - Fatal编程技术网

C# 当前活动进程的PostMessage不';不适用于所有流程?

C# 当前活动进程的PostMessage不';不适用于所有流程?,c#,winapi,process,desktop,user32,C#,Winapi,Process,Desktop,User32,我有以下代码: 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")

我有以下代码:

    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、visualstudio

但不适用于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\u KEYDOWN
WM\u keydup
只是其中之一。应用程序也可以使用或。应用程序还可以响应、和消息。不同的应用程序将使用不同的方法,如果您不模拟应用程序正在寻找的方法,它将不会响应


你遇到的问题与雷蒙德所联系的问题略有不同,但解决方案可能是相同的。也就是说,在Windows应用程序中,有多种方法可以读取键盘状态,而对
WM_KEYDOWN
WM_keydup
的响应只是其中之一。应用程序也可以使用或。应用程序还可以响应、和消息。不同的应用程序将使用不同的方法,如果您不模拟应用程序正在寻找的方法,它将不会响应


你遇到的问题与雷蒙德所联系的问题略有不同,但解决方案可能是相同的。也就是说,除了
WM\u KEYDOWN
之外,还可以尝试发送
WM\u SYSKEYDOWN
,而不是使用PostMessage

可能重复的@Danpe。这可能适用于大多数应用程序。@除了
WM\u KEYDOWN
之外,请尝试发送
WM\u SYSKEYDOWN
。这可能适用于大多数应用程序。