2

我正在寻找一种以编程方式获取任务栏中每个程序的当前任务栏图标(而不是系统托盘)的方法。

我对 MSDN 或 Google 的运气并不好,因为所有结果都与系统托盘有关。

任何建议或指示都会有所帮助。

编辑:我尝试了 Keegan Hernandez 的想法,但我认为我可能做错了什么。代码如下(c++)。

#include <iostream>
#include <vector>
#include <windows.h>
#include <sstream>
using namespace std;
vector<string> xxx;
bool EnumWindowsProc(HWND hwnd,int ll)
{
    if(ll=0)
    {
        //...
        if(IsWindowVisible(hwnd)==true){
        char tyty[129];
        GetWindowText(hwnd,tyty,128);
        stringstream lmlm;
        lmlm<<tyty;
        xxx.push_back(lmlm.str());
        return TRUE;
        }
    }
}
int main()
{
    EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
    vector<string>::iterator it;
    for(it=xxx.begin();it<xxx.end();it++)
    {cout<< *it <<endl;}
    bool empty;
    cin>>empty;
}
4

2 回答 2

1

希望这足以让您入门:

WinAPI 有一个函数 EnumWindows,它将为当前实例化的每个 HWND 调用一个回调函数。要使用它,请编写表单的回调:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

然后调用 EnumWindows(EnumWindowsProc, lParam) 以便 API 为每个窗口调用您的回调,其中 hwnd 代表一个特定的窗口。

要确定每个窗口是否可见并因此在任务栏上,您可以在回调接收到的每个 HWND 上使用函数 IsWindowVisible(HWND)。如果幸运的话,您可以从传递给该回调的 HWND 中获得所需的任何其他信息。

于 2009-07-23T04:20:56.723 回答
0

您的代码有几个问题,请参阅我的更正。在编译器上打开警告(或阅读构建输出),它应该警告(或警告)你这些!

#include <iostream>
#include <vector>
#include <windows.h>
#include <sstream>
using namespace std;
vector<string> xxx;
// The CALLBACK part is important; it specifies the calling convention.
// If you get this wrong, the compiler will generate the wrong code and your
// program will crash.
// Better yet, use BOOL and LPARAM instead of bool and int.  Then you won't
// have to use a cast when calling EnumWindows.
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM ll)
{
    if(ll==0) // I think you meant '=='
    {
        //...
        if(IsWindowVisible(hwnd)==true){
        char tyty[129];
        GetWindowText(hwnd,tyty,128);
        stringstream lmlm;
        lmlm<<tyty;
        xxx.push_back(lmlm.str());
        //return TRUE; What if either if statement fails?  You haven't returned a value!
        }
    }
    return TRUE;
}
int main()
{
    EnumWindows(EnumWindowsProc,0);
    vector<string>::iterator it;
    for(it=xxx.begin();it<xxx.end();it++)
    {cout<< *it <<endl;}
    bool empty;
    cin>>empty;
}
于 2009-07-23T18:11:58.813 回答