2012-04-04 56 views
1

有沒有辦法撤銷對AllowSetForegroundWindow(ASFW_ANY)的調用?撤消/重置AllowSetForegroundWindow()調用

的大圖:

  • 我希望我的exe文件的同時運行一個進程。
  • 爲了實現這個目標,如果一個進程已經存在,那麼這個進程就會使用命名管道&相互通信,它的窗口必須放在前面。
  • 爲了能夠做到這一點,最新的過程必須設置AllowSetForegroundWindow()與現有的進程ID。
    • 我不想獲取進程ID(對不起我的懶惰),所以我打算做的是:1.用ASFW_ANY撥打AllowSetForegroundWindow() 2.爲防萬一發生錯誤,請撤消撥打AllowSetForegroundWindow()這樣別人就不能從我的過程中竊取焦點。

在簡單的話,我想允許其它進程從我偷的焦點,僅在特定的時間窗口...

任何一個面臨着類似的問題早,發現什麼解決辦法?

另外,請讓我知道如果您有任何更好的建議/替代...

+0

你可以完全擺脫'AllowSetForegroundWindow'調用。當現有流程需要關注時,它會詢問最新流程。如果沒有請求進入,那麼最新的進程什麼也不做。 – 2012-04-04 19:28:09

+0

@RaymondChen我沒有得到它......如果有請求進入,最新進程應該做什麼? – 2012-04-05 05:11:44

+1

你說這兩個進程(稱它們爲A和B)已經彼此通信,並且你有A調用'AllowSetForegroundWindow',以防B想調用'SetForegroundWindow'。相反,只需讓B告訴A,「請在此窗口上爲我調用'SetForegroundWindow'。」 – 2012-04-05 08:07:38

回答

2

According to the documentation,目標進程(大概包括「任何」)將失去從你下一次偷焦點的能力,你請致電AllowSetForegroundWindow

換句話說,聽起來你一次只能有一個這樣的權限。

因此,您應該可以通過調用一些不存在的ID或者您自己的進程ID來取消權限。這是理論,但是,我沒有測試它。

我個人只是通過命名管道發送目標進程ID。

+0

我試圖通過設置NULL作爲參數,它沒有工作......我會嘗試用自己的進程ID,並將更新... – 2012-04-04 14:59:40

+0

我的管道通信是有點限制(非技術原因)..給自己進程ID作爲參數工作如預期...謝謝! :) – 2012-04-04 15:06:22

0

如果我明白您的主要要求是一次只運行一個應用程序實例。如果你所描述的其他東西只是服從於這個要求,而不是某個更宏大的計劃的一部分,那麼實現這一點就更簡單了。

當您的應用程序啓動時,您可以創建全局命名互斥鎖。所有其他實例都會看到這個互斥體,並立即退出。這裏的快速和骯髒的吧:

// Multiple instances detection 
HANDLE my_mutex = ::CreateMutex(NULL, FALSE, "Global\\MyCuteFluffyMutex"); 

int create_mutex_error = ::GetLastError(); 
bool already_running = 
      (my_mutex && (create_mutex_error == ERROR_ALREADY_EXISTS)) 
     || (create_mutex_error == ERROR_ACCESS_DENIED); 

if (!already_running) { 
    // Run my application 
} 

::CloseHandle(my_mutex); 

有關更詳盡的信息上CreateMutex及其參數諮詢documentation

+0

儘管這是主要目標,但當進程位於不同的桌面(即不同的用戶空間)時,我的應用程序邏輯會變得複雜。因此,我已經開始使用命名管道了。 – 2012-04-04 15:15:38

+0

如果不是'Global',而是用'Local'作爲互斥體名稱的前綴,它將只對當前會話中的其他進程可見,而不是跨桌面。其他桌面上的實例將不知道且不受影響。 – irobot 2012-04-04 15:26:43

+0

讓我解釋爲什麼我說複雜: - 我想限制在全球一級的單一進程,但方式稍有不同。 - 當可執行文件也在用戶B的空間中運行時,假定用戶A啓動該進程。因此,A的過程要求B中的過程退出,即;在某些情況下,我希望新流程從現有流程中進行控制。 – 2012-04-04 16:15:01