使用WINDOW标题

时间:2016-09-20 14:53:04

标签: c++

我在c ++中使用以下程序,在Visual C ++ 6.0中,在打开MS Paint程序时通知消息框。它使用MS Paint的WINDOW的确切名称,即“Untitled - Paint”。但是现在我需要让程序通知消息框,当我只知道实际WINDOW的名称的一部分时,例如,如果窗口是“Abcdefgh - Paint”并且我以这种方式设置字符串名称 - std :: wstring windowName(L“Paint”); - 该计划再次工作。使用以下3行代码,当实际的WINDOW名称是MS Paint窗口的确切名称时,程序可以正常工作:

HWND windowHandle = FindWindowW(NULL, windowName.c_str());
DWORD* processID = new DWORD;
GetWindowThreadProcessId(windowHandle, processID);

但是如果字符串windowName只是名称的一部分,它将无法工作,我的意思是它是“Paint”。 有人能告诉我怎么做吗?我想要列出所有打开的WINDOWS的名称,并将它们与我的真实姓名部分进行比较,我的意思是在他们的名字中搜索子串“Paint”的匹配,但我不知道如何获得所有打开窗户。 此外,这是非常重要的,我的计算机是旧的,我使用的是Visual C ++ 6.0,所以我不能使用C ++的所有进化功能和现在的程序环境,我的意思是,我不能使用正确编译的代码。 NET但不在Visual C ++ 6.0中编译。  感谢

#include "stdafx.h"
#include < iostream>
#include < string>
#include < windows.h>
#include < sstream> 
#include < ctime>

int APIENTRY WinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPSTR     lpCmdLine,
                 int       nCmdShow)
{
// TODO: Place code here.
std::wstring windowName(L"Untitled - Paint");




while(true)
{

    Sleep(1000*5);

time_t t = time(0);   // get time now
struct tm * now = localtime( & t );
int tday = now->tm_mday;
int tmin = now->tm_min;
int thour = now->tm_hour;


HWND windowHandle = FindWindowW(NULL, windowName.c_str());
DWORD* processID = new DWORD;
GetWindowThreadProcessId(windowHandle, processID);

char probaintstr[20];
sprintf(probaintstr,"%d",*processID);





if(strlen(probaintstr) <=5 ) 
{

Sleep(1000*10);

MessageBox(NULL,"niama go Notepad ili Wordpad","zaglavie",MB_OK);
}
else {

}




}


return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以使用EnumWindows,例如

BOOL CALLBACK enumWindow(HWND hwnd, LPARAM lp)
{
    std::string str(512, 0);
    int len = GetWindowText(hwnd, &str[0], str.size());
    if (str.find("Paint") != std::string::npos)
    {
        MessageBox(0, str.c_str(), 0, 0);
    }
    return true;
}

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    EnumWindows(enumWindow, 0);
    return 0;
}

或者您可以使用FindWindowEx并查找类名。 MS Paint的类名是"MSPaintApp"。你可以从&#34; Spy&#34;中找到这些信息。用于Windows的实用程序。

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    for (HWND hwnd = NULL;;)
    {
        hwnd = FindWindowExA(NULL, hwnd, "MSPaintApp", 0);
        if (!hwnd)
            break;

        std::string str(512, 0);
        int len = GetWindowText(hwnd, &str[0], 512);
        str.resize(len);
        if (str.find("Paint") != std::string::npos)
            MessageBox(0, str.c_str(), 0, 0);
    }
    return 0;
}

对于进程ID,您不需要分配内存。只需使用参考:

DWORD processID;
GetWindowThreadProcessId(windowHandle, &processID);