8 windows desktop resize window
我需要以编程方式并且最好还手动调整大于屏幕分辨率或桌面大小的窗口.
由于MS-Windows XP/Vista不允许窗口大于屏幕,有没有人有任何想法来解决这个限制?
我试图在笔记本电脑上制作泛音效果,为我提供更多工作空间.具有较小LCD尺寸的旧笔记本电脑确实具有这样的功能.
请参阅:http: //www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/98/Q_21832063.html
Max*_*mon 13
如果您想调整一个您不拥有的窗口(并且不使用任何类型的挂钩),您可以使用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 **
);
Run Code Online (Sandbox Code Playgroud)
这将阻止发送WM_WINDOWPOSCHANGING消息,这是触发WM_GETMINMAXINFO限制的消息.窗口的任何其他大小调整将导致限制将窗口捕捉回桌面受限大小,因为将发送消息并强制执行窗口大小.
以下是一个微小的示例程序,它将记事本调整为6000x6000(将字符串"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, 0, 0, 6000, 6000, NOCOPYBITS | NOSENDCHANGING | SHOWWINDOW);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法通常是有效的,但是有许多限制可能会阻止窗口调整大小或以任何有用的方式调整大小.
从Windows Vista开始,Microsoft已经实现了围绕窗口消息的增强安全性.可执行文件只能与其自身安全上下文之下或之下的窗口进行交互.例如,要调整"计算机管理"窗口(始终运行升高)的大小,此程序也必须升级.
窗口大小可以由程序被动地或主动地强制执行.强制执行大小的窗口被动地设置初始大小并且简单地暴露用户无法调整窗口大小的能力(例如,没有大小的抓握控制).这些窗口通常可以通过发送消息来调整大小,但缺少布局逻辑,不会显示任何其他空客户区.
具有活动强制执行的Windows 通过捕获诸如WM_SIZE之类的Windows消息或更复杂的布局逻辑来监视大小.这些窗口可能会接受该消息,但会限制或限制自己代码中的最终大小.
在任何一种情况下,具有固定大小的Windows通常缺少任何布局逻辑以利用更大的尺寸,因此,即使您可以强制它,调整它们也不会带来任何好处.
WindowWPF中的类具有HwndSource处理发送到WPF窗口的窗口消息.私有方法LayoutFilterMessage捕获WM_SYSCOMMAND,WM_SIZING,WM_WINDOWPOSCHANGING,和WM_SIZE消息.在这种情况下,该WM_SIZE消息然后由私有处理,其Process_WM_SIZE实际上绕过该NOSENDCHANGING标志并改变RenderSizeWPF客户区域.这是使旧版Win32消息适应WPF事件的整个过程的一部分.
实际效果是Win32 主机窗口的大小调整(除非SizeToContent设置为SizeToContent.WidthAndHeight),但WPF 渲染区域被锁定到桌面区域,就像没有设置NOSENDCHANGING标志一样.当针对WPF应用程序运行上述代码示例时,您可以从任务栏或Windows-Tab切换器中的窗口预览中看到Aero Peek中的6000x6000窗口,但您还可以看到被剪切为的WPF内容和布局逻辑桌面区域.通过这种方式,WPF窗口就像主动强制执行的窗口,但不是强制执行特定大小,而是强制执行特定的最大值(对于RenderArea)并且不考虑该WM_WINDOWPOSCHANGING消息.
如果它是您自己的应用程序并且您在Windows窗体窗口(通过ElementHost)中托管WPF,则可以调整窗口大小,并且WPF内容将尊重大于桌面的Windows窗体窗口.
其他框架(如GTK和Qt)可能会也可能不会强制执行大小行为和限制,并且可能有各种可行的方法来克服这些限制.任何给定的程序都可以忽略,重写或绕过窗口消息,并且框架可以在整个应用程序类(例如上面的WPF)中强制执行它.
有关SetWindowPos API的更多信息:
参考来源Process_WM_SIZE方法HwndSource:
Spa*_*arr -1
对于需要更适合屏幕的 MSDN 视图或任何其他未充分利用屏幕空间的网站(如 StackOverflow)的特定情况,我建议使用 IE7Pro 等工具将自定义样式表应用到页面(IE)、Greasemonkey (Firefox)、Stylish (Fireox) 或 Opera 中内置的样式表选择器。
| 归档时间: |
|
| 查看次数: |
19509 次 |
| 最近记录: |