Можно ли использовать SendKeys для конкретного приложения c без SetForegroundWindow? - PullRequest
0 голосов
/ 09 мая 2020

Во время работы на главном экране я хочу отправить команду правой кнопкой мыши на 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}");
    }
}

1 Ответ

0 голосов
/ 09 мая 2020

Щелчок - это WM_KEYDOWN и WM_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.Right для клавиши со стрелкой Right, а не для щелчка правой кнопкой мыши, вы должны использовать Keys.RButton вместо

Вот Список кодов клавиш и дополнительная информация о Клавиши в win32

...