Подтвердить что ты не робот

Имитационное нажатие клавиши С#

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

спасибо,

Дани.

4b9b3361

Ответ 1

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

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);
        }
    }
}

Ответ 2

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

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

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

Ключ F5 имеет этот виртуальный key code:

const int VK_F5 = 0x74;

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

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

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

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

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

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

Ответ 3

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

Ответ 4

Простой, добавьте перед 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/Method:

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);

Примечание:

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

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

Ответ 5

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

Ответ 6

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

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


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

SendKeys.Send("{F5}");