Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Press save button of "File download dialog" of internet explorer via c#

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

like image 268
Anirudh Goel Avatar asked Jun 08 '10 18:06

Anirudh Goel


2 Answers

Try the following which seemed to work for me:

IntPtr hwnd = FindWindow(null, "File Download");
IntPtr hokBtn = FindWindowEx(hwnd, null, "Button", "Cancel");
uint id = GetDlgCtrlID(hokBtn);
SetActiveWindow(hwnd);
IntPtr res = SendMessage(hokBtn, (int)0x00F5, 0, IntPtr.Zero);
if (res.ToInt32() == 1)
    MessageBox.Show("success");

I would suggest you check the returns from each function though.

like image 66
Jon Cage Avatar answered Nov 15 '22 09:11

Jon Cage


This works in C++ Note that the 'Save' button is named '&Save' not 'Save'

CString Title;
    Title=_T("File Download");
    HWND FEX =  ::FindWindowEx( NULL,NULL,NULL,Title);
    if (FEX != NULL)
    {

        //press the Save button on the dialog.
        HWND hokBtn = ::FindWindowEx(FEX, NULL, L"Button", L"&Save");
        if (hokBtn != NULL)
        {

            UINT id = ::GetDlgCtrlID(hokBtn);
            ::SetActiveWindow(hokBtn);
            ::PostMessage(hokBtn, WM_KEYDOWN, 0x20, 0);
            ::PostMessage(hokBtn, WM_KEYUP, 0x20, 0);
        }

}

like image 31
John TallSmith Avatar answered Nov 15 '22 10:11

John TallSmith