2013-06-05 57 views
0

當我做GetWindowPlacement時,WINDOWPLACEMENT::showCmd似乎總是1,這是SW_SHOWNORMALWINDOWPLACEMENT的showCmd ...總是1?

有誰知道這是爲什麼,如果它被更新?有誰知道這個變量是由應用程序本身還是由操作系統維護的?

我在Windows 7


我用這作爲this thread提到的達到同樣的目的運行這樣的:我試圖撤消不存儲在隱藏的窗口以前顯示隱藏的窗口內存(隱藏/顯示將在不同的運行會話中調用)或磁盤上。

void hide(const unsigned int pid){ 
    std::list<HWND> windowList = getWindowbyPID(pid); 
    for(std::list<HWND>::iterator it = windowList.begin(); it != windowList.end(); it++){ 
    if(IsWindowVisible(*it)){ std::cout << "Hid WIN#" << *it << std::endl; ShowWindow(*it,SW_HIDE); } 
    } 
} 

void show(const unsigned int pid){ 
    std::list<HWND> windowList = getWindowbyPID(pid); 
    for(std::list<HWND>::iterator it = windowList.begin(); it != windowList.end(); it++){ 
    //if(IsWindowVisible(*it)){ ShowWindow(*it,SW_SHOW); } 
    WINDOWPLACEMENT wp; 
    wp.length = sizeof(wp); 
    wp.showCmd = 0; // Just to clear showCmd before reading. 
    std::cout << *it << std::endl; 
    std::cout << "BEFORE: " << wp.showCmd << std::endl; 
    GetWindowPlacement(*it,&wp); 
    std::cout << "AFTER: " << wp.showCmd << std::endl; 
    } 
} 

輸出,我躲在hwnd#00060CD0後做(NOTEPAD.EXE的PID)一個例子:

003D0642 
BEFORE: 0 
AFTER: 1 
000B0682 
BEFORE: 0 
AFTER: 1 
00060CD0 
BEFORE: 0 
AFTER: 1 

我試圖用GetWindowPlacement區分總是隱藏的窗戶和窗戶之前已經顯示過。即使對於始終隱藏的窗戶,它似乎從不爲0。

+0

在嘗試使用結果之前,您應該始終檢查OS調用的結果。但主要問題由@Ken描述 – Luis

+0

將隱藏/顯示狀態存儲在自定義屬性中。 –

回答

3

調用GetWindowPlacement之後,showCmd只有三個可能的值。

從MSDN文檔上GetWindowPlacement強調礦):

由該函數檢索WINDOWPLACEMENT的標誌構件始終爲零。 如果由hWnd參數標識的窗口最大化,則showCmd成員爲SW_SHOWMAXIMIZED。如果窗口最小化,showCmd是SW_SHOWMINIMIZED。否則,它是SW_SHOWNORMAL。

因此,看來你問的窗口位置信息對在不同於最大化或者當你調用GetWindowPlacement最小化的狀態。

我懷疑你實際上是在尋找的是IsWindowVisible

+0

是的,你是對的。我錯過了。 'IsWindowVisible'不會執行,因爲我不想顯示一個始終隱藏的窗口。 – swtdrgn

+1

你如何確定一個窗口「總是隱藏」?創建不可見窗口的唯一方法是在傳遞給'CreateWindow'的標誌中不包含'WS_VISIBLE',並且隨後調用'ShowWindow'或'SetWindowPos'改變可見性將打開或關閉此標誌;它不保留窗口創建時的原始狀態。 –

+0

我很害怕聽到這個消息,但是謝謝你與我分享你的專業知識。 – swtdrgn