2016-10-17 3 views
-1

htmlelementクラスについてはかなり初心者です!c#HtmlElement競合状態のないコンピュータからプログラマチックにファイルを選択する方法(webブラウザによってアクセスされるHtmlElementから)

私が今しようとしているのは、非常に退屈な外部Webページに、すでにコンピュータ上に存在するデータがロードされていることです(プログラムは前記コンピュータ上でローカルに実行されます)。手作業で行う煩わしい、時間のかかる作業の1つは、コンピュータから機器の設置図を選択してからHTMLElementクラスとWebBrowserコントロールを使用してそのフォームに送信することですが、安全ではないコードが嫌いです今画像コンピュータがHDDの睡眠を持って、[OK]を

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秒かかることがあります。それはつまり、ファイルのパスを入力し、表示されたダイアログが表示される前にEnterキーを押すことで、プログラムがコード行を実行できなかったり、ユーザやコーダにエラーが表示されたりすることはありませんこれは期待される)。

私は何をしようとしていますが、それは非常に明白な競合状態を回避すると同時に、私はループ内の各500msをチェックして、ウィンドウが開いているかどうかを確認し、

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}"); 

私は可能なのですか?検索されたgoogleとstackoverflowのすべてのソリューションは、競合状態のエラーを常に引き起こすランダムタイマーに基づいていました。

よろしく!

+0

なぜdownvoteですか?多分あなたはそれの理由を指摘することができますか?おそらくその不可能な質問、またはあまりにも簡単な質問、または多分私は欲しいものが混乱している、なぜ私はそれから学ぶことができる質問を下にコメントを追加し、質問自体を改善する? ありがとうございます! –

答えて

0

私はsendkeysメソッドを無視し、スレッドとWindows内部メッセージングシステムの組み合わせを使用してアプリケーションの上にモーダルウィンドウを検出し設定することでこの問題を解決しました。

FindWindowEx()、SendMessage()、GetParent()、Task.Run()

関連する問題