FindWindowEx liefert kein Handle zurück
-
Mittels GetDlgItem erhalte ich wiederum kein Handle zum Button. SendDlgItemMessage bringt auch keinen Erfolg.
Mein Code bei GetDlgItem:
HWND btnYES = GetDlgItem(messageForm, IDYES);
Mein Code bei SendDlgItemMessage:
SendDlgItemMessage(messageForm, IDYES, WM_LBUTTONDOWN, MK_LBUTTON, NULL); SendDlgItemMessage(messageForm, IDYES, WM_LBUTTONUP, NULL, NULL);
-
inflames2k schrieb:
Merkwürdig an der Geschichte finde ich jedoch: Lasse ich mein Programm wenn die MessageBox oben ist noch einmal alles durchlaufen (Es passiert natürlich nix, bis die MessageBox an der reihe ist), wird das Button handle Problemlos ermittelt und der Button geklickt.
Woran könnte das liegen? Wie bekomme ich es hin, dass der Button beim ersten durchlauf bereits korrekt ermittelt wird?
Ich weiß nicht, ob das möglich ist, aber vielleicht bist Du beim ersten Durchlauf einfach zu schnell? So, dass das Fenster zwar schon existiert, dieses den Button aber noch nicht erstellt hat. Mach doch mal testweise zwischen Fensterhandle erfolgreich ermitteln und Versuch, Buttonhandle zu bekommen, ein
Sleep(1000);
.
-
Hier ein Beispiel, natürlich muss Du auch die HANDLEs für die Fenster anpassen.
void TestButtonDlg::OnBnClickedOk() { CWnd *win = GetDlgItem(IDCANCEL); WPARAM wParam = MAKEWPARAM( IDCANCEL, BN_CLICKED ); LPARAM lParam = 0; BOOL bval = ::PostMessage(::GetParent(win->m_hWnd), WM_COMMAND, wParam, lParam); }
-
Die Vermutung hatte ich auch schon. - Ich hab sogar schon 10 Sekunden gewartet... - Selbst in ner Schleife drauf warten, dass das Handle gefunden wird brachte keinen Erfolg.
-
Sigie schrieb:
Hier ein Beispiel, natürlich muss Du auch die HANDLEs für die Fenster anpassen.
void TestButtonDlg::OnBnClickedOk() { CWnd *win = GetDlgItem(IDCANCEL); WPARAM wParam = MAKEWPARAM( IDCANCEL, BN_CLICKED ); LPARAM lParam = 0; BOOL bval = ::PostMessage(::GetParent(win->m_hWnd), WM_COMMAND, wParam, lParam); }
Das Beispiel bezieht sich aber eher auf einen Prozess oder? Ich greif aber auf einen Fremdprozess zu.
Hab es jetzt einmal abgeändert probiert. Mein Code:
HWND btnYES = GetDlgItem(messageForm, IDYES); WPARAM wParam = MAKEWPARAM(IDYES, BN_CLICKED ); LPARAM lParam = 0; BOOL bval = ::PostMessage(::GetParent(btnYES), WM_COMMAND, wParam, lParam);
Ein Klick auf den Button passiert nicht, das Handle bleibt 0. Einziger dummer nebeneffekt: Der Dialog verschwindet hinter die zugehörige Anwendung.
-
Wenn es um Fremdprocess geht dann schau Dir den Post
http://www.c-plusplus.net/forum/294397
in den Thread suchst Du nach dem Fenster und schickst den Message an den Button.
Es ist einbischen Aufwand, aber es so funktioniert mit fremdprocessen.
-
In dem Thread gehts doch aber um DLL-Injection...
Grundlegend ist es so, dass ich das Tool welches die Lizenzinformationen schreiben soll in meinem Praktikum geschrieben habe, vor 2 Jahren.
Nun wollt ich aber eben hinzufügen, dass die Registrierung im Fremdprozess auch korrekt übersprungen wird.
Ich sehe nun keinen Grund, das komplette tool auf DLL Injection auszuweiten. Denn es funktioniert ja alles, bis auf das Ermitteln des Handels des Buttons.
-
ist in deinem Code btnYES != 0 ? Wenn ja dann hast Du den Handle von den Button,
Wenn btnYES ist NULL, dann ist IDYES falsch.HWND btnYES = GetDlgItem(messageForm, IDYES);
Versuch mal den PostThreadMessage zu benutzen.
Ich weiß nicht was nicht stimmt.
-
Nein, ich prüfe nicht btnYES != 0, sondern !btnYES. Düfte jedoch auf das selbe hinaus kommen. - Alles in allem ist das Handle eben nicht vorhanden.
PostThreadMessage werd ich morgen dann mal ausprobieren.
-
Es ist doch unnötig sich das Handle des IDYES Buttons zu besorgen und dann wieder ein GetParent zu machen.
Es sollte vollauf genügen ein PostMessage an das messageForm zu machen.
::PostMessage(messageForm, WM_COMMAND, MAKEWPARAM(IDYES,BN_CLICKED), 0);
Sofern also as Ctrl ID passt sollte dies schon genügen.
-
inflames2k schrieb:
Nein, ich prüfe nicht btnYES != 0, sondern !btnYES. Düfte jedoch auf das selbe hinaus kommen. .
Nicht ganz, dann lieber so:
if (btnYES) { // btnYES != 0 } else {// btnYES ist 0 }