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

前端之家收集整理的这篇文章主要介绍了windows – 创建大于桌面的窗口(显示分辨率)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要调整一个大于屏幕分辨率或桌面大小的窗口,以编程方式和优选地也可以手动

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

我试图在笔记本电脑上制作泛音效果,为我提供更多工作空间.具有较小LCD尺寸的旧笔记本电脑确实具有这样的功能.

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

如果您想调整一个您不拥有的窗口(并且不使用任何类型的挂钩),您可以使用Windows SetWindowPos API并设置SWP_NOSENDCHANGING(0x0400)标志:
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#)

以下是一个微小的示例程序,它将记事本调整为6000×6000(将字符串“Untitled – Notepad”更改为要调整大小的窗口的标题,或从命令行args获取窗口名称和所需大小)

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,6000,NOCOPYBITS | NOSENDCHANGING | SHOWWINDOW);
  }
 }
}

限制和警告

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

安全

从Windows Vista开始,Microsoft已经实现了围绕窗口消息的增强安全性.可执行文件只能与其自身安全上下文之间或之下的窗口进行交互.例如,要调整“计算机管理”窗口(始终运行升高)的大小,此程序也必须升级.

修复了Windows和布局逻辑

窗口大小可以由程序被动地或主动地强制执行.具有强制执行的大小的窗口被动地设置初始大小并且简单地暴露用户无法调整窗口大小的能力(例如,没有大小的抓握控制).这些窗口通常可以通过发送消息来调整大小,但缺少布局逻辑,不会显示任何其他空客户区.

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

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

WPF

WPF中的Window类有一个HwndSource,用于处理发送到WPF窗口的窗口消息.私有方法LayoutFilterMessage捕获WM_SYSCOMMAND,WM_SIZING,WM_WINDOWPOSCHANGING和WM_SIZE消息.在这种情况下,WM_SIZE消息由私有Process_WM_SIZE处理,实际上,它绕过NOSENDCHANGING标志并改变WPF客户区的RenderSize.这是使旧版Win32消息适应WPF事件的整个过程的一部分.

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

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

其他框架

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

有关SetWindowPos API的更多信息:

> http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx

HwndSource的Process_WM_SIZE方法的参考源:

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

猜你在找的Windows相关文章