Taskbar einträge



  • Hallo leute.
    Da die Suche nicht funktioniert muss ich das wohl hier fragen 🙂
    Bin gerade dabei mir eine art taskleiste nachzubauen. Jetzt fehlen mir (nur noch;)) die einträge dafür (also die offenen Fenster).
    Hab das mal mit EnumWindows() versucht, aber da kommt ja soviel zusätzlihce scheiße raus.....
    ich hoffe ich hab mich verständlich ausgedrückt 🙂

    danke schonmal im voraus
    mfg jghj



  • Ich habe es mal so gemacht:

    BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
    	if(IsWindowVisible(hwnd) && (GetParent(hwnd) == NULL))
    	{
    		BOOL bNoOwner = (GetWindow(hwnd, GW_OWNER) == NULL);
    		LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
    
    		if( ( ((lExStyle & WS_EX_TOOLWINDOW) == 0) && bNoOwner ) || ((lExStyle & WS_EX_APPWINDOW) && !bNoOwner) )
    		{
    			// wenn du hier bist, dann sollte hwnd ein Handle eines Fensters sein, dass auch in der Taskbar ist
    		}
    	}
    	return TRUE;
    }
    


  • danke 😃



  • hmmm...komisch ... aber irgendwie funktionierts nich so ganz. der findet jetzt ganix bei mir 😕



  • shit sorry, für den spam ... hab des return vergessen...jetzt funktionierts; kA warum das daran liegt, aber nu gehts



  • To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.

    😉



  • jojo ich habs einfach vergessen 🙂
    aber da hätt i gleich noch ne andere Frage ... wie machen ich des am besten, dass die buttons auch bescheid bekommen wenn sie jetzt minimiert worden sind, oder wenn jetzt n neues fenster aufgeht, oder sich eins schließt?
    ich könnt natürlich CreateWindow(Ex) DestroyWindow() usw. alles hooken, aber des is ja viel zuviel arbeit....außerdem könnt ich auch alle paar millisekunden den status abfragen, was zu rechenintensiv wäre. Gibts da noch ne bessere möglichkeit?
    Also vielleicht ein von windows vorgesehenen hook? wüsste jetzt auf anhieb keinen der hier zutreffen könnte außer vllt. WH_CALLWNDPROC.

    wobeis ohne hook am schönsten wäre, weil das ja ein globaler sein müsste, sprich inne dll auslagern, dann müsste ich für die interprozesskommunikation pipes basteln, oder die funktionen für die task auch inne dll auslagern ... des is alles so umständlich ...
    ich hoff jemand weiß ne bessere Möglichkeit 😎



  • ok ich seh schon ... so wies aussieht komm ich echt nich am hooken vorbei.
    Habs jetzt mim WH_CALLWNDPROC probiert, mit folgender HookProc:

    switch(code) {
    		case WM_CREATE: {
    			HWND hWnd = ((CWPRETSTRUCT *)lparam)->hwnd;
    			if(IsWindowVisible(hWnd) && !GetParent(hWnd)) {
    				bool IsOwner 	= (!GetWindow(hWnd, GW_OWNER));
    				LONG lExStyle 	= GetWindowLong(hWnd, GWL_EXSTYLE);
    
    				if((!(lExStyle & WS_EX_TOOLWINDOW) && IsOwner) || ((lExStyle & WS_EX_APPWINDOW) && !IsOwner)) {
    					char tmp[MAX_PATH];
    					GetWindowText(hWnd, tmp, MAX_PATH - 1);
    					MessageBox(NULL, tmp, "Neues Fenster", MB_OK | MB_ICONINFORMATION);
    				}
    			}
    
    			char tmp[MAX_PATH];
    			GetWindowText(hWnd, tmp, MAX_PATH - 1);
    			MessageBox(NULL, tmp, "Neues Fenster", MB_OK | MB_ICONINFORMATION);
    
    			break;
    		}
    		case WM_DESTROY: {
    			char tmp[MAX_PATH];
    			sprintf(tmp, "Fenster 0x%x wurde geschlossen.", ((CWPRETSTRUCT *)lparam)->hwnd);
    			MessageBox(NULL, tmp, "Fenster geschlossen", MB_OK | MB_ICONINFORMATION);
    			break;
    		}
    	}
    

    also jetzt nur testweise .... aber egal wieviele fenster ich öffne oder schließe, anzeigen tut der nix 😕
    was mach ichn falsch?



  • ach du kacke ... genau nachm post kommt mir immer die erleuchtung 😎
    wer lesen kann is klar im vorteil sag ich nur ... wenn ich "code switche" dann bringt mir das natürlich wenig 😉
    naja trotzdem danke für eure Hilfe (die vllt noch gekommen wär ^^)



  • Wäre nett, wenn du noch deine Lösung postest :xmas1:



  • switch(((CWPSTRUCT *)lparam)->message)
    

    sollte es heißen statt switch(code).
    aber trotzdem funkts jetz im insgesamten noch nich ... den hook hab ich schon richtig gewählt oder?



  • Kommen denn jetzt schon Messages an? Falls nicht: hast du den Code auch in einer DLL?



  • Laut meiner Gebrauchsanweisung fängt WH_CALLWNDPROC nachrichten über Sendmessage ab, ich weis nicht ob das immer klappt.
    Kannst Dir ja mal WH_SHELL anschaun



  • ja es kommen viele nachrichten an. Viel zu viele 😎
    also so sieht die hookproc im mom aus (JA, sie befindet sich in einer dll befindet :))

    LRESULT CALLBACK HookProc(int code, WPARAM wparam, LPARAM lparam) {
    	if(code < 0 || code != HC_ACTION)
    		goto end;
    
    	switch(((CWPSTRUCT *)lparam)->message) {
    		case WM_CREATE: {
    			HWND hWnd = ((CWPRETSTRUCT *)lparam)->hwnd;
    			if(IsWindowVisible(hWnd) && !GetParent(hWnd)) {
    				bool IsOwner 	= (!GetWindow(hWnd, GW_OWNER));
    				LONG lExStyle 	= GetWindowLong(hWnd, GWL_EXSTYLE);
    
    				if((!(lExStyle & WS_EX_TOOLWINDOW) && IsOwner) || ((lExStyle & WS_EX_APPWINDOW) && !IsOwner)) {
    					char tmp[MAX_PATH];
    					GetWindowText(hWnd, tmp, MAX_PATH - 1);
    
    				}
    			}
    
    			char tmp[MAX_PATH];
    			GetWindowText(hWnd, tmp, MAX_PATH - 1);
    			out << "Neues Fenster: " << tmp << "\r\n";
    
    			break;
    		}
    		case WM_DESTROY: {
    			char tmp[MAX_PATH];
    			HWND hWnd = ((CWPRETSTRUCT *)lparam)->hwnd;
    			GetWindowText(hWnd, tmp, MAX_PATH - 1);
    			sprintf(tmp, "Fenster %s wurde geschlossen.\r\n", tmp);
    			out << tmp;
    			break;
    		}
    	}
    
    	end:;
    	return CallNextHookEx(Hook, code, wparam, lparam);
    }
    

    dass GetWindowText(hWnd, tmp, MAX_PATH - 1); in WM_CREATE warscheinlich nicht viel bringen wird denke ich mir schon, weil das fenster ja zu dem zeitpunkt noch nicht aufgebaut ist. Aber beim WM_DESTROY bekommt er den titel genauso wenig...sollt ichs ma in WM_CLOSE probiern?
    aber wenn ich 3 fenster öffne und schließe stehen in der datei unzählige zeilen von fenster wurde geschlossen/geöffnet

    @Lui

    Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.

    das steht bei mir. Und für mich sieht das nicht so aus, als ob die nachrichten zwangsläufig mit SendMessage() versendet werden muss.

    ...useful to shell applications...

    wird mir das wirklich was bringen?

    mfg, danke für antworten



  • Naja bei mir stand:

    The CallWndProc hook procedure is an application-defined or library-defined callback function that the system calls whenever the SendMessage function is called.

    Der Shell-Hook wird aufgerufen wenn ein Hauptfenster erstellt/(de)aktiviert/gelöscht oder mini-/maxi-miert bzw. wiederhergestellt wird. Ich könnt mir vostellen dass er Dir sympathisch werden könnte.



  • also zu HSHELL_WINDOWCREATED steht bei mir folgendes:

    A top-level, unowned window has been created. The window exists when the system calls a ShellProc function.

    also es wird aufgerufen sobald dass system sone ShellProc funktion auslöst, was aber ja nicht alle zwangsweise tun müssen oder? Ich denke mir dass es deshalb bei mir auch keine reaktionen gibt.
    Hier der code:

    switch(code) {
    		case HSHELL_WINDOWCREATED: {
    			HWND hWnd = (HWND)wparam;
    			if(IsWindowVisible(hWnd) && !GetParent(hWnd)) {
    				bool IsOwner 	= (!GetWindow(hWnd, GW_OWNER));
    				LONG lExStyle 	= GetWindowLong(hWnd, GWL_EXSTYLE);
    
    				if((!(lExStyle & WS_EX_TOOLWINDOW) && IsOwner) || ((lExStyle & WS_EX_APPWINDOW) && !IsOwner)) {
    					char tmp[MAX_PATH];
    					GetWindowText(hWnd, tmp, MAX_PATH - 1);
    					out << "Neues Fenster: " << tmp << "\r\n";
    				}
    			}			
    
    			break;
    		}
    		case HSHELL_WINDOWDESTROYED: {
    			char tmp[MAX_PATH];
    			HWND hWnd = (HWND)wparam;
    			GetWindowText(hWnd, tmp, MAX_PATH - 1);
    			sprintf(tmp, "Fenster %s wurde geschlossen.\r\n", tmp);
    			out << tmp;
    			break;
    		}
    	}
    


  • "The window exists when the system calls a ShellProc function." heißt auf Deutsch: Das Fenster existiert schon, während das System eine ShellProc Funktion aufruft. UNd der Hook wird wirklich bei jedem "top-level, unowned window" azfgerufen. Wozu sollte er denn sonst gut sein :xmas2:
    Nebenbei braucht er mit ziemlicher Sicherheit nicht mal ein Zehntel der Ressourcen eines WH_CALLWNDPROC-Hooks.

    (Juju, die Weihnachtssmilies :xmas1: )



  • hmmm....was mach ich dann falsch?



  • Du musst berücksichtigen dass die Funktion im Adressraum der Shell aufgerufen wird d.h. cout versucht in die Shell zu schreiben (könnt noch komplizierter sein).

    Mein Vorschlag wäre die Daten ans Hauptprgramm zu schicken (Code tw. aus'm Nachbarthread geklaut nach MS-Syntax)

    #include <windows.h> 
    #include <stdio.h> 
    
    #pragma data_seg ("Shared") 
    HWND meinFenster = 0 ; 
    HHOOK       hhkHook ; 
    #pragma data_seg () 
    // Weise den Compilern, den Abschnitt Shared als lesbar, 
    // beschreibbar und zur gemeinsamen Verwendung zu deklarieren - "RSW". 
    #pragma comment (linker, "/section:Shared,RWS") 
    
    /***********************************************************/ 
    /* SetupHook: EXPORT Funktion, setzt den Keyboardhook      */ 
    /* Eingabe Parameter: HWND des aufrufenden Fensters        */ 
    /* Return-Wert: TRUE                                       */ 
    /***********************************************************/ 
    
    EXPORT BOOL CALLBACK SetupHook (HWND hParent)
    {   meinFenter = hParent ; 
        hhkHook = SetWindowsHookEx (WH_SHELL, ShellProc, GetModuleHandle("Diese.dll"),0); 
        return TRUE ; } 
    EXPORT BOOL CALLBACK UninstallHook (void)               
    {   UnhookWindowsHookEx (hhkHook) ;     return TRUE ; }
    
    LRESULT CALLBACK ShellProc (int nCode, WPARAM wP, LPARAM lP)
    { int tmp;
      switch(nCode)
      { case HSHELL_WINDOWACTIVATED:tmp=1;break;
        case HSHELL_WINDOWCREATED  :tmp=2;break;
        case HSHELL_WINDOWDESTROYED:tmp=3;break;
        default:tmp=0;break;}
      if(tmp && SendMessage(meinFenster,WM_USER+tmp,wP,0))
            return 0;// falls das Hauptprogramm 1 zurückliefert bleibt die normale Taskleiste
                     // aussen vor ;-)
      else  return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; }
    


  • öhhmm ... nun ja ... hab ja auch nirgends cout verwendet 😛
    das war out ... um inne datei zu schreiben ... da hab ich mir dann auch schon gedacht dass der ja die datei für jeden Prozess neu macht, also hab ichs mit fopen/fwrite/fclose bewerkstelligt. (fopen mit "a" natürlich :D)
    trotzdem kein ergebnis ... und im Grunde genommen isses der komplett gleiche Aufbau.
    In meiner datei steht genau das drin:

    Hook erstellt.
    Hook gelöscht.

    was für mich heißt dass er einfach die messages nicht reinbekommt.
    Also falls sonst niemand ne ahnung hat hook ich nu einfach CreateWindow(Ex) usw.

    mfg jghj


Anmelden zum Antworten