Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C中的Geckofx选择本地文件并将其上载到网站?_C#_File Upload_Addeventlistener_Gecko_Geckofx - Fatal编程技术网

C# 如何使用C中的Geckofx选择本地文件并将其上载到网站?

C# 如何使用C中的Geckofx选择本地文件并将其上载到网站?,c#,file-upload,addeventlistener,gecko,geckofx,C#,File Upload,Addeventlistener,Gecko,Geckofx,我在winform应用程序中使用Geckofx在网站上填写表单。其中一个控件是“选择文件”按钮,用于选择和上载本地文件。我想通过完全通过代码来实现这一过程的自动化 我通过代码点击了这个按钮: Gecko.DOM.GeckoButtonElement button = new Gecko.DOM.GeckoButtonElement(doc.GetElementsByClassName("choose_files_btn").First().DomObject); button.Click();

我在winform应用程序中使用Geckofx在网站上填写表单。其中一个控件是“选择文件”按钮,用于选择和上载本地文件。我想通过完全通过代码来实现这一过程的自动化

我通过代码点击了这个按钮:

Gecko.DOM.GeckoButtonElement button = new Gecko.DOM.GeckoButtonElement(doc.GetElementsByClassName("choose_files_btn").First().DomObject);
button.Click();
因此,会自动打开一个文件对话框,但我想自动选择文件部件并单击“确定”。我试图检查网页,看看是否可以将本地文件的路径分配给Gecko元素,但找不到任何类似的内容

我还考虑过处理打开文件对话框的事件,但在Gecko中找不到任何事件处理程序。我找到了Gecko.LauncherDialog.Download事件处理程序,它用于处理使用Geckofx浏览器下载文件的操作。但使用Geckofx浏览器上传文件时并没有这样的事件处理程序,如果有,而且我错过了,请告诉我


如果我编写一个事件处理程序,它将捕获每个打开的文件对话框事件,但我不知道这是否可能,那么也许我可以使用一个事件处理程序,而不是Gecko的事件处理程序,而是系统的事件处理程序。

这里有一个解决方案,可以在不显示文件上载对话框的情况下上载:

GeckoHtmlElement el = webbrowser.DomDocument.GetElementsByTagName("input").FirstOrDefault(elz => elz.GetAttribute("type") == "file"); //inpout type file element
var fileNames = new IntPtr[1];
fileNames[0] = new Gecko.CustomMarshalers.WStringMarshaler().MarshalManagedToNative(file); //file = path to file you want to upload


var domInput = Xpcom.QueryInterface<nsIDOMHTMLInputElement>(el.DOMHtmlElement);
domInput.MozSetFileNameArray(fileNames, (uint)fileNames.Length);

Marshal.ReleaseComObject(domInput);

DomEventArgs ev = webbrowser.Document.CreateEvent("HTMLEvents");
var webEvent = new Event(webbrowser.Window.DomWindow, ev.DomEvent as nsISupports);
webEvent.InitEvent("change", true, true);
el.GetEventTarget().DispatchEvent(ev);

new Gecko.CustomMarshalers.WStringMarshaler().CleanUpNativeData(fileNames[0]); //delete everything

以下是一个解决方案,可以在不显示文件上载对话框的情况下进行上载:

GeckoHtmlElement el = webbrowser.DomDocument.GetElementsByTagName("input").FirstOrDefault(elz => elz.GetAttribute("type") == "file"); //inpout type file element
var fileNames = new IntPtr[1];
fileNames[0] = new Gecko.CustomMarshalers.WStringMarshaler().MarshalManagedToNative(file); //file = path to file you want to upload


var domInput = Xpcom.QueryInterface<nsIDOMHTMLInputElement>(el.DOMHtmlElement);
domInput.MozSetFileNameArray(fileNames, (uint)fileNames.Length);

Marshal.ReleaseComObject(domInput);

DomEventArgs ev = webbrowser.Document.CreateEvent("HTMLEvents");
var webEvent = new Event(webbrowser.Window.DomWindow, ev.DomEvent as nsISupports);
webEvent.InitEvent("change", true, true);
el.GetEventTarget().DispatchEvent(ev);

new Gecko.CustomMarshalers.WStringMarshaler().CleanUpNativeData(fileNames[0]); //delete everything

非常感谢你!我刚刚测试了它,它按预期工作。我不认为这是一个可行的解决方案了。Mozilla对它的描述让它看起来不值得依赖。我怀疑GeckoFx60已经放弃了对它的支持。遗憾的是,我没有任何建议@BlasterGod你能不能包括一些你用过的库版本?Anarki,除了60以上的版本外,所有版本都可以使用。我想看到版本60的解决方案,非常感谢您!我刚刚测试了它,它按预期工作。我不认为这是一个可行的解决方案了。Mozilla对它的描述让它看起来不值得依赖。我怀疑GeckoFx60已经放弃了对它的支持。遗憾的是,我没有任何建议@BlasterGod你能不能包括一些你用过的库版本?Anarki,除了60以上的版本外,所有版本都可以使用。我希望看到版本60及以上的解决方案