0

alt-tab のように、実行中のアプリケーションのリストを印刷しようとしています。これまでに行ったことは次のとおりです。

1.最初に EnumWindows を試してみましたが、何百ものエントリがありました。

2.似たような質問をいくつか見つけたので、Raymond Chen のブログにたどり着きました。 http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

ただし、100 を超えるウィンドウ (window_num1 は 158、window_num2 は 329) が表示されますが、alt-tab では 4 つしか表示されません。これが私のコードです:

#include <windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;

#pragma comment(lib, "user32.lib")

HWND windowHandle;
int window_num1=0;
int window_num2=0;

BOOL IsAltTabWindow(HWND hwnd)
{
    if (hwnd == GetShellWindow())   //Desktop
        return false;
    // Start at the root owner
    HWND hwndWalk = GetAncestor(hwnd, GA_ROOTOWNER);

    // See if we are the last active visible popup
    HWND hwndTry;
    while ((hwndTry = GetLastActivePopup(hwndWalk)) != hwndTry) 
    {
        if (IsWindowVisible(hwndTry)) 
            break;
        hwndWalk = hwndTry;
    }
    return hwndWalk == hwnd;
}

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
    TCHAR title[500];
    ZeroMemory(title, sizeof(title));

    //string strTitle;

    GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0]));

    if (IsAltTabWindow(hWnd))
    {
        _tprintf(_T("Value is %s\n"), title);
        window_num1++;
    }
    window_num2++;

    //strTitle += title; // Convert to std::string
    if(_tcsstr(title, _T("Excel")))
    {
        windowHandle = hWnd;
        return FALSE;
    }
    return TRUE;
}

void MyFunc(void) //(called by main)
{
    EnumWindows(MyEnumProc, 0);
}

int main() 
{
    MyFunc();
    cout<<endl<<window_num1<<endl<<window_num2;
    return 0;
}
4

2 に答える 2

3

あなたの失敗は、目に見える窓だけを歩くべきだということです...ブログをもう一度読んでください。

表示されているウィンドウごとに、ルート オーナーが見つかるまでオーナー チェーンをたどっていきます。次に、表示されているウィンドウが見つかるまで、表示されている最後のアクティブなポップアップ チェーンに戻ります。開始した場所に戻ったら、ウィンドウをAlt+↹Tabリストに入れます。

あなたのコードはすべてのウィンドウを通過します!

于 2013-12-09T07:46:32.920 に答える
0

使うだけIsWindowVisible

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
    TCHAR title[256] = {0,};
    if (IsWindowVisible(hWnd) && GetWindowTextLength(hWnd) > 0)
    {
       window_num1++;
       GetWindowText(hWnd, title, _countof(title));
       _tprintf(_T("Value is %d, %s\n"), window_num1, title);
    }
    return TRUE;
 }
于 2013-12-09T11:10:01.390 に答える