WINDOWPLACMENT 的 showCmd...始终为 1?

swt*_*rgn 1 c++ winapi

当我执行 get 操作时GetWindowPlacementWINDOWPLACEMENT::showCmd似乎总是 1,即SW_SHOWNORMAL

有谁知道为什么会这样以及是否已更新?有谁知道这个变量是由应用程序本身维护还是由操作系统维护?

我在 Windows 7 上运行这个。


我使用它来实现与此线程中提到的相同目的:我试图撤消以前显示的隐藏窗口,而不将隐藏窗口存储在内存中(隐藏/显示将在不同的运行会话中调用)或磁盘上。

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我在隐藏后所做的一个示例(notepad.exe 的 pid)的输出hwnd#00060CD0

003D0642
BEFORE: 0
AFTER: 1
000B0682
BEFORE: 0
AFTER: 1
00060CD0
BEFORE: 0
AFTER: 1
Run Code Online (Sandbox Code Playgroud)

我试图用来GetWindowPlacement区分始终隐藏的窗口和之前显示的窗口。即使对于始终隐藏的窗口,它似乎也永远不会为 0。

Ken*_*ite 5

showCmdafter call的值只有三个可能GetWindowPlacement

来自 MSDN 文档GetWindowPlacement重点是我的):

此函数检索的 WINDOWPLACEMENT 的 flags 成员始终为零。如果hWnd参数标识的窗口最大化,则showCmd成员为SW_SHOWMAXIMIZED。如果窗口最小化,则 showCmd 为 SW_SHOWMINIMIZED。否则,它是SW_SHOWNORMAL。

因此,当您调用 时,您要求提供展示位置信息的窗口似乎处于非最大化或最小化状态GetWindowPlacement

我怀疑你真正要找的是什么IsWindowVisible

  • 您应该如何确定窗口是否“始终隐藏”。创建不可见窗口的唯一方法是在传递给 CreateWindow 的标志中不包含 WS_VISIBLE ,并且任何后续调用更改可见性的 ShowWindow 或 SetWindowPos 都会打开或关闭此标志;它不会保留窗口创建时的原始状态。 (2认同)