2016-10-28 10 views
0

Excel AddInアプリケーションでWindowsフォームを使用しています。私はモーダルウィンドウとしてフォームを表示するためにShowDialog()を使用します。私は私のアプリケーションで範囲アドレスを指定する必要があります。そこで、Application.InputBoxを呼び出すボタンを追加しました。 ボタンクリックイベントは、それが正常に動作し、次のコードVSTO Excel AddIn:Excel Inputboxがモーダルウィンドウフォームから呼び出されると、Visual Studioにフォーカスが移動します

 private void button1_Click(object sender, EventArgs e) 
    { 
     Excel.Range myRng; 
     Excel.Application app = Globals.ThisAddIn.Application; 
     myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, 8); 
     label1.Text = myRng.Address.ToString(); 
     this.Focus(); 
    } 

が含まれています。しかし、私は入力ボックスがアクティブなときにウィンドウのフォームを非表示にする必要があります。だから私は少しコードを変更しました

 private void button1_Click(object sender, EventArgs e) 
    { 
     Excel.Range myRng; 
     Excel.Application app = Globals.ThisAddIn.Application; 
     this.Visible = false; 
     myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, 8); 
     label1.Text = myRng.Address.ToString(); 
     this.Visible = true; 
     this.Focus(); 
    } 

残念ながら、これは問題を引き起こします。ボタンをクリックすると、フォーカスがVisual Studioに移動します。私は間違って何をしていますか?どのようにInputBoxが開いた瞬間にExcelアプリケーションにフォーカスを維持するには?

+0

.Focus呼び出しの代わりに.Activate() – Steve

+0

これで問題は解決しません。フォーカスは、myRng = app.InputBox() – Tabibito

+0

行の先に失われてしまいます。明確化:問題は何とかthis.Visible = false; InputBoxをMessageBoxに置き換えても、フォーカスは次の行で失われます。 this.Visible = false;という行をコメントアウトすると問題は消えます。 – Tabibito

答えて

1

私の場合、この行を以下のように真ん中に追加しました。うまくいきました。

this.Visible = false; 
this.BrintToFront(); 
+0

ありがとう!私はあなたのソリューションをテストしました。それは私にとってもうまく動作し、簡潔です。 – Tabibito

+0

私はこの答えを試してみましたが、私の場合は画面に小さなフラッシュがあります。一時的にフォーカスを失ってExcelに戻り、入力ボックスに戻ってきます。これは理想的ではありません。このちらつきスクリーンの問題はありませんか? – Malick

+0

@ Tabibitoまた、 'BringToFront'の代わりに' this.SendToBack(); 'を使うほうが論理的です。 (どちらも動作しています...)。ちらつき効果については、入力ボックスが初めて呼び出されたときにのみ表示される別の情報です。 – Malick

1

最後に私は解決策を見つけました。次のようにフォームクラス内のコードを変更しました

[DllImport("user32.dll")] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Excel.Range myRng; 
     Excel.Application app = Globals.ThisAddIn.Application; 

     string fileName; 
     fileName = app.ActiveWorkbook.Name; 
     Process[] processes = Process.GetProcessesByName("excel"); 
     foreach (Process p in processes) 
     { 
      if (p.MainWindowTitle.Contains(fileName.Substring(fileName.LastIndexOf("/") + 1))) 
      { 
       SetForegroundWindow(p.MainWindowHandle); 
      } 
     } 

     this.Visible = false; 

     try 
     { 
      myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8); 
     } 
     catch 
     { 
      myRng = null; 
     } 

     if (myRng != null) 
     { 
      label1.Text = myRng.Address.ToString(); 
     } 

     this.Visible = true; 
     this.Activate(); 
    } 

これは、必要に応じて機能します。しかし、私はまだ問題が起きた理由と、より簡単な解決策があるのか​​どうか疑問に思っています。あなたにアイデアがあれば教えてください。

P.S.このリンクは役に立ちました:Set Focus on Excel Application

関連する問題