Button in Fremdanwendung ausblenden
-
Leider blieb meine Freude nur von kurzer Dauer, die ID des buttons ändert sich leider bei jedem Start der Fremdanwendung

-
Du brauchst aber irgend etwas, das konstant bleibt - ID, Caption, Position oder zur Not eben die Anzahl der davorliegenend Child-Fenster (bei EnumChildWindows bzw. FindWindowEx) - sonst wüsste ich nicht, wie du drankommen willst.
-
Ok dann versuch ich das mal!
Das lustige ist, das die Steuerelementen ID = Steuerelementen Handle ist.
Also alles sehr kurios..
-
Das hört sich nach einem Delphi Programm an, welches mit der VCL erstellt wurde.
-
Jo Winspector gibt mir was mit Delphi bei dem Buttons zurück!
-
Dann hilft nur noch ein: Mit EnumChildWindows alle Buttons durchgehen und die Beschriftung vergleichen. Die Fensterklasse ist TButton bei VCL Anwendungen.
-
Hmm das könnte ich tuen, obwohl ich mir nicht sicher bin ob ich die Caption der Buttons extrahiert bekomme, denn weder Spy++,Winspector oder X-Spy konnte die Caption extrahieren.
-
Hmm wenn ich wüsste wie ich die reellen Left und Top werte von einem dieser Buttons ermitteln könnte, könnte ich per ChildWindowFromPoint den Handler leichter ermitteln ;P
-
gekommst noch ein tip, es ginge wahrscheinlich auch mit:
FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
-
Danke Nox, leider lässt sich der Handler des Buttons nicht ermitteln, da er keine Caption ausspuckt bzw. hat!
-
Irgendwie is heut nich mein Tag, der durchläuft das EnumChildWindows nur 1 mal
//Ausschnitt aus der Message Schleife inkl. WM_COMMAND Message hwndPXButton = FindWindowEx(hwndPX, 0, "TSeSkinButton", NULL); //hwndPX = Handle vom TMainForm der Anwendung if (EnumChildWindows(hwndPX,EnumChildWindowsProc,0)) { ShowWindow(hwndPXButton,SW_HIDE); } break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } //CALLBACK Function von EnumChildWindows BOOL CALLBACK EnumChildWindowsProc(HWND hwndChild, LPARAM lParam) { int a=0; char sWindowText[]=""; TCHAR buffer[255]; ZeroMemory(buffer,255*sizeof(TCHAR)); GetWindowText(hwndChild, buffer, 255); if (buffer=="SMS-Center") { hwndPXButton=hwndChild; } return FALSE; }
-
Wie könnte man das ganze denn angehen (sry bin Umsteiger von VB auf C++)

-
Zeig mal deine Code-Versuche

-
Sry, wenn das etwas chaotisch aussieht und manche variablen sinnfrei im raum stehen *g* Aber ich beiß mir echt die Zähne an den sch**ß Buttons aus

Da oben könnt ihr meine Code Versuche betrachten.
-
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
-
Licht aufgeh, wer lesen kann ist klar im Vorteil

-
So er hat nun alle Controls durchlaufen, aber scheinbar hat er nen Prob mit der Caption oder die Buffer deklaration ist falsch bzw. ich werte sie falsch aus

-
Du kannst nicht einfach == für den Vergleich nehmen, sondern brauchst spezielle Funktionen, wie z.B. lstrcmp dafür

-
Hmm wie vermutet, die Caption der Controls lässt sich nicht extrahieren, weil es ein grafischer Button ist.
Ich habe die Buffervariable in die Überwachung eingefügt und sie gibt permanent einen null string zurück
BOOL CALLBACK EnumChildProc(HWND hwndChild,LPARAM lParam) { int iLength=0; char buffer[255]; iLength=GetWindowTextLength(hwndChild); GetWindowText(hwndChild,buffer,iLength+1); return true; }
-
Mir bleibt jetzt nur noch übrig, den Button über seine Position zu ermitteln, aber leider wird die Position zum Screen und nicht zum Client angegeben. Wie kann ich die Position zum Client ermitteln?