FileUploadHandler прекрасно работает.У меня он работает в производственном режиме с тысячами загружаемых файлов каждый день, и у меня до сих пор не было проблем с ним.
Это способ, которым он должен быть реализован:
РЕДАКТИРОВАТЬ: (Я забыл включить объект uploadDialog)
IntPtr hwndTmp = (IntPtr)FindWindow("#32770","Select file(s) to upload"); // or whatever the window text says when you are opening that upload window)
Window uploadDialog = new Window(hwndTmp);
UploadFileDialogHandler uploadFile = new UploadFileDialogHandler(_toBeSent.FileToSent);
_browser.AddDialogHandler(uploadFile);
uploadFile.HandleDialog(uploadDialog);
uploadFile = null;
Это позаботится о процессе загрузки.когда вам нужно загрузить файл, обо всех этих строках позаботятся обо всем (переберите все открытые диалоговые окна, найдите правильное, найдите текстовое поле, введите имя и нажмите кнопку «ОК». Вдобавок к этому вам нужносоздайте другой класс, который будет UploadFileDialogHandler:
public class UploadFileDialogHandler : BaseDialogHandler
{
private const int WmSettext = 0x000C;
private string fileName;
private bool _processed = false;
public override bool HandleDialog(Window window)
{
var button = GetOpenButton(window);
if (button != null)
{
if (_processed == false)
{
var fileNameHandle = NativeMethods.GetChildWindowHwnd(window.Hwnd, "Edit");
var fileNameHwnd = new Hwnd(fileNameHandle);
fileNameHwnd.SetFocus();
_processed = true;
//MessageBox.Show("About to send " + fileName);
fileNameHwnd.SendString(fileName);
button.Click();
}
return true;
}
else
{
return false;
}
}
public UploadFileDialogHandler(string file)
{
fileName = "";
fileName = file;
//MessageBox.Show("Setting filename: " + fileName);
}
public override bool CanHandleDialog(Window window)
{
return GetOpenButton(window) != null;
}
private WinButton GetOpenButton(Window window)
{
var windowButton = new WindowsEnumerator().GetChildWindows(window.Hwnd, w => w.ClassName == "Button" && new WinButton(w.Hwnd).Title == "&Open").FirstOrDefault();
if (windowButton == null)
return null;
else
return new WinButton(windowButton.Hwnd);
}
}
}
Вы можете просто скопировать и вставить этот класс в вашу программу, и с 4 строками кода выше он позаботится обо всем остальном.Если вам нужно больше информации, то есть много информации об исходном коде файла WatIn, но вам может быть немного сложно следовать, если вы не понимаете Windows API.
Надеюсь, это поможет.