如何与C ++中的其他应用程序交互?

时间:2014-01-05 18:45:08

标签: c++ windows ipc

我想知道是否有某种方法可以改变其他应用程序的定位是C ++。我想要做的是移动屏幕上的活动窗口。例如,我想以循环方式移动Firefox。在2:17 http://www.youtube.com/watch?v=TLqPepLhDTY&list=WL8D6E1A188FBFE181浏览器移动,我该怎么做?

4 个答案:

答案 0 :(得分:4)

您应首先使用FindWindow()函数获取窗口的HWND。然后,您只需使用找到的HWND SetWindowPos()MoveWindow()来更改位置。

答案 1 :(得分:0)

在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让用户点击任意窗口进行操作)
    再一次,你的想象力是极限

答案 2 :(得分:0)

实际上在你没有制作的窗口上使用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;
}

答案 3 :(得分:0)

哇,谢谢你们,我没想到会这么快回答。我将尝试查看最适合使用的代码。它最终以我想要的方式工作。代码如下所示:

#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;
}