首页 > 解决方案 > 是否可以在没有 SetForegroundWindow 的情况下将 SendKeys 用于特定应用程序?

问题描述

在主屏幕上工作时,我想向 Firefox 发送一个右键单击命令,该命令在第二个垂直屏幕上打开。但我不希望 Firefox 在我发送命令时激活。我试过了,但没有用:

const uint WM_KEYDOWN = 0x0100;
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
    var processes = Process.GetProcessesByName("firefox");
    foreach (var proc in processes)
    {
        PostMessage(proc.MainWindowHandle, WM_KEYDOWN, (int)Keys.Right, 0);
        // I have to use SendKeys.SendWait for the messages to be processed.
        SendKeys.SendWait("{RIGHT}");
    }
}

这可行,但每次我发送命令时,Firefox 都会激活。SetForegroundWindow当我禁用该方法时它不起作用。

[DllImport("User32.dll")]
private static extern int SetForegroundWindow(IntPtr ptr);
private void button1_Click(object sender, EventArgs e)
{
     var p = Process.GetProcessesByName("firefox").FirstOrDefault();
    if (p != null)
    {
        IntPtr h = p.MainWindowHandle;
        SetForegroundWindow(h);
        SendKeys.SendWait("{RIGHT}");
    }
}

标签: c#sendkeys

解决方案


点击是一个WM_KEYDOWNWM_KEYUP。您可以尝试使用第一种方法调用函数吗

 foreach (var proc in processes)
    {
        PostMessage(proc.MainWindowHandle, WM_KEYDOWN, (int)Keys.RButton, (IntPtr)0x001E0001);
        PostMessage(proc.MainWindowHandle, WM_KEYUP, (int)Keys.RButton, (IntPtr)0xC01E0001);
        // I have to use SendKeys.SendWait for the messages to be processed.
        SendKeys.SendWait("{RIGHT}");     //I dont believe you need this with the above approach
    }

WM_CONTEXTMENU如果这是您所追求的,您也可以尝试发送消息

我还必须指出,这Keys.RightRight箭头键而不是鼠标右键,您应该Keys.RButton使用

这是Win32 中 KeyStrokes的 KeyCodes 列表和更多信息


推荐阅读