2009-07-23 3 views
2

Я ищу способ программно получить текущие значки панели задач (а не системный трей) для каждой программы, находящейся на панели задач.доступ к значкам панели задач Windows в C++

Мне не повезло с MSDN или Google, потому что все результаты относятся к системному лотку.

Любые предложения или указатели были бы полезны.

EDIT: Я пробовал идею Кигана Эрнандеса, но я думаю, что, возможно, я сделал что-то неправильно. Код ниже (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; 
} 

ответ

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; 
} 
+0

Вам также нужно для проверки стилей ex window, исключения окон панели инструментов и включения appwindow's – Anders

1

Надеюсь, этого достаточно, чтобы вы начали:

WinAPI имеет функцию EnumWindows, которая будет вызывать функцию обратного вызова для каждого HWND, что в настоящее время реализованным. Чтобы использовать его, напишите обратный вызов формы:

BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam);

Затем вызовите EnumWindows (EnumWindowsProc, lParam), чтобы API вызывал ваш обратный вызов для каждого окна, где hwnd представляет одно конкретное окно.

Чтобы определить, видимо ли каждое окно и поэтому на панели задач, вы можете использовать функцию IsWindowVisible (HWND) для каждого HWND, получаемого обратным вызовом. Если вам повезет, вы можете получить любую другую информацию, которая вам нужна, от HWND, переданных этому обратному вызову.

+1

Не каждое окно/программа появится на панели задач. В C# вы можете сделать это легко ... – RvdK

+0

Я согласен с Роем, что в случае использования EnumWindows он дает нам список многих бессмысленных окон (начальное меню, временные окна приложений и т. Д.) – jondinham

Смежные вопросы