按“文件下载对话框”的保存按钮通过 c# 的 Internet Explorer
我正在研究 Internet Explorer 自动化,其中一部分涉及从托管在 ASP 2.0 上并使用基于表单的身份验证的网站下载文件,因此为了创建端到端自动化,我使用了浏览器自动化。
我能够到达可以单击 URL 的步骤,该 URL 会显示浏览器的“文件下载”对话框,然后我尝试使用 SendKeys 单击“保存”按钮,但无济于事不工作。
下面是我使用 FindWindow 方法获取文件下载对话框的 hWnd 指针的代码,然后使用 setActiveWindow 将其设为活动窗口,以便 SendKeys 命令在其上工作,然后使用 SendKeys 我尝试发送 Alt +但没有成功。我观察到,Tab、Escape 和 Enter 有效,但保存按钮上的 Enter 不起作用。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
private void Form1_Load(object sender, EventArgs e)
{
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr nullptr = (IntPtr)0;
if (hwnd != nullptr)
{
SetActiveWindow(hwnd);
SendKeys.SendWait("%S");
}
}
使用相同的代码,我可以通过将 FindWindow 中的值更改为“无标题 - 记事本”来访问记事本。
我是否需要做一些不同的事情,因为它是一个对话框,现在是一个窗口?我用的是IE8。
这是我在回答后尝试的替代代码。
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr hokBtn = IntPtr.Zero;
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
uint id = GetDlgCtrlID(hokBtn);
SetActiveWindow(hwnd);
IntPtr res = SendMessage(hokBtn, (int)0x00F5, 0, IntPtr.Zero);
if (res.ToInt32() == 1)
MessageBox.Show("success");
为了清楚起见,我添加了对话框的屏幕。
替代文本 http://www.freeimagehosting.net/uploads/4f23586401。 .png
I am working on internet explorer automation and part of it involves downloading files from a site whcih is hosted on asp 2.0 and uses forms based authentication, so to create end to end automation I used browser automation.
I was able to reach to the step where I can get to click on a URL which brings the "File Download" dialog of the browser, then I was trying to make use of SendKeys to click on the save button but to no avail it was not working.
Here is the code where I make use of FindWindow method to get the hWnd pointer of the File Download Dialog, and then using setActiveWindow I make it the active window so that the SendKeys commands works on it and then using SendKeys I tried to send Alt + S but it didn't work. I observed that, Tab, Escape and Enter works, but then Enter on Save button doesn't work.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
private void Form1_Load(object sender, EventArgs e)
{
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr nullptr = (IntPtr)0;
if (hwnd != nullptr)
{
SetActiveWindow(hwnd);
SendKeys.SendWait("%S");
}
}
Using the same code I was able to access notepad by changing the value in FindWindow to "Untitled - Notepad".
Do I need to do something different as it is a dialog and now a window? I am using IE8.
This is the alternate code I tried after the answer.
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr hokBtn = IntPtr.Zero;
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
uint id = GetDlgCtrlID(hokBtn);
SetActiveWindow(hwnd);
IntPtr res = SendMessage(hokBtn, (int)0x00F5, 0, IntPtr.Zero);
if (res.ToInt32() == 1)
MessageBox.Show("success");
For clarity I am adding the screen of the dialog.
alt text http://www.freeimagehosting.net/uploads/4f23586401.png
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
尝试以下似乎对我有用的方法:
不过,我建议您检查每个函数的返回值。
Try the following which seemed to work for me:
I would suggest you check the returns from each function though.
这在 C++ 中有效
请注意,“保存”按钮名为“&Save”而不是“Save”
}
This works in C++
Note that the 'Save' button is named '&Save' not 'Save'
}
好吧,你必须找到带有下载对话框标题的窗口。然后您必须找到标题为下载按钮/的窗口,然后向该窗口发送单击消息
,您就可以使用 winspector (spy++ 的类似物)。这是非常有用的实用程序。你可以发现很多关于windows的东西;)
well, you have to find window with title of downloading dialog. and than you have to find window with title of download button/ and then send to that window click message
and you can use winspector (analog of spy++). it's very useful utility. You can discovery many things about windows;)
我找到了一种在 Windows XP 中使用 Internet Explorer 6 执行此操作的方法。
(抱歉,VBA 代码)
请告知它是否适合您。
I found a way to do this with Internet Explorer 6 in Windows XP.
(Sorry, VBA code)
Please, tell if it works for you.
我在 StackOverflow 上找到了大部分内容: 如何处理消息在 C# 中使用网络浏览器时出现框?
我为我修改了它
I found most of this on StackOverflow: How to handle Message Boxes while using webbrowser in C#?
and i modified it for me
如果我没记错的话,这实际上是一个误报。看似故障保护的默认行为似乎是关闭对话框。相反,可以单击“取消”按钮是一个积极的结果,但尝试单击“打开”或“保存”将在该上下文中生成相同的不需要的响应...
似乎这是一个我们必须要打开的对话框除非其他人可以感激地确认否则如何处理?
That was actually a false positive if I'm not wrong; the default behaviour seemingly as a failsafe appears to be to close the dialog box. Rather, it was a positive that the cancel button can be clicked, but attempting to click Open or Save will generate the same yet in that context unwanted response...
It seems that this is a dialog box we're just going to have to deal with unless someone else could gratefully confirm otherwise?
建议的代码都不起作用,我最终使用 AutoIt 脚本关闭打印对话框,代码如下:
None of the code suggested worked, I ended up to use AutoIt script to close a Print Dialog, the code follows: