Callbackfunction
-
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.
-
CodeFinder schrieb:
ten schrieb:
besser alles in der 'enumproc' direkt machen, ohne den vector
Nicht, wenn man die Infos später noch braucht.
das ist doch nur ein snapshot. je später, desto wertloser wird er.
manche fenster existieren längst nicht mehr, andere sind dazugekommen, deshalb: möglichst direkt alles in die 'enumproc' packen...
-
ten schrieb:
CodeFinder schrieb:
ten schrieb:
besser alles in der 'enumproc' direkt machen, ohne den vector
Nicht, wenn man die Infos später noch braucht.
das ist doch nur ein snapshot. je später, desto wertloser wird er.
manche fenster existieren längst nicht mehr, andere sind dazugekommen, deshalb: möglichst direkt alles in die 'enumproc' packen...Eben und falls man die Infos DOCH NOCH LÄNGER BRAUCHT, kann man ja immer noch mit IsWindow prüfen, obs noch existiert und dann ggf. aus dem Objekt löschen.
-
CodeFinder schrieb:
Eben und falls man die Infos DOCH NOCH LÄNGER BRAUCHT, kann man ja immer noch mit IsWindow prüfen, obs noch existiert und dann ggf. aus dem Objekt löschen.
naja, ich würde ja in dem fall lieber 'EnumWindows' neu starten
