最近升级成了双显示器,
以前只是知道双显示器爽,但用过之后才知道,原来这么爽。
然而美中不足,我也发现了一点小问题,就是我经常有这样一个需求:
有一个程序,已经被最大化了,我要将它从一个显示器移动到另一个显示器上面,同时仍然保持最大化。
以前要完成这个事情,我需要首先将此程序还原,移动到另一个显示器,再将其最大化。
这回的目的就是将这一系列繁琐的过程自动化掉。 使用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隐藏掉。