Win32阻止窗口“快照”

时间:2013-10-29 14:31:34

标签: winapi window-style window-position

如何为我的应用程序禁用Windows 7的快照功能(以编程方式)?或者有没有办法检测应用程序是否已被捕捉,并特别调用API函数来解除它?

调用SetWindowPos()或ShowWindow()不会正确解除它*(SW_MAXIMIZE)。在将来调用SetWindowPos()和MoveWindow()时,调用SetWindowPos()实际上会导致奇怪的行为。相同的不一致性不适用于最大化的窗口。

2 个答案:

答案 0 :(得分:0)

通过使用SW_MAXIMIZE调用ShowWindow(),我想出了一种解除绑定的方法。这是奇怪的,因为没有其他值与此调用解除绑定,即使窗口可以移开,它仍然锚定在屏幕的一侧。最大化它可以解决问题,然后我可以将窗口移动到需要的位置。

答案 1 :(得分:0)

#define WM_RESTOREORIGINALSTYLE WM_USER+... /* your first free USER message */

case WM_SYSCOMMAND:
{
   if(wParam==(SC_MOVE|2)) wParam=SC_SIZE|9;
   if((wParam&0xFFE0)==SC_SIZE && (wParam&0x000F)) // handles MOVE and SIZE in one "if"
   {
      long int oldStyle=GetWindowLongW(hwnd,GWL_STYLE);
      PostMessageW(hwnd,WM_RESTOREORIGINALSTYLE,GWL_STYLE,oldStyle);
      SetWindowLongW(hwnd,GWL_STYLE,oldStyle &0xFEFEFFFF); // disable WS_MAXIMIZE and WS_MAXIMIZEBOX
      DefWindowProcW(hwnd,WM_SYSCOMMAND,wParam,lParam);
      return 0;
   }
   return DefWindowProcW(hwnd,WM_SYSCOMMAND,wParam,lParam);
}
case WM_RESTOREORIGINALSTYLE:
{
   if((long int)wParam==GWL_STYLE)
      SetWindowLongW(hwnd,GWL_STYLE,lParam);
   return 0;
}

PostMessage将在后续的消息循环中处理 - 它意味着在进入move-size循环后ASAP。 如果您使用自己的框架绘图方法,请不要忘记在WM_STYLECHANGED消息上正确重绘框架,在内部将oldStyle存储在您的类中。 为什么会这样? Windows在移动/大小操作开始时检查捕捉条件。如果在开始时禁用WS_MAXIMIZEWS_MAXIMIZEBOX,则会禁用快照行为。

SC_SIZE|9相当于SC_MOVE|2而没有阻止重绘半秒。

如果您不想启用拖动最大化窗口(如果它们已完全最大化),请检查系统菜单中SC_MOVE项目的状态,如果已启用,则直接在WM_SYSCOMMAND中返回0。

在Windows 8.1上验证。