`

VC++: 在双显示器间,移动最大化的窗口

阅读更多

最近升级成了双显示器,

以前只是知道双显示器爽,但用过之后才知道,原来这么爽。

 

然而美中不足,我也发现了一点小问题,就是我经常有这样一个需求:

有一个程序,已经被最大化了,我要将它从一个显示器移动到另一个显示器上面,同时仍然保持最大化。

 

以前要完成这个事情,我需要首先将此程序还原,移动到另一个显示器,再将其最大化。

这回的目的就是将这一系列繁琐的过程自动化掉。 使用VC++ 2008实现。

程序的功能是只要一运行它,就将当前的活动窗口移动到另一个显示器上面,并实现最大化。

至于这个程序的运行时机,叫给AutoHotKey,或者Launchy来完成。

 

首先创建一个工程,我觉得最合适的模板是:

【Visual C++】->【Win32】->【Win32 Console Application】

并在向导设置Application type为:Windows application。

其实这个类型本无所谓。但我之所以喜欢这个模板是因为:

首先,我不想看到那个黑呼呼的dos窗口,执行这个命令的时候他不美观不要紧,

更关键的是在我去取活动窗口的时候, 会取到他自己。

其次我也不喜欢我这小小的功能还要弄出一个窗口来(vs2008中mfc的入口貌似又一次被封装了,我找不到头了。)

 

也正因为此,我在创建完上述模板后,做的第一件事情就是将入口:_tWinMain 的函数体,替换为下面代码。

 

	int const width_move  = ::GetSystemMetrics(SM_CXSCREEN);

	//step 01, hide app: launchy
	//if used in AutoHotKey(http://www.autohotkey.com/),  set this flag to false.
	//if used in Launchy   (http://www.launchy.net/),     set this flag to true.
	int use_launchy = 0;
	if (use_launchy)
	{
		HWND  hWnd_launchy  = ::GetForegroundWindow();
		::ShowWindow(hWnd_launchy,SW_HIDE);
	}

	//step 02, normalize the target window
	HWND  hWnd  = ::GetForegroundWindow();
	::ShowWindow(hWnd,SW_NORMAL);


	//step 03, move window
	RECT rect;
	::GetWindowRect(hWnd,&rect);

	if (rect.left>=0)
	{
		rect.left = rect.left - width_move;
		rect.right = rect.right - width_move; 
	} 
	else
	{
		rect.left = rect.left + width_move;
		rect.right = rect.right + width_move;
	}

	::SetWindowPos(hWnd,HWND_TOP,rect.left, rect.top , rect.right - rect.left ,rect.bottom - rect.top , SWP_SHOWWINDOW);

	//step 04, maximize target window again.
	::ShowWindow(hWnd,SW_SHOWMAXIMIZED);
 

 

这就一切ok啦~ 编译,然后放到AutoHotKey,或者Launchy里面行啦~

 

需要说明的是:

1. 关于上述程序中的常量: width_move

    我没有做仔细的调查,如果两个显示器大小不一样,可能需要调整。

    对于我目前的需求,设置成主显示器的宽度够用。

 

2. 关于上述程序中的变量: use_launchy

    如果在launchy中使用,我要去的窗口其实是除了Launchy以外的最前窗口。

    所以我要先把Launchy隐藏掉。

 

 

 

 

 

 

分享到:
评论
1 楼 wjason 2012-07-11  
想在多显示器间快速移动窗口, 可以参考下面这篇新博客.
下面这篇博客的方法更简单

AutoHotkey:使用快捷键,在双显示器间,移动最大化的窗口
http://wjason.iteye.com/blog/1584859

相关推荐

    04-VC6.0副屏显示、双屏显示.zip

    1. **最大化窗口**:如果你希望充分利用副屏空间,可以选择最大化VC6.0窗口以填满整个第二显示器。 2. **快捷键操作**:VC6.0支持自定义快捷键,创建一些用于在窗口间切换的快捷键可以极大提高效率。 3. **布局...

    VC实现Windows多显示器编程的方法

    本文主要探讨了如何使用VC++来实现这一功能,包括获取屏幕分辨率、显示器参数以及如何进行窗口移动等操作。 首先,Windows系统支持两种多显示器模式:复制屏幕和扩展屏幕。在复制模式下,所有显示器显示相同的内容...

    vc中让窗口全屏显示

    在Windows API中,每个窗口都有其特定的样式,这些样式决定了窗口的各种特性,如是否有标题栏(WS_CAPTION)、是否可最大化(WS_MAXIMIZEBOX)等。通过`GetWindowLong`函数可以获取窗口的当前样式,而`SetWindowLong...

    vc 界面美工资料集锦

    开发者需要处理窗口的边界和最大化状态,确保在全屏和普通模式间平滑切换。 3. **树状视图**:树状视图是一种常见的数据展示方式,常用于文件管理器或选项设置中。它由节点组成,节点之间有层级关系,可以折叠和...

    VC++实现全屏功能演示代码

    // 禁用最大化 EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); // 禁用关闭 } // 隐藏滚动条 ModifyStyle(WS_HSCROLL, 0); ModifyStyle(WS_VSCROLL, 0); ``` 5. 触发全屏切换事件: 你可以通过一个按钮或...

    MFC图形图像处理及绘图软件设计.doc

    4. 自定义`CSave`类来存储图形信息,如线条、矩形等的坐标,然后在`OnDraw`中根据这些信息重绘图形,确保在窗口重绘时(如最大化、最小化或移动窗口)图形能正确显示。 总结来说,设计一个基于MFC的绘图软件,需要...

Global site tag (gtag.js) - Google Analytics