12

我假设,我所要求的实际上应该是默认值,但我遇到了一些我不理解的行为。

#include "stdafx.h"

using namespace std;

BOOL CALLBACK enumWindowsProc(
  __in  HWND hWnd,
  __in  LPARAM lParam
) {
  if( !::IsIconic( hWnd ) ) {
    return TRUE;
  }

  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 );
  delete[] buffer;

  wcout << hWnd << TEXT( ": " ) << windowTitle << std::endl;

  return TRUE;
}

int _tmain( int argc, _TCHAR* argv[] ) {
  wcout << TEXT( "Enumerating Windows..." ) << endl;
  BOOL enumeratingWindowsSucceeded = ::EnumWindows( enumWindowsProc, NULL );
  cin.get();
  return 0;
}

如果我调用该代码,它将列出所有最小化的窗口: 在此处输入图像描述

现在,我不再只对最小化的窗口感兴趣,现在我想要所有这些。所以我删除了IsIconic检查:

BOOL CALLBACK enumWindowsProc(
  __in  HWND hWnd,
  __in  LPARAM lParam
) {
  /*
  if( !::IsIconic( hWnd ) ) {
    return TRUE;
  }
  */

  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 );
  delete[] buffer;

  wcout << hWnd << TEXT( ": " ) << windowTitle << std::endl;

  return TRUE;
}

现在我得到除了最小化的窗口之外的所有窗口(这次没有列出之前列出的窗口句柄): 在此处输入图像描述

为了完整起见,这是stdafx.h

#pragma once

#include "targetver.h"


#include <iostream>
#include <map>
#include <string>

namespace std {
  #if defined _UNICODE || defined UNICODE
    typedef wstring tstring;
  #else
    typedef string tstring;
  #endif
}

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <psapi.h>

我究竟做错了什么?

4

4 回答 4

9

好吧,wcout.flush()永远不会起作用,但是wcout.clear()至少对我而言,它可以修复您的代码。

wcout << hWnd << TEXT( ": " ) << windowTitle << std::endl;
wcout.clear();
return TRUE;

我知道这个问题已经一岁了,但是回答永远不会太晚。

于 2013-07-01T08:57:29.183 回答
9

这是一个列出所有打开窗口的回调函数:

#include <string>
#include <iostream>
#include <Windows.h>

static BOOL CALLBACK enumWindowCallback(HWND hWnd, LPARAM lparam) {
    int length = GetWindowTextLength(hWnd);
    char* buffer = new char[length + 1];
    GetWindowText(hWnd, buffer, length + 1);
    std::string windowTitle(buffer);

    // List visible windows with a non-empty title
    if (IsWindowVisible(hWnd) && length != 0) {
        std::cout << hWnd << ":  " << windowTitle << std::endl;
    }
    return TRUE;
}

int main() {
    std::cout << "Enmumerating windows..." << std::endl;
    EnumWindows(enumWindowCallback, NULL);
    std::cin.ignore();
    return 0;
}

如果要检查窗口是否最小化,可以使用IsIconic().

也可以看看:

于 2018-08-07T16:34:32.883 回答
3

这(正如我所假设的)根本不是问题EnumWindows。问题出在输出流上。

在调试时,我注意到enumWindowsProc每个窗口都可以正常调用,但是某些迭代根本不会生成输出。

暂时改用 using _tprintf,但不明白原代码有什么问题。呼叫wcout.flush()也没有理想的效果。

于 2012-04-20T13:08:09.803 回答
-1

Windows 的文档(不知道它的准确性)说 EnumWindows 只枚举顶级窗口。如果你想枚举子窗口,你需要使用 EnumChildWindows 函数,你必须传递父窗口的句柄

于 2017-11-22T10:42:13.880 回答