Domanda

Sto cercando un modo per ottenere a livello di codice le icone della barra delle applicazioni correnti (non barra delle applicazioni) per ogni programma che si trova nella barra delle applicazioni.

Non ho avuto molta fortuna con MSDN o Google, perché tutti i risultati si riferiscono al vassoio del sistema.

Tutti i suggerimenti o puntatori sarebbe utile.

EDIT: Ho provato l'idea di Keegan Hernandez ma credo che avrei potuto fare qualcosa di sbagliato. Il codice è al di sotto (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;
}
È stato utile?

Soluzione

Ci sono diversi problemi con il tuo codice, vedere le mie correzioni. Girare gli avvertimenti (o leggere l'output di generazione) sul compilatore, avrebbe dovuto messo in guardia (o ha fatto mettere in guardia) circa questi!

#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;
}

Altri suggerimenti

Speriamo che questo sia sufficiente per iniziare:

WinAPI ha una funzione EnumWindows che chiama una funzione di callback per ogni HWND attualmente un'istanza. Per usarlo scrivere un callback della forma:

BOOL CALLBACK EnumWindowsProc (hwnd HWND, LPARAM lParam);

quindi chiamare EnumWindows (EnumWindowsProc, lParam) in modo che l'API chiamerà il callback per ogni finestra, dove hwnd rappresenta una finestra specifica.

Per determinare se ogni finestra è visibile e quindi sulla barra delle applicazioni, è possibile utilizzare la funzione IsWindowVisible (HWND) su ogni HWND che il callback riceve. Se siete fortunati è possibile ottenere qualsiasi altra informazione necessaria dalle HWNDs passati a quella di callback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top