alert/confirm等javascript函数产生的对话框是标准的windows对话框,例如
通过HOOK对话框的初始化消息WM_INITDIALOG,检测其标题是否为“来自网页的消息”(英文系统需要匹配项文字符串)(因为钩子是针对主线程的,不会捕获到其它进程的消息,如IE的),然后找到“确定”按钮,通过发送按钮的命令消息来模拟点击“确定”按钮,来实现自动关闭。其中,对话框中显示的消息也在一个window中,可以通过字符串匹配来找到,安装HOOK函数的方法与showModalDialog相同,只是处理的消息不同
private static Int32 WH_CALLWNDPROCRET_PROC(Int32 iCode, IntPtr pWParam, IntPtr pLParam)
{
if (iCode return CallNextHookEx(_pWH_CALLWNDPROCRET, iCode, pWParam, pLParam);
CWPRETSTRUCT cwp = (CWPRETSTRUCT)
Marshal.PtrToStructure(pLParam, typeof(CWPRETSTRUCT));
Win32Message msg = Win32Message.WM_NULL;
try {
msg = (Win32Message)cwp.message;
} catch {
return CallNextHookEx(_pWH_CALLWNDPROCRET, iCode, pWParam, pLParam); ;
}
if (msg == Win32Message.WM_INITDIALOG) { //
// A dialog was initialized, find out what sort it was via it's Caption text
string caption = GetWindowText(cwp.hwnd);
// 此处从配置文件中读取需要自动关闭的窗口,配置文件中一行为一项格式为
// titile | message | button
// 先匹配title再匹配message,匹配上后查找button,然后发送消息点击按钮
const string AUTO_CLOSE_CONFIG_FILE = "autoclose.config";
FileInfo fi = new FileInfo(AUTO_CLOSE_CONFIG_FILE);
if (_autoCloseList == null && fi.Exists) {
try {
noock.log.DefaultLogger.Logger.Info("[Auto-closing]Loading config: {0} ...", AUTO_CLOSE_CONFIG_FILE);
_autoCloseList = new List<alertwindowinfo>(); <br> using (FileStream fs = new FileStream(fi.ToString(), FileMode.Open)) { <br> using (StreamReader sr = new StreamReader(fs)) { <br> string line = null; <br> while ((line = sr.ReadLine()) != null) { <br> if (line.Length == 0 || line[0] == '#') // comments <br> continue; <br> string[] fields = line.Split('|'); <br> if (fields.Length != 3) { <br> noock.log.DefaultLogger.Logger.Warning("Invalid config in file: " + fi.ToString()); <br> continue; <br> } <br> _autoCloseList.Add(new AlertWindowInfo(fields[2].Trim(), fields[0].Trim(), fields[1].Trim())); <br> } <br> } <br> } <br> noock.log.DefaultLogger.Logger.Info("[Auto-closing] Loaded {0} items", _autoCloseList.Count); <br> } catch (Exception ex) { <br> noock.log.DefaultLogger.Logger.Exception("[AutoClose]: Failed to load auto-close list: " + fi.FullName, ex); <br> } <br> } <br>// Call the next hook in the chain <br>return CallNextHookEx(_pWH_CALLWNDPROCRET, iCode, pWParam, pLParam); <br>}</alertwindowinfo>
窗口匹配的函数
private static bool MatchWindowAndClickButton(IntPtr hwnd, string caption, string expectedCaption, string message, string button)
{
if (-1 == caption.IndexOf(expectedCaption))
return false;
bool contentMatched = false;
IntPtr pButton = IntPtr.Zero;
// Check out further properties of the dialog
foreach (IntPtr pChildOfDialog in listChildWindows(hwnd)) {
// Go through all of the child controls on the dialog and see what they reveal via their text
int iLength = GetWindowTextLength(pChildOfDialog);
if (iLength continue;
StringBuilder sbProbe = new StringBuilder(iLength + 1);
GetWindowText(pChildOfDialog, sbProbe, sbProbe.Capacity);
string msg = sbProbe.ToString();
noock.log.DefaultLogger.Logger.Info("Child window:[{0}]", msg);
if (msg.IndexOf(message) != -1) {
contentMatched = true;
noock.log.DefaultLogger.Logger.Debug("Matched window message: [{0}]", msg);
continue;
}
if (msg.IndexOf(button) != -1) {
pButton = pChildOfDialog;
noock.log.DefaultLogger.Logger.Debug("Matched button: [{0}]", msg);
}
}
if (pButton != IntPtr.Zero && contentMatched) {
noock.log.DefaultLogger.Logger.Info("Found a window , try to close: [{0}]:{1}:{2}",caption, message,button);
Int32 ctrlId = GetDlgCtrlID(pButton);
//PostMessage(hwnd, WM_COMMAND, ctrlId, (int)pButton);
//SendMessage(pButton, WM_COMMAND, ctrlId, (int)pButton);
SendMessage(hwnd, WM_COMMAND, ctrlId, (int)pButton);
return true;
}
return false;
}
获取窗体文本的函数
public static string GetWindowText(IntPtr hwnd)
{
Int32 iLength = GetWindowTextLength(hwnd);
StringBuilder sb = new StringBuilder(iLength + 1);
GetWindowText(hwnd, sb, sb.Capacity);
return sb.ToString();
}
需要注意配置文件内容要用UTF-8格式,因为C#默认是UTF-8,否则里面出现中文的时候可能出现乱码,导致窗口匹配的时候匹配不上。
实际上这里用到的全是windows的API,与C#本身关系并不大,通过C++、C都可以实现。
分享到:
相关推荐
自动点击WebBrowser,ie等弹出的alert确定,
WebBrowser关闭弹出的alert对话框
VB6.0 WebBrowser阻止弹出窗口的3个办法
使用WebBrowser控件时,在打开https安全链接时,可能会弹出"安全警报"(Security Alert)窗口让用户确认.用户只有点击"是(&Y)"才能正常打开网页.这是多余操作.解决方法:定时监视是否有窗口弹出,如果有,获取窗口句柄,再...
WebBrowser控件应用:弹出新窗体和关闭窗口
vb6获取webbrowser弹出的错误
webBrowser 禁用消息框 alert 并且获得内容。
vb6_Webbrowser控件使用...2、弹出Webbrowser消息窗口 Dim oWindow Set oWindow = WebBrowser1.Document.parentWindow oWindow.confirm "abcd" VB调用webbrowser技巧集2 向Webbrowser中写入HTML内容的几种方法
本资源是针对C#winform开发的webBrowser控件进行的操作,webBrowser网页控件在实际应用中默认点击里面的链接是跳转到浏览器打开,该资源正是解决此问题,只在winform里打开。
运行平台: .NET Framework 4.0 运行时请自行安装 ... 使用WebBrowser控件开发的大屏幕浏览器 解决页面跳转时 弹出默认浏览器的BUG 内置一个时钟,提供音乐到时报警,方便收菜. 提供源码供大家学习交流~~
c#webbrowser实现多个窗口独立不同的cookie
2,在窗体中加入三个按钮,然后添加WebBrowser控件,右键控件选属性,设置相应的属性。 3,设置WebBrowser控件的属性 public Form1() { InitializeComponent(); webBrowser1.ScriptErrorsSuppressed = true; //...
解决了webbrowser下载文件的三个问题: 1、屏蔽了另存为的弹出 2、获得webbrowser所有的cookie值 3、让webclient支持cookie
易语言WebBrowser2支持库 http://www.jf40.com/(谜尚Missha) http://www.meqiqi.com/(蒙奇奇专卖店)
WebBrowser控件使用详解,WebBrowser控件使用详解
涵盖了几种常用的 webBrowser执行javascript的方法, execScript方式: NavigateScript方式: 其中需要作如下设置 由于visual studio2005 中WebBrowser控件已经实现了IDocHostUIHandler,所以 只要把应用程序属性类的...
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { this.webBrowser1.Navigate(Application.StartupPath + "/default.htm"); } Winform全屏: this....
到NuGet下载官方dll NuGet Gallery | EO.WebBrowser for .NET 16.2....https://www.nuget.org/packages/EO.WebBrowser/ 出自 .NET Google 浏览器内核 Eo.Webbrowser | Flyヽ Blog http://lfei.org/net-eo-webbrowser/
WebBrowser Firefox 浏览器<br/>Firefox Setup 2.0.0.3
webBrowser 窗体简单使用 axWebBrowser 窗体简单使用 需要添加com组件----Microsoft web browser 组件