【发布时间】:2014-01-05 18:45:08
【问题描述】:
我想知道有没有办法改变其他应用程序的定位是C++。我想要做的是在屏幕上移动活动窗口。例如,我想以循环移动方式移动 Firefox。 2:17 http://www.youtube.com/watch?v=TLqPepLhDTY&list=WL8D6E1A188FBFE181 浏览器移动了,怎么办?
【问题讨论】:
我想知道有没有办法改变其他应用程序的定位是C++。我想要做的是在屏幕上移动活动窗口。例如,我想以循环移动方式移动 Firefox。 2:17 http://www.youtube.com/watch?v=TLqPepLhDTY&list=WL8D6E1A188FBFE181 浏览器移动了,怎么办?
【问题讨论】:
您应该首先使用FindWindow() 函数获取窗口的HWND。然后你可以简单地使用 SetWindowPos() 或 MoveWindow() 和找到的 HWND 来改变位置。
【讨论】:
在 linux、mac 和 FreeBSD 上:这是一个快速脚本,它使用 xdotool 沿着某个轨迹滑动 chrome 浏览器:
#!/bin/bash
while read x y
do
xdotool search --class google-chrome windowmove $x $y
sleep 0.001
done <<TRAJECTORY
624 624
634 614
644 624
654 614
664 624
674 614
684 624
694 614
704 624
TRAJECTORY
注意事项
selectwindow 让用户单击任何窗口进行操作)【讨论】:
xdotool 或 (b) 直接从 c++ 使用 xlib+xtst,使用 the source code of xdotool 作为参考。即使对于商业应用程序,许可证似乎也不排除这种情况。
(b) 部分.这是一个非常具体的例子,说明它是如何完成的。如果 OP 喜欢它,他将能够以他喜欢的方式编写代码。
实际上在您没有创建的窗口上使用FindWindow 很困难,因为您需要在该窗口上使用的类名。请改用EnumWindows。这是一个代码示例,用于搜索并关闭名称中包含“Firefox”的任何窗口。持续发送WM_MOVE 而不是 WM_CLOSE 来移动窗口。
#include <windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "user32.lib")
HWND windowHandle;
BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
TCHAR title[500];
ZeroMemory(title, sizeof(title));
//string strTitle;
GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));
//_tprintf(_T("Found window: %s\n"), title);
//strTitle += title; // Convert to std::string
if(_tcsstr(title, _T("Firefox")))
{
windowHandle = hWnd;
return FALSE;
}
return TRUE;
}
int main()
{
while (true)
{
windowHandle = NULL;
EnumWindows(MyEnumProc, 0);
cout << endl << endl << "Desired window handle: " << windowHandle << endl << "Sending WM_CLOSE message..." << endl;
SendMessage(windowHandle, WM_CLOSE, NULL, NULL);
}
return 0;
}
【讨论】:
FindWindow也可以查名字。
哇,谢谢你们,我没想到会这么快回答。我会尝试看看哪个代码最适合使用。它终于按我想要的方式工作了。代码如下所示:
#include <windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "user32.lib")
HWND windowHandle;
BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
TCHAR title[500];
ZeroMemory(title, sizeof(title));
//string strTitle;
GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));
//_tprintf(_T("Found window: %s\n"), title);
//strTitle += title; // Convert to std::string
if(_tcsstr(title, _T("Firefox")))
{
windowHandle = hWnd;
return FALSE;
}
return TRUE;
}
int xLoc = 10;
int yLoc = 50;
int getXLoc(){
if(xLoc<70&&yLoc<=30){
xLoc += 1;
Sleep(10);
}else if(yLoc>30){
xLoc -= 1;
Sleep(10);
}
return xLoc;
}
int getYLoc(){
if(yLoc>10&&xLoc<30){
yLoc -= 1;
Sleep(10);
}else if(xLoc>=30&&yLoc<70){
yLoc += 1;
Sleep(10);
}
return yLoc;
}
int main()
{
windowHandle = NULL;
EnumWindows(MyEnumProc, 0);
while(true){
MoveWindow(windowHandle, getXLoc(), getYLoc(), 1220, 930, false);
Sleep(5);
}
return 0;
}
【讨论】: