2016-11-04 7 views
0

私はvbaのShellコマンドを使ってアプリケーションを起動しています。次に、私はそれを制御することができるようにWIN32 APIを使用してアプリをフックします。ExcelからWPFアプリケーションを起動し、フォーカスを取得してExcelに戻す方法

これはすべてうまくいきますが、細かいところがあります:アプリを起動した後、Excelのダッシュボードにフォーカスを戻したいのですが、それをクリックする必要がありますスプレッドシート上の任意のボタンをクリックする前に。

私はSendMessage経由WM_IME_NOTIFYAppActivate Application.ActiveWindow.CaptionSetForegroundWindowSetFocusWM_IME_SETCONTEXTを使用して試してみたが、何も動作していないようにみえます。私もワークシートActivateメソッドと範囲Activateメソッドを試しましたが、ボタンをクリックする前にワークシートをクリックする必要があります。

私はExcelのプロセスからメッセージを送信しているので、これが可能だったと思いますが、どうすればスプレッドシートをアクティブにできますか?

+0

シェルコマンドを投稿できますか? 'vbNormalNoFocus'でシェルを開いていますか? – Tim

+0

こんにちは@Tim、シェルコマンドはパス引数のみを持っています。 –

+0

@ティム、私は私のコメントがあいまいであることを知った:私は1つの議論でそれを呼び出すだけだ...私は机に戻るときにあなたの提案を試してみる。 –

答えて

1

rules governing which objects can set the foreground windowが満たされていないため、これを動作させることができませんでした。

システムは、フォアグラウンドウィンドウを設定できるプロセスを制限します。

  • プロセスがフォアグラウンド・プロセスである: プロセスは、以下の の条件のいずれかに該当する場合にのみ、前面のウィンドウを設定することができます。

  • プロセスはフォアグラウンドプロセスによって開始されました。

  • プロセスは最後の入力イベントを受信しました。
  • フォアグラウンドプロセスはありません。
  • プロセスがデバッグされています。
  • フォアグラウンドプロセスは、現代アプリケーションまたは開始画面ではありません。
  • フォアグラウンドはロックされていません(LockSetForegroundWindowを参照)。
  • フォアグラウンドロックタイムアウトが終了しました(SystemParametersInfoのSPI_GETFOREGROUNDLOCKTIMEOUTを参照)。
  • アクティブなメニューはありません。

ユーザーが が別のウィンドウで作業しているときに、アプリケーションがウィンドウをフォアグラウンドに強制することはできません。代わりに、Windowsはウィンドウのタスクバーの ボタンを点滅させてユーザーに通知します。私の場合は

は私が独自のウィンドウのいずれかをアクティブにするために、Excelを取得しようとしていたが、Excelがフォアグラウンドフォーカスに影響を与えることが無力だったので、生成されたアプリは、すでに、フォアグラウンドフォーカスを引き継ぎました。解決策は、VBAからカスタムメッセージをアプリケーションに送信し、excel hWndを引数としてフォアグラウンドフォーカスを要求することでした。アプリはSetForegroundWindowを呼び出すことができ、上記の最初の条件を満たしているので、excelは実際にフォアグラウンドフォーカスを与えられます。

関連する問題