最近升级成了双显示器,
以前只是知道双显示器爽,但用过之后才知道,原来这么爽。
然而美中不足,我也发现了一点小问题,就是我经常有这样一个需求:
有一个程序,已经被最大化了,我要将它从一个显示器移动到另一个显示器上面,同时仍然保持最大化。
以前要完成这个事情,我需要首先将此程序还原,移动到另一个显示器,再将其最大化。
这回的目的就是将这一系列繁琐的过程自动化掉。 使用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. **最大化窗口**:如果你希望充分利用副屏空间,可以选择最大化VC6.0窗口以填满整个第二显示器。 2. **快捷键操作**:VC6.0支持自定义快捷键,创建一些用于在窗口间切换的快捷键可以极大提高效率。 3. **布局...
本文主要探讨了如何使用VC++来实现这一功能,包括获取屏幕分辨率、显示器参数以及如何进行窗口移动等操作。 首先,Windows系统支持两种多显示器模式:复制屏幕和扩展屏幕。在复制模式下,所有显示器显示相同的内容...
在Windows API中,每个窗口都有其特定的样式,这些样式决定了窗口的各种特性,如是否有标题栏(WS_CAPTION)、是否可最大化(WS_MAXIMIZEBOX)等。通过`GetWindowLong`函数可以获取窗口的当前样式,而`SetWindowLong...
开发者需要处理窗口的边界和最大化状态,确保在全屏和普通模式间平滑切换。 3. **树状视图**:树状视图是一种常见的数据展示方式,常用于文件管理器或选项设置中。它由节点组成,节点之间有层级关系,可以折叠和...
// 禁用最大化 EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); // 禁用关闭 } // 隐藏滚动条 ModifyStyle(WS_HSCROLL, 0); ModifyStyle(WS_VSCROLL, 0); ``` 5. 触发全屏切换事件: 你可以通过一个按钮或...
4. 自定义`CSave`类来存储图形信息,如线条、矩形等的坐标,然后在`OnDraw`中根据这些信息重绘图形,确保在窗口重绘时(如最大化、最小化或移动窗口)图形能正确显示。 总结来说,设计一个基于MFC的绘图软件,需要...