C# / Отправить комбинацию клавиш (CTRL + S) в другое окно - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь отправить комбинацию клавиш в другую программу вроде этой:

// keydown ctrl
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_CONTROL, (IntPtr)0x001D0001); 
// keydown S
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_S, (IntPtr)0x001F0001); 
SendMessage(windowBracketsKeyListener, 0x102, (IntPtr)115, (IntPtr)0); 
// keyup ctrl 
SendMessage(windowBracketsKeyListener, 0x101, (IntPtr)VK_CONTROL, (IntPtr)0xC01D0001); 

В последней строке у меня ошибка (см. Изображение ниже).

Я отправляю те же команды, что и в Spy ++. Итак, сначала я автоматически попытался нажать CTRL + S в окне, затем проверил, что получаю в Spy ++, и написал те же команды.

Ошибка:

System.OverflowException: 'Arithmetic operation resulted in an overflow.'
  • Хорошо, я использую не Spy ++, а, если честно, Window Detective.

Image with my commands, commands from Window Detective and received error

1 Ответ

1 голос
/ 28 мая 2020

Нет особого смысла подделывать сообщения WM_KEYDOWN/WM_KEYUP, отправляйте только те сообщения, которые они сгенерировали. Только два сообщения WM_CHAR.

Пожалуйста, используйте вместо него метод SendKeys.Send (String) .

Чтобы указать, что любая комбинация SHIFT, CTRL и ALT должна удерживаться в течение нескольких при нажатии других клавиш заключите код этих клавиш в скобки. Например, чтобы указать удерживать нажатой клавишу SHIFT, пока нажаты E и C, используйте «+ (E C)». Чтобы указать, чтобы удерживать SHIFT при нажатой E, а затем C без SHIFT, используйте «+ E C».

У меня работает следующий пример:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test
{
    static class Program
    {
        [DllImport("user32.dll")]
        public static extern int SetForegroundWindow(IntPtr hWnd);
        static void Main()
        {

            Process[] processes = Process.GetProcessesByName("notepad"); //notepad used be test

            foreach (Process proc in processes)
            {
                SetForegroundWindow(proc.MainWindowHandle);
                SendKeys.SendWait("^(s)");
            }
        }
    }
}
...