簡體   English   中英

如果是模式窗口和非活動窗口,如何獲取最上面的窗口

[英]How to get the topmost window if it is modal and inactive

我想防止用戶在同一台​​計算機上多次運行我的應用程序,因此我使用了該線程的解決方案: 創建單實例應用程序的正確方法是什么?

可以,但是在打開模式窗口(例如,使用view.ShowDialog(); )時顯示我的應用程序時出現問題。 這是一個場景:

  1. 用戶運行我的應用程序並打開一個模式窗口。
  2. 然后,他嘗試再次運行我的應用程序,該應用程序的第二個實例的啟動過程中的代碼找到了另一個正在運行的應用程序,並向其廣播WM_SHOWME消息以顯示其自身。 然后,該應用程序的第二個實例終止。
  3. 第一個應用程序接收WM_SHOWME消息(使用“ 如何在WPF中處理WndProc消息?”中的解決方案)。 現在,它應該將最上面的窗口置於最前面,這是我的問題-如果最上面的窗口是模態的甚至不處於活動狀態,如何獲得應用程序的最上面的窗口? 我嘗試使用“ 參考WPF中的活動窗口”中的解決方案 但是當然我的窗戶沒有激活,所以這行不通。

PS-當應用程序正在運行並且打開了模式窗口,並且當我將鼠標懸停在任務欄中的圖標上時,我可以看到兩個窗口-主窗口和模式窗口。 我可以單擊主窗口(由於模態窗口位於其頂部,所以它被禁用了),也可以單擊模態窗口。 我的解決方案的工作方式就像單擊主窗口一樣,但是我希望它能夠激活最上面的窗口,在這種情況下是模態的。

那么,有什么主意如何將最上面的模態窗口(如果沒有顯示模態窗口,則顯示為主窗口)?

問題中描述的行為表明主窗口不擁有該對話框。

請注意,當對話框由(主)窗口擁有時,該窗口將無法覆蓋該對話框(該對話框通常始終位於該窗口的頂部)。 這還具有以下效果:將窗口置於最前面時,對話框也將位於窗口頂部的最前面-巧妙地解決了您遇到的問題。

為對話框(模式窗口)設置所有者非常容易。 在顯示對話框之前,只需將其Owner屬性設置為主窗口,類似於此示例:

Window modalWindow = ... create modal window instance
modalWindow.Owner = mainWindow;
modalWindow.ShowDialog();

(旁注:如果還希望僅在任務欄中顯示主窗口的圖標/縮略圖,則應將模式窗口的ShowInTaskbar屬性設置為false 。)

使應用程序成為給定計算機上單個實例的最佳解決方案是使用命名互斥體

互斥體

這是同一文檔的摘錄

互斥鎖有兩種類型:未命名的本地互斥鎖和已命名的系統互斥鎖。 本地互斥僅存在於您的進程中。 進程中任何引用了表示互斥量的互斥對象的線程都可以使用它。 每個未命名的互斥對象代表一個單獨的本地互斥體。 命名的系統互斥鎖在整個操作系統中都是可見的,可用於同步進程的活動。

您可以通過使用接受名稱的構造函數來創建一個代表命名系統互斥對象的Mutex對象。 可以同時創建操作系統對象,也可以在創建Mutex對象之前將其存在。 您可以創建代表相同命名系統互斥對象的多個Mutex對象,並且可以使用OpenExisting方法打開現有的命名系統互斥對象。

而且,無論如何,您都已經處理了要使第一個實例提前的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM