1

如何为我的应用程序禁用 Windows 7 的快照功能(以编程方式)?或者有什么方法可以检测应用程序是否已被捕捉,并专门调用 API 函数来取消捕捉它?

调用 SetWindowPos() 或 ShowWindow() 并不能正确解开它 *(SW_MAXIMIZE 可以)。调用 SetWindowPos() 实际上会在以后调用 SetWindowPos() 和 MoveWindow() 时导致奇怪的行为。相同的不一致不适用于最大化的窗口。

4

2 回答 2

0

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

于 2013-10-29T14:58:18.770 回答
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 将在随后的消息循环中处理 - 这意味着在进入移动大小循环后尽快。如果您使用自己的框架绘制方法,请不要忘记在WM_STYLECHANGED消息上正确重绘框架,内部存储 oldStyle 在您的类中。为什么它有效?Windows 在移动/大小操作开始时检查捕捉条件。如果WS_MAXIMIZEWS_MAXIMIZEBOX在开始时被禁用,则捕捉行为被禁用。

SC_SIZE|9相当于SC_MOVE|2半秒内不阻塞重绘。

如果您不想在窗口完全最大化的情况下启用拖动最大化窗口,请检查系统菜单中 SC_MOVE 项的状态,如果已启用,则直接在WM_SYSCOMMAND.

在 Windows 8.1 上验证。

于 2017-09-09T15:42:00.813 回答