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已修复