2016-10-17 16 views
-1

當涉及到hmmlelement類的時候,我相當新手!c#HtmlElement如何編程從一臺沒有競爭條件的計算機中選擇一個文件(來自一個web瀏覽器訪問的HtmlElement)

我現在想要做的是用計算機上已存在的負載數據(程序在本地計算機上執行)填充非常非常無聊的外部網頁。這些煩人和耗時的手動操作之一是從您的​​計算機中選擇設備安裝圖片,然後將其提交到該窗體,這樣做可以通過使用HTMLElement類和webBrowser控件,但我討厭不安全的編碼要求這樣做,我把它稱爲不安全的,因爲它有競爭狀態的問題,看看這裏:

下面的代碼不是由我創造

async Task PopulateInputFile(HtmlElement file) 
{ 
    file.Focus(); 

    // delay the execution of SendKey to let the Choose File dialog show up 
    var sendKeyTask = Task.Delay(500).ContinueWith((_) => 
    { 
     // this gets executed when the dialog is visible 
     SendKeys.Send("C:\\Images\\CCPhotoID.jpg" + "{ENTER}"); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 

    file.InvokeMember("Click"); // this shows up the dialog 

    await sendKeyTask; 

    // delay continuation to let the Choose File dialog hide 
    await Task.Delay(500); 
} 

async Task Populate() 
{ 
    var elements = webBrowser.Document.GetElementsByTagName("input"); 
    foreach (HtmlElement file in elements) 
    { 
     if (file.GetAttribute("name") == "file") 
     { 
      file.Focus(); 
      await PopulateInputFile(file); 
     } 
    } 
} 

好了,現在像你的電腦硬盤睡眠,或者它在一個非常緊張的反病毒掃描+同時更新窗口,自然出現的模式窗口可能需要10秒鐘。那麼這意味着你要輸入文件的路徑並在顯示的對話框出現之前按回車鍵,這會導致程序被卡住,永不離開,不能執行代碼,也不會向用戶或編碼器提供任何錯誤(這是預期的)。

我試圖做的就是這一點,但同時避免了非常明顯的競爭條件,我正在考慮在循環中檢查每個500毫秒,以查看是否打開窗口,然後執行sendkeys,如下所示:

AutoUploadPicture(string path) 
{ 
    fileUploadDialogElement.Focus();//HTMLElement Taken from webBrowser1.Document 

    Task.Run(()=>PerformAsyncCheckup()); 
    fileUploadDialogElement.InvokeMember("click"); 
    CancelTask = true; 

    //successfully continue coding as it avoided that ugly race condition 
} 
bool CancelTask = false; 
PerformAsyncCheckup() 
{ 
    while (webBrowser1.AnyDialogFormShowing==false && CancelTask == false) 
    { 
     Thread.Sleep(200); 
    } 
    if (CancelTask ==false) 
     SendKeys.Send("C:\\Images\\CCPhotoID.jpg" + "{ENTER}"); 

是我想要的嗎? ive搜索谷歌和stackoverflow和所有的解決方案都是基於一些隨機計時器,總是存在競爭條件錯誤的風險。

最好的問候!

+0

爲什麼downvote?也許你可以指出它的原因?也許它是一個不可能的問題,或者太容易的問題,或者我想要的是令人困惑的,爲什麼不在下面添加評論,以便我可以從中學習並改進問題本身? 在此先感謝! –

回答

0

我已經通過忽略sendkeys方法並使用線程和Windows內部消息傳遞系統的組合來檢測和配置我的應用程序之上的模式窗口來修復此問題,該窗口修復了當前編碼的可靠性問題。

即FindWindowEx(),SendMessage(),GetParent()和Task.Run()

相關問題