2016-11-04 24 views
0

我在vba中使用Shell命令啓動應用程序。然後使用WIN32 API掛接應用程序,以便我可以控制它。從excel啓動WPF應用程序,如何將焦點返回到excel

這一切都工作正常,但一個小細節:我想返回焦點到Excel的儀表板,我有按鈕來控制應用程序,在應用程序啓動後,因爲它,我需要點擊在電子表格中,我可以點擊任何按鈕。

我使用AppActivate Application.ActiveWindow.CaptionSetForegroundWindowSetFocusWM_IME_SETCONTEXT通過SendMessage試圖與WM_IME_NOTIFY,但似乎沒有任何工作。我也嘗試過工作表Activate方法以及範圍Activate方法,但是在點擊按鈕之前,我仍然需要點擊工作表。

我原以爲這是可能的,因爲我從excel過程發送消息,我該如何激活電子表格?

+0

你可以發佈你的shell命令嗎?你用'vbNormalNoFocus'打開shell嗎? – Tim

+0

Hi @Tim,shell命令只有路徑參數。 –

+0

@Tim,我意識到我的評論是不明確的:我的意思是我只用一個參數來調用它......當我回到辦公桌時,我會嘗試你的建議。 –

回答

1

rules governing which objects can set the foreground window沒有得到滿足,這就是爲什麼我不能得到它的工作。

該系統限制哪些進程可以設置前景窗口。甲 過程可以設置前景窗口只有在下列 條件之一爲真:

  • 過程是前臺進程。

  • 該過程由前臺進程啓動。

  • 該進程收到最後一個輸入事件。
  • 沒有前臺進程。
  • 該進程正在調試。
  • 前臺進程不是現代應用程序或開始屏幕。
  • 前景未鎖定(請參閱LockSetForegroundWindow)。
  • 前臺鎖定超時已過期(請參閱SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 沒有菜單處於活動狀態。

當用戶 與另一個窗口一起工作時,應用程序無法強制窗口進入前臺。相反,Windows會閃爍窗口的任務欄 按鈕以通知用戶。

在我的情況下,我試圖讓excel激活其自己的窗口之一,但生成的應用程序已經接管了前景焦點,所以excel無力影響前景焦點。解決方案是從VBA嚮應用程序發送自定義消息,並將excel hWnd作爲參數,請求前景焦點。該應用程序然後可以調用SetForegroundWindow,並且因爲它滿足上面的第一個條件,所以excel的確是前景焦點。

相關問題