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

3

それは(私が想定したように)まったく問題ではありませんEnumWindows。問題は出力ストリームにあります。

デバッグ中に、 がすべてのウィンドウで正常に呼び出されていることに気付きましたenumWindowsProcが、一部の反復では単に出力が生成されていません。

とりあえず を使うことに切り替えた_tprintfのですが、元のコードの何が問題なのかわかりません。電話wcout.flush()しても望ましい効果はありませんでした。

于 2012-04-20T13:08:09.803 に答える