Callbackfunction
-
Tach allerseits!
Ich will mit enumwindows alle Fenster auflisten.
Leider hab ich den Dreh mit den Callbackfunctions noch nicht ganz raus (keine beschreibung)Wie muss ich das bewerkstelligen?
Danke im Voraus!
-
-
Sowas?
#include <windows.h> #include <stdio.h> #include <tchar.h> BOOL CALLBACK MyEnumFunc(HWND hWnd, LPARAM lParam) { _tprintf(_T("hWnd: 0x%p, lParam: 0x%p\n"), hWnd, lParam); return TRUE; } int _tmain() { EnumWindows(MyEnumFunc, NULL); }
-
ich versteh zwar:eine Funktion ruft eine Callbackfunktion auf und diese läuft bis irgendwann FALSE zurückgegeben wird.
Aber die Paramater?Wie/Wo werden jetzt die Titel/Handles temp. gespeichert?
Mfg
-
GetWindowText(hWnd, ...);
-
julio schrieb:
Wie/Wo werden jetzt die Titel/Handles temp. gespeichert?
Die Handle werden nicht temporär gespeichert. Das kannst Du aber einfach mit einem std::vector Objekt, instantiiert mit dem Typ HWND, realisieren.
Den Fenstertext ermittelt man dann immer üben den entsprechenden Handle des Fensters.
-
Hallo,
thx, hab das mal so implementiert:#include <windows.h> #include <tchar.h> #include <stdio.h> #include "FMIFS.h" int i=-1; HWND Handle[100]; char titel[200]=""; char string[200]; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { i=i+1; Handle[i]=hwnd; int c=GetWindowTextLength(hwnd); GetWindowText(hwnd,string,120); MessageBox(0,(LPCSTR)string,(LPCSTR)titel,0); return TRUE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Irgendwo im Code EnumWindows((WNDENUMPROC)EnumWindowsProc, 0); return 0; }Blöderweise gibts IsVisible wohl nur für vb.
Weiss jmd wie ich da überprüfen kann ob ein Fenster visible ist?Thx
-
Julio schrieb:
Blöderweise gibts IsVisible wohl nur für vb.
Probiere mal "IsWindowVisible ()".

-
:-), Thx!
-
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <tchar.h> #include "FMIFS.h" BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM) { int nTextLen = GetWindowTextLength(hWnd); LPTSTR lpString = new TCHAR[nTextLen + 1]; GetWindowText(hWnd, lpString, nTextLen); MessageBox(NULL, lpString, _T("Title"), MB_OK | MB_ICONINFORMATION); delete [] lpString; // Verarbeite den HWND sofort ... globale Variablen sind unschön ... return TRUE; } int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { EnumWindows(WNDENUMPROC(EnumWindowsProc), 0); return 0; }Guck dir den Kommentar an ...
-
Julio schrieb:
(WNDENUMPROC)EnumWindowsProc(D)Evil schrieb:
WNDENUMPROC(EnumWindowsProc)lol
-
proficaster
Hast du schön zitiert ... nun will ich aber auch von dir den Unterschied der beiden Casts wissen
-
Wenn die zweite Variante ("WNDENUMPROC(EnumWindowsProc)") geht, dann ist der "cast" redundant.
-
der cast ist einfach unnötig wenn die funktion die richtig signatur hat.

-
proficaster schrieb:
der cast ist einfach unnötig wenn die funktion die richtig signatur hat.

Eben!
@Julio:
Also ich find die Version am besten, da man sich auch die globalen Variablen spart und alles in einem Packet hat
:// #define UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <iostream> #include <vector> #if (defined UNICODE) || (defined _UNICODE) #define cOut std::wcout #else #define cOut std::cout #endif // UNICODE || _UNICODE BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { std::vector<HWND>* pWindows = reinterpret_cast<std::vector<HWND>*>(lParam); pWindows->push_back(hWnd); return (TRUE); } int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { std::vector<HWND> vecWindows; EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&vecWindows)); cOut << TEXT(" Fenster-Handle:") << TEXT("\t") << TEXT("Fenstertitel:\n"); for(int i = 0; i < 80 && cOut.put(TEXT('-')); i++) ; cOut << TEXT("\n"); PTCHAR pszBuffer; long lLength; for(int i = 0; i < vecWindows.size(); i++) { lLength = SendMessage(vecWindows[i], WM_GETTEXTLENGTH, 0, 0L) + 1L; pszBuffer = new TCHAR[lLength]; SendMessage(vecWindows[i], WM_GETTEXT, lLength, reinterpret_cast<LPARAM>(pszBuffer)); cOut << TEXT(" ") << std::hex << std::uppercase << TEXT("0x") << reinterpret_cast<long>(vecWindows[i]) << TEXT("\t\t") << pszBuffer << TEXT("\n"); delete [] pszBuffer; } cOut << TEXT("\n\n\n"); return (0); }
-
CodeFinder schrieb:
...und alles in einem Packet hat
:das paket ist aber möglicherweise schon veraltet, wenn du's verarbeiten willst.
seit wann geht 'cout' in einem nicht-console programm?
-
ten schrieb:
seit wann geht 'cout' in einem nicht-console programm?
Gar nicht
. Hab das wichtigste vergessen:// #define UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <iostream> #include <vector> #if (defined UNICODE) || (defined _UNICODE) #define cOut std::wcout #else #define cOut std::cout #endif // UNICODE || _UNICODE BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { std::vector<HWND>* pWindows = reinterpret_cast<std::vector<HWND>*>(lParam); pWindows->push_back(hWnd); return (TRUE); } int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { std::vector<HWND> vecWindows; EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&vecWindows)); cOut << TEXT(" Fenster-Handle:") << TEXT("\t") << TEXT("Fenstertitel:\n"); for(int i = 0; i < 80 && cOut.put(TEXT('-')); i++) ; cOut << TEXT("\n"); PTCHAR pszBuffer; long lLength; for(int i = 0; i < vecWindows.size(); i++) { lLength = SendMessage(vecWindows[i], WM_GETTEXTLENGTH, 0, 0L) + 1L; pszBuffer = new TCHAR[lLength]; SendMessage(vecWindows[i], WM_GETTEXT, lLength, reinterpret_cast<LPARAM>(pszBuffer)); cOut << TEXT(" ") << std::hex << std::uppercase << TEXT("0x") << reinterpret_cast<long>(vecWindows[i]) << TEXT("\t\t") << pszBuffer << TEXT("\n"); delete [] pszBuffer; } cOut << TEXT("\n\n\n"); return (0); } int main() { return (WinMain(GetModuleHandle(NULL), NULL, NULL, 0)); }
-
ten schrieb:
CodeFinder schrieb:
...und alles in einem Packet hat
:das paket ist aber möglicherweise schon veraltet, wenn du's verarbeiten willst.
Dann erweiter das Packet doch
.
-
CodeFinder schrieb:
ten schrieb:
seit wann geht 'cout' in einem nicht-console programm?
Gar nicht
. Hab das wichtigste vergessen:das macht's aber auch nicht besser

lass das 'winmain' ganz wech...CodeFinder schrieb:
Dann erweiter das Packet doch
.das geht nicht so einfach.
besser alles in der 'enumproc' direkt machen, ohne den vector
-
ten schrieb:
CodeFinder schrieb:
ten schrieb:
seit wann geht 'cout' in einem nicht-console programm?
Gar nicht
. Hab das wichtigste vergessen:das macht's aber auch nicht besser

lass das 'winmain' ganz wech...Naja Ich hab einfach nur (D)Evil's (
Win32-GUI) Code kopiert und ne alte Testanwendung (
Konsole) aufgemacht^^. Sonst würde ich das natürlich trennen^^. War also situationsbedingt.ten schrieb:
CodeFinder schrieb:
Dann erweiter das Packet doch
.das geht nicht so einfach.
Klar, einfach den std::vector mit ner Struktur instantiieren. Da packste dann weitere Infos des Fensters rein (Zeichenketten sinnvollerweise mit std::string/std::wstring, damit spart man sich ne Menge).
ten schrieb:
besser alles in der 'enumproc' direkt machen, ohne den vector
Nicht, wenn man die Infos später noch braucht.