SendMessage
-
Hi,
wie kann ich einen Button in einem Kindfenster clicken lassen??? die msdn library kann mir hier nicht wirklich weiterhelfen.
über sendmessage(...,...,...,...); muss das ja gehen.
tipps, code's etc... !!!???mfg
cookie_woman
-
BM_CLICK.
-
Kommt drauf an....
WM_COMMAND
BN_CLICKED
-
BN_CLICKED ist die Notification Message, wenn ein Buttin geklickt wurde. Er will aber, wenn ich das richtig verstanden, habe sleber klicken.
-
Es sollte doch aber egal sein, ob ich dem Button selber sage "Hey, Freundchen, Du bist geklickt worden!" oder aber dem zugehörigen ParentWindow sage "Hey, Dein Button XXX ist geklickt worden!", oder?
-
hi,
über
HWND hwndParent; HWND hwndChildAfter; hwndParent = FindWindow("Elternfenster-Klasse",NULL); hwndChildAfter = (hwndParent,"Kindfenster-Klasse",0,0); HWND hWndButton = FindWindowEx(hwndParent,hwndChildAfter,"Button-Klasse","Buttonname"); HWND hwndfind = FindWindowEx(hwndParent,hwndChildAfter, NULL,"Kindfenster-Caption"); { SendMessage(hwndfind,WM_COMMAND,MAKEWORD(0,BN_CLICKED),(LPARAM)hWndButton); }
sollte es eigentlich gehen. Aber, da passiert nichts.
Wer kann Hilfestellung geben???Cookie_WOMAN
-
wie wärs mal mit'n bisschen fehler überprüfung. zeigt hwndfind überhaupt auf das richtige fenster?
-
Was bezweckst Du mit dieser Zeile???
hwndChildAfter = (hwndParent,"Kindfenster-Klasse",0,0);
Außerdem mußt Du das OWNER-Window mit BN_CLICKED ansenden, NICHT den Button selber!
Du kannst es auch so machen (wenn der Button auf einem DialogFenster sitzt):
iButtonID = GetDlgCtrlID(hButtonHWND); SendMessage(hParentHWND, WM_COMMAND, iButtonID, NULL);
.
[ Dieser Beitrag wurde am 18.05.2003 um 13:49 Uhr von Hepi editiert. ]
-
hi,
Was bezweckst Du mit dieser Zeile???
hwndChildAfter = (hwndParent,"Kindfenster-Klasse",0,0);
ich will auf die kindklasse zugreifen können.
Nach nochmaliger Überprüfung bin ich darauf gekommen, warum der Button nicht clickt.
In meinem Code geht es so
Elternfenster->Kindfenster->Button(Button ist ja auch ein Kindfenster).
Aber in wirklichkeit ist es:
Elternfenster->Kindfenster->Kindfenster->Button(der gedrückt werden soll)
Somit ist alles etwas undurchsichtiger geworden.
Wie Steuere ich ein Button eines Kindfenster vom Kindfenster eines Elternfenster an???cookie_woman
-
ich nochmal.
hier der gesamte code und Hintergrund der ganzen Sache:
HWND hWindow; Handel für Elternfenster HWND hwndParent; // Elternfenster HWND hwndChildAfter; //Kind-Classe Fenster hWindow = FindWindow("AOL Frame25","AOL"); hwndParent = (hWindow,"AOL") ; hwndChildAfter = FindWindowEx(hwndParent,"MDIClient","MDIClient",0); if (hwndParent == NULL) // Wenn AOL_Fenster(Eltern) nicht gefunden wurde { ShowMessage("Fenster von 'AOL' nicht gefunden!\n\nAOL wird gestartet!"); ShellExecute(NULL,"open","aol.exe",NULL,"C:\\Programme\\AOL 7.0\\aol.exe",SW_SHOWNORMAL); } else //-----------------------Beginn Handle für AOL-Kindfenster-MDIClient---// { ShowMessage("Fenster von AOL gefunden"); } if (hwndChildAfter == 0) // Wenn Fenster "MDIClient" NICHT gefunden wurde { ShowMessage("MDIClient nicht gefunden"); } else { ShowMessage("MDIClient gefunden"); // handel zum nächsten Kindfenster ??? }
Hintergrund: Ich möchte eine Software bauen, die die Funktionalität der "AOL SOFTWARE" erweitert...Sprich es sollen bestimmte Funktionen die ich immer per Hand einstelle automatisiert werden. Andererseits möchte ich funktionen Einbauen, die AOL von "Hause aus" nicht mitbringt...
Zuerst möchte ich es aber erstmal schaffen, dass AOL automatisch gestartet wird (das funktioniert auch schon...) und das es sich dann mit meinen Daten auch automatisiert anmeldet.(Das funktioniert noch nicht)
Mir ist etwas aufgefallen was ich voher nicht bemerkt habe...und zwar ist das anmelden Fenster (da wo ich meine Logindaten eingebe) kein direktes "kind" vom AOL Hauptfenster (Klasse: AOL Frame25), sondern es liegt auf einem "unsichtbaren" Kindfenster (MDIClient)...
Über Hilfe bin ich dankbar
cookie_woman
[ Dieser Beitrag wurde am 18.05.2003 um 15:45 Uhr von cookie_woman editiert. ]
[ Dieser Beitrag wurde am 18.05.2003 um 15:54 Uhr von cookie_woman editiert. ]
-
Ich wiederhole mich ungern, aber sieh Dir endlich mal die Funktion EnumChildWindows() an!
Außerdem stolpere ich immer noch über
hwndParent = (hWindow,"AOL") ;
Was ist das? 'ne neue unsichtbare Funktion? Läuft das so überhaupt durch den Compiler???
[ Dieser Beitrag wurde am 18.05.2003 um 15:55 Uhr von Hepi editiert. ]
-
hi,
bin gerade dabei das mit EnumChildWindows() auszuprobieren.
hwndParent = (hWindow,"AOL") ;
hWindow ist die Variable auf FindWindow(parent,"Titel des parent-Fenster");
,"AOL" ist das gleiche. Ist also ein "kann/muss aber nicht sein".Ja, das läuft durch den Compiler.
cookie_woman
[ Dieser Beitrag wurde am 18.05.2003 um 17:22 Uhr von cookie_woman editiert. ]
-
Original erstellt von cookie_woman:
**```cpp
hwndParent = (hWindow,"AOL") ;Ja, das läuft durch den Compiler.**
Glaube ich dir nicht. Jeder Compiler der das ohne Warnung kompiliert ist sein geld nicht wert.
-
hm... das wird jetzt offtopic. glaub es oder nicht.
konstructive ideen zu meinem problem sind besser.cookie_woman
-
Das "Problem" ist, das Dein "Problem" nicht wirklich ein Problem ist.
Da aber Dein Quelltext für manche von uns unkompilierbar zu sein scheint, macht es das uns nicht unbedingt leichter, Dir zu helfen!Ich z. B. kenne auch ShowMessage überhaupt nicht (ist das MFC? VCL? Oder was?)
Genauso wie
hwndParent = (hWindow,"AOL");
Mein Compiler/Linker meint dazu folgendes:
d:\Visual Studio-Projekte\Test\main.cpp(324): error C2146: Syntaxfehler : Fehlendes ')' vor Bezeichner 'hWindow'
d:\Visual Studio-Projekte\Test\main.cpp(324): error C2059: Syntaxfehler : 'Zeichenfolge'
d:\Visual Studio-Projekte\Test\main.cpp(324): error C2059: Syntaxfehler : ')'Nach meinem befinden fehlt dazwischen ein FindWindowEx oder so...
Aber, naja, was solls....
Für mich ist Dein Quelltext schlichtweg nicht kompilierbar (siehe auchHWND hWindow; Handel für Elternfenster
, wird sicherlich nur'n Tippfehler sein, aber egal) und daher befinde ich mich nicht in der Lage, Dir zu helfen!
Fakt ist: Ich kann fremde Buttons in fremden Anwendungen klicken...
-
Hi, ich versuche es zu erklären.
Original erstellt von Hepi:
**
Ich z. B. kenne auch ShowMessage überhaupt nicht (ist das MFC? VCL? Oder was?)
**Dies ist eine ganz normale Botschaft. Zu finden unter
[url] ]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsdesigniuiserviceclassshowmessagetopic1.asp[/url]**
Genauso wiehwndParent = (hWindow,"AOL");
**
Ich hatte vorausgesetzt, das bekannt ist, dass hwndParent nur eine Variable ist bzw. sein kann.
Also:
[code type="C++"]
HWND hWindow;
hWindow =FindWindow("Parent-Fenster-Klasse","Titel des Parent");
if (hWindow == NULL);
{
ShowMessage("Parent-Fenster nicht gefunden");
}
else
{
ShowMessage("Parent-Fenster gefunden");
}
[code/]**
wird sicherlich nur'n Tippfehler sein, aber egal) und daher befinde ich mich nicht in der Lage, Dir zu helfen!
**Schade. Eigentlich.
**
Fakt ist: Ich kann fremde Buttons in fremden Anwendungen klicken...**Und wie sieht der code dazu aus ???
cookie_woman
[ Dieser Beitrag wurde am 18.05.2003 um 22:20 Uhr von cookie_woman editiert. ]
-
Aus Mangel an AOL-Software (Brrr, bei dem Gedanken daran schüttelt es mich schon) kann ich das nicht testen bzw. 100%ig lauffähig gestalten, sollte aber so (oder so ähnlich, Gedankenansätze hab ich weißgott genug geliefert) funktionieren!
Wenn nicht lern mal die Benutzung von Spy++ oder ähnlichen (Freeware-)SpyTools!
Ach, und ShowMessage() ist kein "normaler" Befehl sondern gehört zum .NET Framework. Ich wußte nicht das Du den Benutzerkreis Deiner Programme so sehr einschränken willst, aber naja, jeder so wie er mag...
Benötigte Header/Libs suchste mal selber anhand der verwendeten Funktionen zusammen... etwas Arbeit sollst Du ja auch noch haben....
... char szUeberwachungsOrdner[]="C:\\Programme\\AOL 7.0\\aol.exe"; EnumWindows(EnumProc, NULL); ... BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) { char szBuffer[256*4]; GetPathFromHandle(hwnd, szBuffer); if (_stricmp(szBuffer, szUeberwachungsOrdner)==NULL) { EnumChildWindows(hwnd, EnumChildWindowsProc, NULL); return FALSE; } return TRUE; } BOOL CALLBACK EnumChildWindowsProc ( HWND hCWnd, LPARAM lParam) { char szText[256]; int iLoginButton=0; GetWindowText(hWnd, szText, 256); if(strcmp(szText, "Anmelden")==NULL) // Oder wie der Button auch immer heißen mag! { iLoginButton = GetDlgCtrlID(hCWnd); SendMessage(hWnd, WM_COMMAND, iLoginButton, NULL); return FALSE; } else return TRUE; } void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle) { // // Diese Funktion läuft nur unter NT/2K/XP! // // Für Win9x check GetWindowModuleFileName and GetModuleFileName DWORD lpdwProcessId; HANDLE hProcessHandle; GetWindowThreadProcessId(hWnd, &lpdwProcessId); hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, lpdwProcessId); GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH); CloseHandle(hProcessHandle); }
Ach, und
hwndParent = (hWindow,"AOL");
ist immer noch falsch, ganz egal was hwndParent für 'ne Variable ist!
[ Dieser Beitrag wurde am 19.05.2003 um 07:58 Uhr von Hepi editiert. ]
-
Hi,
sorry... Es muss natürlich heisen:
HWND hwndParent = FindWindowEx(hWindow,"AOL");Hatte cca. 8 Stunden davor gesessen. Und ich habe nur noch HWND's gesehen
Werde mal dein Script ausprobieren.
Meine momentane Lösung:// HWND sind selbstverständlich hWindow = FindWindow("Eltern","Titel"); hwndmdi = FindWindowEx(hWindow, NULL,"Child",0); hwndsignon = FindWindowEx(hwndmdi, NULL,0,"Child 2"); hwndbutton = FindWindowEx(hwndsignon,0,0,"Buttonname"); if (hWindow == NULL) { ShowMessage("Eltern Fenster nicht gefunden!\n\nProgramm wird gestartet!"); ShellExecute(NULL,"open","prog.exe",NULL,"C:\\Prog\\Pfad\\prog.exe",SW_SHOWNORMAL); } else //-----------------------Beginn Handle für KindfensterKlasse1---// { ShowMessage("ElternFenster gefunden"); do { //do something with hwndChildAfter // Handel zum 1. Kindfenster if (hwndmdi == 0) { ShowMessage("1. Kindfenster nicht gefunden"); } else { ShowMessage("1. Kindfenster gefunden :-)"); } // Handel zum 2. Kindfenster do { if (hwndsignon == 0) { ShowMessage("2. Kindfenster nicht gefunden"); } else { ShowMessage("2. Kindfenster gefunden :-)"); } // Handel zum Button do { if (hwndbutton == 0) // Wenn Button NICHT gefunden wurde { ShowMessage("Button nicht gefunden"); } else { ShowMessage(" Button gefunden :-)"); SendMessage(hwndbutton,BM_CLICK,0,0); // Handel zu anderer Klasse } } while(hwndbutton = FindWindowEx(hwndsignon,"ButtonKlasse",0,0)) ; } while(hwndsignon = FindWindowEx(hwndmdi,"2. Kindfenster-Klasse", 0, 0)) ; } while(hwndmdi = FindWindowEx(hWindow, "1. Kindfenster-Klasse", 0, 0)) ;
Der Button wird zwar noch nicht geclickt, aber da komme ich noch dahinter.
cookie_woman
-
Jo, also mein Code "klappert" erstmal alle Fenster ab und vergleicht, ob es zur "C:\Programme\AOL 7.0\aol.exe" gehört.
Wenn das so ist, dann werden mit EnumChildWindows() alls Kindfenster dieses einen Fensters "abgeklappert".
Von jedem Fenster (Button, EditContols usw.) holt sich die Funktion den Titel (GetWindowTitle()) und vergleicht ihn mit "Anmelden" (das mußt Du halt durch den richtigen ButtonText ersetzen, den Du brauchst!).
Wenn auf dem Button "Anmelden" steht wird er geklickt (dazu hole ich mir die SteuerID des Buttons (GetDlgCtrlID()) und sende sie als WM_COMMAND an das Hauptfenster. Bei Dialogen sollte das einwandfrei funktionieren...)
-
Tach, oder doch schon fast guten Morgen ;-),
ich habe mal deinen Code ausgeführt. Bei mir kommt bei:
EnumWindows(EnumProc, NULL);
[C++ Fehler] Unit1.cpp(70): E2034 Konvertierung von 'void *' nach 'int (__stdcall *)()' nicht möglich [C++ Fehler] Unit1.cpp(70): E2342 Keine Übereinstimmung des Typs beim Parameter 'lpEnumFunc' ('int (__stdcall *)()' erwartet, 'void *' erhalten) [C++ Fehler] Unit1.cpp(74): E2108 Ungültige Verwendung von typedef 'BOOL'
Wie könnte ich das ändern?
cookie_woman