Hilfe: Window Class Name ändert sich ständig
-
Hi Leute,
ich hoffe, Ihr könnt mir bei meinem Problem helfen.
Ich habe ein kleines Progrämmchen in C# geschrieben, welches mittels "SendKeys"
per Button-Klick Tastenkombinationen an eine andere Anwendung schicken soll.Soweit so gut. Leider ändert sich der Wert für "Class Name" bei jedem Start meiner zu steuernden Anwendung. Folglich bekomme ich kein Fokus auf dieses Fenster.
Hier mal ein Besipiel:
Programmstart 1: Class Name = Afx:00400000:8:00010011:00000000:00080A23
Programmstart 2: Class Name = Afx:00400000:8:00010011:00000000:022E0609
usw.Was kann ich denn jetzt tun, damit ich den Fokus auf dieses Programm erhalte?
Vielleich ist es auch noch wichtig zu erwähnen, dass der angezeigte Name "ROMES" für das zu steuernde Programm zwar immer korrekt ist, dahinter aber noch weiterer Text steht, der sich ändert je nach dem welche Datei geladen ist.Hier mal der Code-Ausschnitt:
// Get a handle to the application. The window class // and window name were obtained using the X-Spy tool. IntPtr rHandle = FindWindow("Afx:00400000:8:00010011:00000000:00080A23", "ROMES"); // Verify that Calculator is a running process. if (rHandle == IntPtr.Zero) { MessageBox.Show("Application is not running."); return; } // Make application the foreground application and send a key. SetForegroundWindow(rHandle); SendKeys.SendWait("{F6}"); . . .
Vielen Dank schon mal!
Cheers!
Sebastian
-
HILFEEEE schrieb:
Hi Leute,
..Leider ändert sich der Wert für "Class Name" bei jedem Start meiner zu steuernden Anwendung. Folglich bekomme ich kein Fokus auf dieses Fenster.
Vermutlich haben die Programmierer der Anwendung eben genau aus diesen Grund dafür gesorgt, damit man die Anwendung eben nicht so einfach fernsteuern kann.
Vielleicht gibt e ja irgendwo ein Control (Button, Listbox, etc.) in der Hauptform, dessen Classname sich nicht ändert, damit könntest du dich zurückhangeln, um das Handle des Hauptfensters zu bekommen.
-
Du könntest mit EnumWindow/EnumChildWindows arbeiten und dann mit nem Wildcard-Stringvergleich, also ROMES *, arbeiten.
Die Vermutung von Burkhi das der Name extra so generiert wird das man es nicht so leicht fernsteuern kann ist falsch. Der Klassenname wird von der MFC erzeugt.
-
......... schrieb:
Du könntest mit EnumWindow/EnumChildWindows arbeiten und dann mit nem Wildcard-Stringvergleich, also ROMES *, arbeiten.
Die Vermutung von Burkhi das der Name extra so generiert wird das man es nicht so leicht fernsteuern kann ist falsch. Der Klassenname wird von der MFC erzeugt.
Auch falsch, die MFC hat damit nix zu tun. Das liegt am GC.
-
Der Windowclass-Name wird in der Datei wincore.cpp von MFC generiert.
_sntprintf_s(lpszName, _AFX_TEMP_CLASS_NAME_SIZE, _AFX_TEMP_CLASS_NAME_SIZE - 1, _T("Afx:%p:%x:%p:%p:%p"), hInst, nClassStyle, hCursor, hbrBackground, hIcon)
-
......... schrieb:
Der Windowclass-Name wird in der Datei wincore.cpp von MFC generiert.
_sntprintf_s(lpszName, _AFX_TEMP_CLASS_NAME_SIZE, _AFX_TEMP_CLASS_NAME_SIZE - 1, _T("Afx:%p:%x:%p:%p:%p"), hInst, nClassStyle, hCursor, hbrBackground, hIcon)
Dadurch hat die MFC quasi also schon von sich aus für diesen "Zugriffsschutz" gesorgt.
Danke für den Hinweis.
-
hi leute,
vielen dank, dass ihr hier so fleißig geantwortet habt!
ich habe mit demEnumWindow/EnumChildWindows
leider noch
gar keine erfahrungen gemacht. hat da jemand von euch ein bespiel für mich oder
ist hier was gutes bei msdn zu finden?danke schon mal!
gruß sebastian
-
Für die Umsetzung nach C# am besten immer bei pinvoke.net schauen:
http://www.pinvoke.net/default.aspx/user32/EnumWindows.html
-
hi leute,
also das beispiel scheint ja nicht ganz richtig zu funktionieren!
kann mir mal jemand ein beispiel-code snippet geben, womit ich ein
fenster finden kann, indem ich nach einem teil des fenstertitels suche?das wäre super nett!
gruß
sebastian
-
noch etwas:
vielleicht kann ich ja den desktop nach fenstern durchsuchen, die den string "ROMES" enthalten?!
und anschließend mir anschließend den class name geben lassen?
hat jemand einen tipp für mich, wie ich endlich zum ziel komme?