Имитация нажатия клавиш c # - PullRequest
35 голосов
/ 15 июня 2010

Я хочу смоделировать F5 нажатие клавиши в моей программе c #, Когда IE открыт, я хочу иметь возможность автоматически обновлять мой сайт, и я не знаю, с чего начать.

Дани.

Ответы [ 7 ]

54 голосов
/ 15 июня 2010

Вот пример ...

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

    [STAThread]
    static void Main()
    {
        while(true)
        {
            Process [] processes = Process.GetProcessesByName("iexplore");

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

            Thread.Sleep(5000);
        }
    }
}

лучше ... меньше раздражает ...

static class Program
{
    const UInt32 WM_KEYDOWN = 0x0100;
    const int VK_F5 = 0x74;

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

    [STAThread]
    static void Main()
    {
        while(true)
        {
            Process [] processes = Process.GetProcessesByName("iexplore");

            foreach(Process proc in processes)
                PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_F5, 0);

            Thread.Sleep(5000);
        }
    }
}
9 голосов
/ 15 июня 2010

Вы можете использовать Win32 API FindWindow или FindWindowEx , чтобы найти дескриптор окна открытого браузера, а затем просто вызвать SendMessage с WM_KEYDOWN .Обычно проще всего передать заголовок окна на FindWindowEx и найти для него соответствующий дескриптор окна.

Если вы запускаете процесс браузера самостоятельно с помощью объекта Process process, тогда вы можете использовать process.MainWindowHandle вместо вызова FindWindowEx.

Spy ++ - очень полезный инструмент, когда вы хотите начать работать с другими окнами.Это в основном позволяет вам изучить иерархию элементов пользовательского интерфейса другой программы.Вы также можете отслеживать все сообщения, которые появляются в окне, которое вы отслеживаете.У меня есть дополнительная информация в этой теме .

Клавиша F5 имеет следующий код виртуальной клавиши:

const int VK_F5 = 0x74;

Подпись p / invoke для FindWindowEx в C # -:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

Вы можете p / вызывать (вводить) Win32 API SendMessage следующим образом:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

Итак, скажем, вы вызываете FindWindowEx прямо из вашего C #код после того, как приведенный выше код где-то внутри вашего класса.FindWindowEx вернет дескриптор окна.Затем, когда у вас есть дескриптор окна, вы можете отправить любое нажатие клавиши в окно или вызвать множество других вызовов Win32 API для дескриптора окна.Или даже найдите дочернее окно, используя другой вызов FindWindowEx.Например, вы можете выбрать даже элемент управления редактирования браузера, а затем изменить его текст.

Если все остальное идет не так и вы думаете, что отправляете правильный ключ в окно, вы можете использовать spy++, чтобы увидеть, какие сообщения отправляются окну, когда вы вручную устанавливаете фокус на браузер и вручнуюнажмите F5.

5 голосов
/ 06 мая 2015

Простой, добавить перед Main

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

Код внутри Main / Метод:

string className = "IEFrame";
string windowName = "New Tab - Windows Internet Explorer";
IntPtr IE = FindWindow(className, windowName);
if (IE == IntPtr.Zero)
{
   return;
}
SetForegroundWindow(IE);
InputSimulator.SimulateKeyPress(VirtualKeyCode.F5);

Примечание:

  1. Добавить InputSimulator в качестве ссылки. Чтобы загрузить Нажмите здесь

  2. Чтобы найти имя класса и окна, используйте WinSpy ++. Для загрузки Нажмите здесь

4 голосов
/ 15 июня 2010

Самый простой способ отправлять (имитировать) нажатия клавиш в любое окно - это использовать метод SendKeys.Send .NET Framework.

Оформить эту интуитивно понятную статью MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx


Специально для вашего случая, если окно вашего браузера находится в фокусе, отправка F5 будет просто включать следующую строку кода:

SendKeys.Send("{F5}");
4 голосов
/ 15 июня 2010

Другой альтернативой имитации нажатия клавиши F5 может быть просто размещение элемента управления WebBrowser в приложении Window Forms. Вы используете WebBrowser.Navigate метод для загрузки вашей веб-страницы, а затем используете стандартный Таймер , и на каждом тике таймера вы просто повторно переходите к URL, который перезагрузит страницу .

2 голосов
/ 15 июня 2010

Вместо принудительного нажатия клавиши F5 , когда вы просто пытаетесь вернуть страницу назад, вы можете вызвать обратную передачу на основе события JS (даже mousemove или timer_tick, если вы хотите, чтобы она запускала все время). Используйте код http://weblogs.asp.net/mnolton/archive/2003/06/04/8260.aspx для справки.

1 голос
/ 14 июня 2018

Простая, короткая и не нужная фокусировка окна:

Также здесь полезный список кодов виртуальных клавиш

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

        private void button1_Click(object sender, EventArgs e)
        {
            const int WM_SYSKEYDOWN = 0x0104;
            const int VK_F5 = 0x74;

            IntPtr WindowToFind = FindWindow(null, "Google - Mozilla Firefox");

            PostMessage(WindowToFind, WM_SYSKEYDOWN, VK_F5, 0);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...