gpt4 book ai didi

windows - 创建大于桌面的窗口(显示分辨率)

转载 作者:可可西里 更新时间:2023-11-01 13:00:12 25 4
gpt4 key购买 nike

我需要以编程方式调整大于屏幕分辨率或桌面大小的窗口大小,最好也手动调整。

由于 MS-Windows XP/Vista 不允许大于屏幕的窗口大小,有没有人有任何想法来解决这个限制?

我试图在笔记本电脑上制作平移效果,以便给我更多的工作空间。具有较小 LCD 尺寸的旧笔记本电脑确实具有这样的功能。

看到这个:
http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/98/Q_21832063.html

最佳答案

如果您想调整不属于您的窗口的大小(并且不使用任何类型的 Hook ),您可以使用设置了 SWP_NOSENDCHANGING (0x0400) 标志的 Windows SetWindowPos API:

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 **
);

这将阻止发送 WM_WINDOWPOSCHANGING 消息,这是触发 WM_GETMINMAXINFO 限制的原因。窗口的任何其他大小都会导致限制将窗口捕捉回桌面限制大小,因为将发送消息并强制执行窗口大小。

窗口调整器 (C#)

下面是一个将 Notepad 大小调整为 6000x6000 的小示例程序(将字符串“Untitled - Notepad”更改为要调整大小的窗口的标题,或从命令行参数中获取窗口名称和所需大小)
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);
}
}
}

限制和注意事项

这种方法通常是有效的,但有许多限制可能会阻止调整窗口大小或以任何有用的方式调整大小。

安全

从 Windows Vista 开始,Microsoft 已针对窗口消息实现了更高的安全性。可执行文件只能与处于或低于其自身安全上下文的窗口进行交互。例如,要调整“计算机管理”窗口的大小(始终以提升的方式运行),该程序也必须以提升的方式运行。

固定窗口和布局逻辑

窗口大小可能由程序被动或主动强制执行。具有强制大小的窗口被动地设置初始大小,并且简单地向用户公开调整窗口大小的能力(例如,没有大小控制)。这些窗口通常可以通过发送如上所述的消息来调整大小,但是由于缺乏布局逻辑,除了额外的空白客户区外,不会显示任何其他内容。

具有主动强制执行功能的窗口通过捕获诸如 WM_SIZE 之类的窗口消息或更复杂的布局逻辑来监视大小。这些窗口可能会接受消息,但会在自己的代码中限制或限制最终大小。

在任何一种情况下,具有固定尺寸的 Windows 通常缺乏任何布局逻辑来利用更大的尺寸,因此,即使您可以强制它,调整它们的大小也没有任何好处。

WPF
Window WPF 中的类有一个 HwndSource处理发送到 WPF 窗口的窗口消息。私有(private)方法 LayoutFilterMessage catch WM_SYSCOMMAND , WM_SIZING , WM_WINDOWPOSCHANGING , 和 WM_SIZE消息。在这种情况下, WM_SIZE然后消息由私有(private) Process_WM_SIZE 处理这实际上绕过了 NOSENDCHANGING标记并更改 RenderSize WPF 客户区。这是将旧版 Win32 消息适应 WPF 事件的整个过程的一部分。

最终效果是调整了 Win32 主机窗口的大小(除非将 SizeToContent 设置为 SizeToContent.WidthAndHeight),但 WPF 呈现区域被锁定到桌面区域,就好像没有设置 NOSENDCHANGING 标志一样。当上面的代码示例针对 WPF 应用程序运行时,您可以从任务栏或 Windows-Tab 切换器中的窗口预览中看到 Aero Peek 中的 6000x6000 窗口,但您也可以看到 WPF 内容和布局逻辑被剪切到桌面区域。这样,WPF 窗口就像主动强制执行的窗口,但不是强制执行特定大小,而是强制执行特定最大值(对于 RenderArea)并且不考虑 WM_WINDOWPOSCHANGING信息。

如果它是您自己的应用程序并且您在 Windows 窗体窗口中托管 WPF(通过 ElementHost),您可以调整窗口大小,WPF 内容将尊重大于桌面的 Windows 窗体窗口。

其他框架

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

有关 SetWindowPos API 的更多信息:
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx
  • Process_WM_SIZE的引用来源 HwndSource的方法:

    http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Interop/HwndSource.cs,da4aa32ad121c1b9,references

    关于windows - 创建大于桌面的窗口(显示分辨率),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/445893/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com