Windows o WPF事件

Windows o WPF事件,windows,resize,window,desktop,Windows,Resize,Window,Desktop,最终的效果是调整Win32主机窗口的大小(除非SizeToContent设置为SizeToContent.WidthAndHeight),但WPF渲染区域锁定到桌面区域,就好像没有设置NoSendChangeing标志一样。当上面的代码示例针对WPF应用程序运行时,您可以从任务栏或Windows选项卡切换器中的窗口预览中看到Aero Peek中的6000x6000窗口,但也可以看到WPF内容和布局逻辑被剪裁到桌面区域。这样,WPF窗口就像主动执行的窗口,但不是强制执行一个特定的大小,而是强制执行

最终的效果是调整Win32主机窗口的大小(除非SizeToContent设置为SizeToContent.WidthAndHeight),但WPF渲染区域锁定到桌面区域,就好像没有设置NoSendChangeing标志一样。当上面的代码示例针对WPF应用程序运行时,您可以从任务栏或Windows选项卡切换器中的窗口预览中看到Aero Peek中的6000x6000窗口,但也可以看到WPF内容和布局逻辑被剪裁到桌面区域。这样,WPF窗口就像主动执行的窗口,但不是强制执行一个特定的大小,而是强制执行一个特定的最大值(对于ReRealStand),并且不考虑<代码> WMyWistoWoPosivs消息。 如果它是您自己的应用程序,并且您在Windows窗体窗口中托管WPF(通过
ElementHost
),您可以调整窗口大小,WPF内容将考虑比桌面Windows窗体窗口更大的窗口

其他框架 GTK和Qt等其他框架可能会也可能不会强制执行大小行为和限制,并且可能有各种解决方法来克服这些限制。任何给定的程序都可以忽略、重写或绕过窗口消息,框架可以在整个应用程序类(如上面的WPF)中强制执行它

有关SetWindowPos API的更多信息:

过程\u WM\u大小的参考源
HwndSource方法


您可以在WinProc()中执行类似以下代码的操作


应用程序可以使用此消息覆盖窗口的默认最大化大小和位置,或其默认最小或最大跟踪大小。

我需要将窗口的一部分从屏幕顶部推出,我最终能够使用以下自动热键脚本完成此操作:

SetTitleMatchMode, 2
WinTitle := "Visual Studio Code"

; --- WinMove version

; WinMove, %WinTitle%, , 0, -64, 1280, 1504

; -- DLL version

WinGet, id, , %WinTitle%
Result := DllCall("SetWindowPos", "uint", id, "uint", HWND_TOP, "Int", 0, "Int", -64, "Int", 1280, "Int", 1504, "UInt", 0x400)

(我想通过完全隐藏程序本身无法配置的标题栏和选项卡部分来最大化VSCode的编辑器区域。)

这很好,但我没有找到一种方法使这个更大的虚拟桌面上的窗口实际上与虚拟桌面一样大。它们仍然受到真实桌面大小的限制。遗憾的是,这是有效的。如果微软有一些注册表选项或者我们可以用来关闭默认窗口大小限制的东西,那就太好了。哇。它真的起作用了!为什么没有更多的选票?这是最好的解决方案!谢谢你,阿森。不仅如此,它还两次被否决,没有就原因发表评论。这就是生活。至少它仍然是为有需要的人准备的。最初的询问者“Nelson”不再是一个帐户。上面的“测试”帐户可能是OP,但也因此没有被接受的答案。使用windows 10进行测试后,似乎不再有效:(他说,“我试图在笔记本电脑上制造泛光效果,以给我更多的工作空间。一台LCD尺寸较小的老式笔记本电脑确实有这样的功能。”这意味着他想调整窗口,他不是在编写代码,因为它是更先进的,但是应该有一点代码注入……每个程序都会不同。注入到Python vs. .net和C++中会有所不同。下面我概述的答案,加上设置全局窗口钩子,可以去除WINDOW。w大小限制一般来说,不管可执行目标是什么,-1因为没有给出
base.WndProc(ref m);
的用法和未提供的代码的示例。没有这一点,我觉得答案是无用的
BOOL WINAPI SetWindowPos(
__in      HWND hWnd,
__in_opt  HWND hWndInsertAfter,
__in      int X,
__in      int Y,
__in      int cx,
__in      int cy,
__in      UINT uFlags // ** SWP_NOSENDCHANGING must be passed here **
);
namespace Example
{
 class Program
 {
  [DllImport("USER32.DLL")]
  public static extern IntPtr FindWindow(String className, String windowName);

  [DllImport("USER32.DLL", SetLastError = true)]
  public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int left, int top, int width, int height, uint flags);

  static void Main(string[] args)
  {
   var TOP = new IntPtr(0);
   uint SHOWWINDOW = 0x0040, NOCOPYBITS = 0x0100, NOSENDCHANGING = 0x0400;
   var hwnd = FindWindow(null, "Untitled - Notepad");
   SetWindowPos(hwnd, TOP, 0, 0, 6000, 6000, NOCOPYBITS | NOSENDCHANGING | SHOWWINDOW);
  }
 }
}
case WM_GETMINMAXINFO:
    {
        LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; 
        GetWindowRect(GetDesktopWindow(), &actualDesktop);
        lpmmi->ptMaxTrackSize.x = 3000;// set the value that you really need.
        lpmmi->ptMaxTrackSize.y = 3000;// set the value that you really need.
    }
    break;
SetTitleMatchMode, 2
WinTitle := "Visual Studio Code"

; --- WinMove version

; WinMove, %WinTitle%, , 0, -64, 1280, 1504

; -- DLL version

WinGet, id, , %WinTitle%
Result := DllCall("SetWindowPos", "uint", id, "uint", HWND_TOP, "Int", 0, "Int", -64, "Int", 1280, "Int", 1504, "UInt", 0x400)