模拟按键c#

时间:2010-06-15 17:05:19

标签: c#

我想在我的c#程序中模拟 F5 按键,当IE打开时我希望能够自动刷新我的网站,我不知道从哪里开始。

感谢,

达尼。

8 个答案:

答案 0 :(得分:53)

这是一个例子......

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

答案 1 :(得分:9)

您可以使用Win32 API FindWindowFindWindowEx查找打开的浏览器的窗口句柄,然后使用SendMessage拨打WM_KEYDOWN。通常,最简单的方法是将窗口标题传递给FindWindowEx并让它为您找到相关的窗口句柄。

如果您通过Process process对象自行启动浏览器处理,则可以使用process.MainWindowHandle而不是调用FindWindowEx

当您想要开始使用其他窗口时,Spy ++是一个非常有用的工具。它基本上允许您学习另一个程序的UI元素层次结构。您还可以监控进入您正在监控的窗口的所有消息。我在this thread中有更多信息。

F5击键有这个虚拟键码:

const int VK_F5 = 0x74;

C#中FindWindowEx的p / invoke签名是:

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

您可以像这样调用(引入)Win32 API SendMessage

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

回顾一下,在上面的代码中,您可以直接从C#代码中调用FindWindowExFindWindowEx将返回一个窗口句柄。然后,一旦有了窗口句柄,就可以向窗口发送任何击键,或者在窗口句柄上调用许多其他Win32 API调用。甚至可以通过使用FindWindowEx的另一个电话来查找子窗口。例如,您可以选择浏览器的编辑控件,然后更改它的文本。

如果所有其他方法都出错并且您认为您正在向窗口发送正确的密钥,则可以使用spy++查看手动将焦点设置到浏览器并手动按下时向窗口发送的消息F5

答案 2 :(得分:5)

简单的一个,在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);

注意:

  1. 添加InputSimulator作为参考。要下载Click here

  2. 找到Class&窗口名称,使用WinSpy ++。要下载Click here

答案 3 :(得分:4)

模拟 F5 按键的另一种方法是在Window Forms应用程序中简单地托管WebBrowser控件。您使用WebBrowser.Navigate方法加载网页,然后使用标准Timer,并在计时器的每个刻度上重新导航到将重新加载页面的网址。

答案 4 :(得分:4)

将KeyStrokes发送(模拟)到任何窗口的最简单方法是使用.NET Framework的SendKeys.Send方法。

查看这篇非常直观的MSDN文章http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx


特别是对于您的情况,如果您的浏览器窗口是焦点,发送F5只会涉及以下代码行:

SendKeys.Send("{F5}");

答案 5 :(得分:2)

当您只是试图让页面回发时,不是强制 F5 按键,而是可以根据JS事件调用回发(如果你想让它发射,可以调用mousemove或timer_tick)每时每刻)。使用http://weblogs.asp.net/mnolton/archive/2003/06/04/8260.aspx处的代码作为参考。

答案 6 :(得分:1)

简单,简短,无需窗口焦点:

另外here 虚拟密钥代码

的有用列表
        [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);
        }

答案 7 :(得分:0)

使用mouse_event或keybd_event。他们说不再使用它们,但您根本不必找到窗口。

using System;
using System.Runtime.InteropServices;

public class SimulatePCControl
{

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void keybd_event(uint bVk, uint bScan, uint dwFlags, uint dwExtraInfo);

private const int VK_LEFT = 0x25;

public static void LeftArrow()
{
    keybd_event(VK_LEFT, 0, 0, 0);
}

}

此处的虚拟密钥代码为:http://www.kbdedit.com/manual/low_level_vk_list.html

也适用于鼠标:

using System.Runtime.InteropServices;
using UnityEngine;

public class SimulateMouseClick
{
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
//Mouse actions
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;

public static void Click()
{
    //Call the imported function with the cursor's current position
    uint X = (uint)0;
    uint Y = (uint)0;
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
    Debug.LogError("SIMULATED A MOUSE CLICK JUST NOW...");
}

//...other code needed for the application
}