我正在研究 Internet Explorer 自动化,其中一部分涉及从托管在 ASP 2.0 上并使用基于表单的身份验证的站点下载文件,因此为了创建端到端自动化,我使用了浏览器自动化。
我能够到达可以单击 URL 的步骤,该 URL 会带来浏览器的“文件下载”对话框,然后我试图使用 SendKeys 单击保存按钮,但无济于事不工作。
这是我使用 FindWindow 方法获取文件下载对话框的 hWnd 指针的代码,然后使用 setActiveWindow 将其设置为活动窗口,以便 SendKeys 命令对其工作,然后使用 SendKeys 我尝试发送 Alt + S 但它没有用。我观察到,Tab、Escape 和 Enter 有效,但 Enter on Save 按钮不起作用。
[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 中的值更改为“Untitled - Notepad”来访问记事本。
我需要做一些不同的事情,因为它是一个对话框,现在是一个窗口?我正在使用 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");
为清楚起见,我添加了对话框的屏幕。