我在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;
}
答案 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);