C++ C++;枚举窗口,然后执行检查
此代码枚举所有窗口C++ C++;枚举窗口,然后执行检查,c++,winapi,C++,Winapi,此代码枚举所有窗口 BOOL CALLBACK enumWindowsProc( __in HWND hWnd, __in LPARAM lParam ) { int length = ::GetWindowTextLength(hWnd); if (0 == length) return TRUE; TCHAR* buffer; buffer = new TCHAR[length + 1]; memset(buffer, 0, (length + 1)
BOOL CALLBACK enumWindowsProc(
__in HWND hWnd,
__in LPARAM lParam
)
{
int length = ::GetWindowTextLength(hWnd);
if (0 == length) return TRUE;
TCHAR* buffer;
buffer = new TCHAR[length + 1];
memset(buffer, 0, (length + 1) * sizeof(TCHAR));
GetWindowText(hWnd, buffer, length + 1);
tstring windowTitle = tstring(buffer);
string ns(windowTitle.begin(), windowTitle.end());
string ns2 = "WinLister";
const char *cstr = ns.c_str();
const char *cstr2 = ns2.c_str();
delete[] buffer;
wcout << hWnd << TEXT(": ") << cstr << std::endl;
wcout.clear();
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[]) {
wcout << TEXT("All Windows!") << endl;
BOOL enumeratingWindowsSucceeded = ::EnumWindows(enumWindowsProc, NULL);
cin.get();
return 0;
}
BOOL回调枚举windowsproc(
__在HWND HWND,
__在LPARAM中
)
{
int-length=::GetWindowTextLength(hWnd);
如果(0==长度)返回TRUE;
TCHAR*缓冲区;
缓冲区=新的TCHAR[长度+1];
memset(缓冲区,0,(长度+1)*sizeof(TCHAR));
GetWindowText(hWnd,缓冲区,长度+1);
tstring windowTitle=tstring(缓冲区);
字符串ns(windowTitle.begin(),windowTitle.end());
字符串ns2=“WinLister”;
const char*cstr=ns.c_str();
const char*cstr2=ns2.c_str();
删除[]缓冲区;
wcoutEnumWindows仅枚举顶级窗口。如果您要查找的特定窗口不是顶级窗口(例如,它是一个对话框),则EnumWindows将不起作用。使用lParam
参数将用户定义的值传递给回调,就像指向HWND
变量的指针。在枚举过程中,如果检测到所需的窗口,回调可以更新该变量的值。枚举完成后,可以检查v的值改变并相应地采取行动。例如:
BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
{
...
if (hWnd is the one you want)
{
*(reinterpret_cast<HWND*>(lParam)) = hWnd;
return FALSE; // stop enumerating
}
return TRUE; // keep enumerating
}
int _tmain(int argc, _TCHAR* argv[])
{
HWND hFoundWnd = NULL;
::EnumWindows(&FindTheDesiredWnd, reinterpret_cast<LPARAM>(&hFoundWnd));
if (hFoundWnd != NULL)
{
...
}
return 0;
}
BOOL回调FindTheDesiredWnd(HWND-HWND,LPARAM-LPARAM)
{
...
如果(hWnd是您想要的)
{
*(重新解释铸造(lParam))=hWnd;
返回FALSE;//停止枚举
}
返回TRUE;//继续枚举
}
int _tmain(int argc,_TCHAR*argv[]
{
HWND hFoundWnd=NULL;
::枚举窗口(&FindTheDesiredWnd,重新解释强制转换(&hFoundWnd));
if(hFoundWnd!=NULL)
{
...
}
返回0;
}
感谢分享信息。只需实现您想要的逻辑(即,与ns2
进行比较,并对hWnd
进行匹配)在您的enumWindowsProc
中。除此之外,Stackoverflow是一个问答网站。您的问题在哪里?如果您没有缩写为so mch,将返回hlp。这不是一个对话框。这是一个顶级lvl窗口您的EnumeratingWindowsSuccessed
变量有误导性。EnumWindows
在成功的情况下也会返回FALSE
,如果enumWindowsProc
callback返回FALSE
以停止枚举(如果使用它查找特定窗口,通常会停止枚举)。您写道:“if(hWnd是您想要的)”如何获取它?您已经有了检索窗口标题的代码,只需对这些值执行字符串比较,直到找到您要查找的内容。请注意Visual Studio中的行((HWND*)lParam)*=hWnd;
结果应显示表达式
错误消息。您应该将最后一个解引用运算符放在行首。@mickaelb91已修复