2011-07-14 93 views
2

我有一個Delphi應用程序正在運行在一個環境中,它被另一個侵略性應用程序試圖完全佔用屏幕(它是POS的東西)最小化。當第二個應用程序啓動時,它會追蹤窗口並最小化它們,可能是通過枚舉窗口並用'ShowWindow(句柄,SW_MINIMIZE)'來敲擊它們。阻止其他程序最大限度地減少我的Win32應用程序

在我看來,要做的就是拿起這些命令並阻止調整大小/最小化消息到窗口。我試着繞過一些處理程序來嘗試捕獲這種行爲,但SW_MINIMIZE仍會隱藏它。除了通知消息,某些東西正在調整大小等,Winsight並沒有向我展示更多信息。我已經爲WMSysCommand消息放置了一個消息處理程序,但似乎只是停止了最小化按鈕被單擊的操作。我已經嘗試覆蓋WndProc函數來過濾消息,但是這並沒有削減它。

如果任何人都可以對ShowWindow(句柄,SW_MINIMIZE)調用在應用程序中產生的結果有所瞭解,我將非常感激!

感謝 特里

+0

您可以在較高的完整性級別運行您的應用程序,或者以較低的完整性級別運行其他應用程序(需要Vista或更高版本)。我認爲這可能會阻止較低的完整性應用程序被允許執行此操作。我沒有嘗試過,這是一個猜測。 –

+1

享受經典:[我如何創建一個從未被其他頂級窗口覆蓋的最上層窗口?](http://blogs.msdn.com/b/oldnewthing/archive/2011/03/10/10138969.aspx) –

+0

我必須讓它在XP和Win2k上工作,所以我想這是不可能的。不過我確實對這種方法感到驚訝,我看到了在MSDN文檔中允許它的調用。 – Terry

回答

4

什麼時候ShowWindow被調用SW_MINIMIZE爲「的nCmdShow」是窗口管理器最小化窗口發生。

系統將發送各種通知消息,一些更重要的是能夠進行最小化和應用程序可以進行操作,像WM_WINDOWPOSCHANGINGWM_GETMINMAXINFOWM_NCCALCSIZE,或有的只是來通知,像WM_WINDOWPOSCHANGEDWM_MOVEWM_SIZE,但通常情況下,這些都不是用於阻止操作。

最乾淨的方式,我想,如果你能決定的最小化是意想不到的,是一個WM_SIZE消息作出響應時「的wParam」是SIZE_MINIMIZED,並相應地恢復你的窗口。然後,你的表格會反彈,從任務欄後面:

type 
    TForm1 = class(TForm) 
    ... 
    private 
    procedure WmSize(var Msg: TWMSize); message WM_SIZE; 
    end; 

procedure TForm1.WmSize(var Msg: TWMSize); 
begin 
    inherited; 
    if (Msg.SizeType = SIZE_MINIMIZED) and IsUnexpectedMinimize then 
    PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 
end; 

我沒有你會如何決定是一個最小化是意外的或沒有,但它似乎你做任何明確的想法。用戶發起的操作會導致發送WM_SYSCOMMAND,但我不知道是否某些操作系統功能也可以這樣做,並且您可以區分操作系統是否最小化窗口或激進應用程序。

+2

如果你的客戶不喜歡你的窗口消失並稍後再出現,讓他們向干擾他們系統的POS供應商投訴。你和客戶一樣是受害者,所以確保他們知道。 –

+0

@Rob - 也許這是打擊這個唯一合理的方法。畢竟,其他應用程序可以變得更聰明,並執行各種最小化的方法。 –

+0

看起來像這可能是唯一的方式來處理這個,悲哀。謝謝你的幫助。 – Terry

0

窗口臨危WM_COMMAND消息不是WM_SYSCOMMAND

相關問題