创build比桌面大的窗口(显示分辨率)

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

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

我试图在笔记本电脑上制作泛音效果,给我更多的工作空间。 一个较小的LCD尺寸的笔记本电脑确实有这样的function。

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

如果您想调整不属于您的窗口的大小(并且不使用任何形式的钩子),则可以使用设置了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#)

下面是一个小例子程序,将记事本的大小调整为6000×6000(将“无标题 – 记事本”字符串更改为要调整大小的窗口的标题,或者从命令行参数中获取窗口名称和所需的大小)

 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围绕窗口消息实现了越来越高的安全性。 一个可执行文件只能与自己的安全上下文中的窗口进行交互。 例如,要调整“计算机管理”窗口(总是运行提升),这个程序也必须运行。

修复了Windows和布局逻辑

窗口大小可能被程序强制执行。 被动执行大小的窗口会设置初始大小,并且仅显示用户无法调整窗口大小的能力(例如,没有大小控制控制)。 这些窗口通常可以通过发送消息来调整大小,但缺少布局逻辑, 不会显示其他空白客户端区域。

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

无论哪种情况,具有固定大小的Windows通常都缺乏布局逻辑来利用较大的尺寸,因此,即使可以强制执行,调整它们的大小也不会带来任何好处。

WPF

WPF中的Window类有一个处理发送到WPF窗口的窗口消息的HwndSource 。 私有方法LayoutFilterMessage捕获WM_SYSCOMMANDWM_SIZINGWM_WINDOWPOSCHANGINGWM_SIZE消息。 在这种情况下, WM_SIZE消息然后由专用的NOSENDCHANGING处理,该处理实际上绕过了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的更多信息:

HwndSource Process_WM_SIZE方法的参考源:

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

在C#中的这个代码做你所问。 窗口比桌面还宽。

  protected override void WndProc(ref Message m) { if (m.ToString().Contains("GETMINMAXINFO")) { //Hent data MINMAXINFO obj = (MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(MINMAXINFO)); //Endre if (obj.ptMaxSize.X > 0) { obj.ptMaxSize.X = 60000; obj.ptMaxSize.Y = 60000; obj.ptMaxTrackSize.X = 60000; obj.ptMaxTrackSize.Y = 60000; //Oppdater Marshal.StructureToPtr(obj, m.LParam, true); } } if (m.ToString().Contains("WINDOWPOSCHANGING")) { //Hent data WINDOWPOS obj = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS)); //Endre if (obj.cx > 0) { obj.cx = 8000; //Oppdater Marshal.StructureToPtr(obj, m.LParam, true); } } //Debug.WriteLine(m.ToString()); base.WndProc(ref m); } [StructLayout(LayoutKind.Sequential)] internal struct WINDOWPOS { internal IntPtr hwnd; internal IntPtr hWndInsertAfter; internal int x; internal int y; internal int cx; internal int cy; internal uint flags; } [StructLayout(LayoutKind.Sequential)] internal struct MINMAXINFO { internal POINT ptReserverd; internal POINT ptMaxSize; internal POINT ptMaxPosition; internal POINT ptMinTrackSize; internal POINT ptMaxTrackSize; } [StructLayout(LayoutKind.Sequential)] internal struct POINT { internal int X; internal int Y; } 

你可以在你的WinProc()中做下面的代码。

 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; 

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

如果您的显卡可以连接多个屏幕,则另一个解决方法是将您的系统设置为使用彼此相邻的两个屏幕。 然后你可以调整你的窗口大小的两个屏幕一起。

只列出推荐的屏幕分辨率。 有关其他设置,请单击Settings选项卡上的Advanced按钮,单击Adapter tab ,然后单击List all Modes 。 选择所需的分辨率,颜色级别和刷新率。

我刚刚做到了,在这里你可以找到答案的最后一点。

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/display_change_screen_resolution.mspx?mfr=true

对于需要对MSDN更友好的屏幕视图的特定情况,或者在任何其他网站(如StackOverflow)使用屏幕不动产的情况下,我建议将自定义样式表应用到页面上,使用类似IE7Pro (IE),Greasemonkey(Firefox),Stylish(Fireox)或Opera中内置的样式表选择器。

好的,我尝试使用击键移动,调整窗口大小。 但系统会自动将窗口移回到我的XP桌面的可见区域。 我也试过SetWindowPos API,没有帮助。 最好的机会是写一个视频驱动程序,但可能需要更多的学习。 360桌面声称你可以水平扩展桌面。 但实际上,它只是在虚拟的更广阔的空间中平移当前的桌面。 里面的任何窗口仍然有不超过你的屏幕分辨率的大小限制。

视频驱动程序设置屏幕分辨率(是的,必须兼容lcd / crt屏幕功能),并且Windows通过此阈值限制了窗口大小。 我只是想在用户空间API中解决。

窗口大小似乎取决于桌面大小,而不是屏幕分辨率; 但桌面符合解决方案。 诀窍可能是更改桌面大小或从那里开始。

前一段时间,名为Robert Bresner( 他的网站 )的开发者制作了一个名为sDesk的产品( 可以从这里下载 ),它将Windows扩展到屏幕分辨率之外。

什么是SDesk? SDesk不是一个多桌面程序。 这是一个程序,创建一个超出显示器可见区域的巨大桌面。 根据Windows桌面设置的定义,一次只能看到一部分SDesk。

SDesk软件的原始主页在这里存档在互联网上没有当前页面(我可以找到),但是这个存档的版本是通过Way Back Machine访问的,它缓存了很多互联网。

SDesk产品是免费的。 尽管没有包含源代码。 您可以访问他的联系页面(也可以在存档版本中),询问您的研究来源是否可用。