2017-07-17 12 views
1

すでに開いているInternet Explorerウィンドウに接続しようとしています。一旦接続されると、何らかの処理のためにIEウィンドウにいくつかのキーストローク(SendKeys経由)を送る必要があります。 SendKeysコマンドまで動作する以下のコードがあります。それは、 "グラフィックスデータベース"というタイトルのIEウィンドウを見つける。それがヒット "SendKeys.Send(" {TAB} ");"エラーが発生しました。 "未処理の例外 'System.NullReferenceException'が発生しました。"C#IE11オートメーション - IEウィンドウを開くために接続できない

その他の情報:NullReferenceExceptionエラーで次のようなエラーが発生します。変わったことは、新しいIEウィンドウを開いて、それがうまく動作するSendKeysを使用するようにコーディングする場合です。既存のウィンドウに接続するとこの問題が発生するようです。

SendKeysは、アプリケーションがWindowsメッセージを処理していないため、このアプリケーション内で実行できません。メッセージを処理するようにアプリケーションを変更するか、SendKeys.SendWaitメソッドを使用します。

誰でもこの問題を解決するにはどうすればいいですか?

アンディ

InternetExplorer IE = null; 

// Get all browser objects 
ShellWindows allBrowsers = new ShellWindows(); 
if (allBrowsers.Count == 0) 
{ 
    throw new Exception("Cannot find IE"); 
} 

// Attach to IE program process 
foreach (InternetExplorer browser in allBrowsers) 
{       
    if (browser.LocationName == "Graphics Database") 
    { 
     MessageBox.Show ("Found IE browser '" + browser.LocationName + "'"); 
     IE = (InternetExplorer)browser; 
    } 
} 

IE.Visible = true; 
System.Threading.Thread.Sleep(2000); 

SendKeys.Send("{TAB}"); 
SendKeys.Send("G1007"); 
SendKeys.Send("{ENTER}"); 
+0

スタックトレースまたは.... – hoodaticus

+0

私は、** IE.Visible = true; **が機能していないことを発見しました。 IE.Visible = trueの前と後にMessageBoxでコードを一時停止し、Graphics Databaseウィンドウを手動でクリックしてアクティブにし、前面に表示すると、次のコードは期待通りに機能します。 – Andy

+0

この問題を解決できました。 IE.Visible = trueにすることは決してできませんでした。これは私のコードでは何もないようでした。 SetForegroundWindow()を使用してフォーカスをIEウィンドウに設定する必要がありました。 – Andy

答えて

1

私はこの問題を解決することができました。 IE.Visible = trueにすることは決してできませんでした。これは私のコードでは何もしなかったようです。 SetForegroundWindow()を使用してフォーカスをIEウィンドウに設定する必要がありました。

// Find the IE window 
int hWnd = FindWindow(null, "Graphics Database - Internet Explorer"); 

if (hWnd > 0) // The IE window was found. 
{ 
    // Bring the IE window to the front. 
    SetForegroundWindow(hWnd); 

このサイトは、SetForegroundWindow()が動作するのに非常に役立ちました。これは長くなりますよう

http://forums.codeguru.com/showthread.php?460402-C-General-How-do-I-activate-an-external-Window

0

アンディは私と一緒に負担してください。まず、mshtmlのドキュメントとDomを見たいと思っています。 https://msdn.microsoft.com/en-us/library/aa741314(v=vs.85).aspxなぜ私はオートメーションが複雑であるのか分かりませんが、それはそうです。 UIautomationクラスはWindowsアプリケーションにはうまくいきますが、私が見つけたIEには本当に何もありません。他の人はwaitnやseleniumのような第三者を指します。 Waitnはもはやサポートされないように見え、セレニウムは開いているIEブラウザをつかむことはできません。セキュリティの制限のためにブラウザにユーザー名とパスワードを保存できないため、Webパスワードを保存して自動入力するアプリを作成できるようにするために、私は最近この道を辿った。ここに例があり、助けてくれることを願っています。最初にIEを開き、http://aavtrain.com/index.aspにナビゲートします。次に、mshtmlとshdocvwを参照してコンソールプロジェクトを作成します。以下にコードを示します。ウィンドウが表示され、ユーザー名、パスワード、送信の要素が検索されます。ユーザー名とパスワードを入力して「送信」ボタンをクリックします。私はこのサイトへのログインを持っていないのでログインしません。私は私のテストのために使っています。私が持っている問題は、javascriptのログインフォームを持つサイトです。あなたがこの情報をさらに得るなら、私はまだコンセプトを進化させ、再利用可能なものを作成しようとしているので、ポストバックしてください。

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     Console.WriteLine("Starting Search\n\n\n"); 

     foreach (SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      if (ie.LocationURL.Contains("aavtrain")) 
      { 
       Console.WriteLine(ie.LocationURL); 
       Console.WriteLine("\n\n\n\n"); 
       Console.WriteLine("FOUND!\n"); 

       mshtml.HTMLDocument document = ie.Document; 
       mshtml.IHTMLElementCollection elCol = document.getElementsByName("user_name"); 
       mshtml.IHTMLElementCollection elCol2 = document.getElementsByName("password"); 
       mshtml.IHTMLElementCollection elCol3 = document.getElementsByName("Submit"); 

       Console.WriteLine("AutofillPassword"); 


       foreach (mshtml.IHTMLInputElement i in elCol) 
       { 
        i.defaultValue = "John"; 
       } 

       foreach (mshtml.IHTMLInputElement i in elCol2) 
       { 
        i.defaultValue = "Password"; 
       } 

       Console.WriteLine("Will Click Button in 2 seconds"); 
       Thread.Sleep(2000); 

       foreach (mshtml.HTMLInputButtonElement i in elCol3) 
       { 

        i.click(); 
       } 


      } 
     } 

     Console.WriteLine("Finished"); 
関連する問題