我想在我的c#程序中模拟 F5 按键,当IE打开时我希望能够自动刷新我的网站,我不知道从哪里开始。
感谢,
达尼。
答案 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 FindWindow
或FindWindowEx查找打开的浏览器的窗口句柄,然后使用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#代码中调用FindWindowEx
。 FindWindowEx
将返回一个窗口句柄。然后,一旦有了窗口句柄,就可以向窗口发送任何击键,或者在窗口句柄上调用许多其他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);
注意:
添加InputSimulator作为参考。要下载Click here
找到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
}