2009-07-23 7 views
2

Je cherche un moyen d'obtenir par programmation les icônes de la barre des tâches en cours (pas la barre d'état système) pour chaque programme de la barre des tâches.accéder aux icônes de la barre des tâches de Windows en C++

Je n'ai pas eu beaucoup de chance avec MSDN ou Google, parce que tous les résultats se rapportent à la barre d'état système.

Des suggestions ou des pointeurs seraient utiles.

EDIT: J'ai essayé l'idée de Keegan Hernandez mais je pense que j'ai peut-être fait quelque chose de mal. Le code est ci-dessous (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; 
} 

Répondre

0

Il y a plusieurs problèmes avec votre code, s'il vous plaît voir mes corrections. Allumez les avertissements (ou lisez la sortie de compilation) sur votre compilateur, il aurait dû vous avertir (ou vous avoir averti) à propos de ceux-ci!

#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

Vous avez également besoin pour vérifier les styles ex window, exclure les fenêtres de la barre d'outils et inclure appwindow – Anders

1

Espérons que cela est suffisant pour vous aider à démarrer:

WinAPI a une EnumWindows fonction qui appelleront une fonction de rappel pour chaque HWND qui est actuellement instancié. Pour l'utiliser, écrivez un rappel du formulaire:

BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam);

Appelez ensuite EnumWindows (EnumWindowsProc, lParam) pour que l'API appelle votre callback pour chaque fenêtre, où hwnd représente une fenêtre spécifique.

Pour déterminer si chaque fenêtre est visible et donc dans la barre des tâches, vous pouvez utiliser la fonction IsWindowVisible (HWND) sur chaque HWND que le rappel reçoit. Si vous êtes chanceux, vous pouvez obtenir toutes les informations dont vous avez besoin à partir des HWND passés à ce rappel.

+1

Toutes les fenêtres/tous les programmes n'apparaîtront pas dans la barre des tâches. En C# vous pouvez le faire facilement ... – RvdK

+0

Je suis d'accord avec Roy que dans le cas où nous utilisons EnumWindows, il nous donne une liste de nombreuses fenêtres non-sens (menu Démarrer, fenêtres temporaires des applications, etc ...) – jondinham

Questions connexes