unbekannten Button auslösen
-
Hi ...
Mit Hilfe der Suchfunktion habe ich leider nichts
zu meinem Problem gefunden.
Ich möchte von einem Fenster, was sich öffnet und
mir unbekannt ist, wissen ob es einen Button
beinhaltet oder ein Editfenster oder nicht.
Das Fenster was sich geöffnet hat kann ich ja finden
mit Hilfe von
CWnd *goeffnetesfenster=GetForegroundWindow();.
bzw. mit FindWindow(....).
Wie kann ich aber dieses Fenster jetzt durchsuchen
nach einem Button oder Editfeld ?
Ich weis nicht wie ich und wo ich da anfangen
soll....
Ich hoffe Ihr könnt mir helfenIm voraus ...
Danke für Eure Hilfe
Klaus
-
Hallo,
Du musst schon wissen wie der Button heisst oder was dieser für eine ID hat.
Wenn Du z.B. fremde Programme steuern willst, belibt Dir nichts anderes Übrig als mit dem Spy das Fenster einmal zu analysieren da Du ja den richtigen Button brauchst. Man kann zwar ziemlich aufwendig ein Fenster durchsuchen aber dann hast Du immer noch nicht den Button den Du brauchst wenn mehrere drauf sind. Denn zum Glück kann man die Funktionen nicht zuordnen/auslesen.
Gruß
Ocrana
-
Hi ...
@Ocrana:
Danke für Deine schnelle Antwort.
Ich habe das Fenster mit Spy++ mir angesehen.
Der Button den ich benutzen möchte heißt "S&tarten".
Die ID ist mir jedoch unbekannt.
Wie kann ich jetzt diesen Button in dem Fenster
was "Hallo" heißt greifen, geschweigedenn einmal
betätigen ?Betätigen dürfte mit SendMessage() gehen, aber wie
finde ich jetzt diesen Button in dem "Hallo"-
Fenster ?Danke für Eure Hilfe
Klaus
-
Hallo,
ok, Du hast zwei Möglichkeiten:
1.) DU weisst wie das Fenster heisst und Du weisst die ID des Buttons (über den Spy):
HWND pDlg, cDlg;
int iSel;iSel = SendMessage(pDlg, CB_FINDSTRING,-1,(LPARAM)"HelloWorld");
if(!iSel)
return;do
{
cDlg=GetDlgItem(pDlg, 0x01) //Angenommen der Button hat die ID 0x01
}while(!cDlg);//Wenn gefunden:
SendNotifyMessage(cDlg,WM_LBUTTONDOWN,0,0);
SendNotifyMessage(cDlg,WM_LBUTTONUO,0,0);Das wars. Die zweite Methode ist, Du suchst auf dem pDlg noch das CDlg mit dem FINDSTRING Wert.
Gruß
Ocrana
-
Hi ....
Ich habe jetzt den Zeiger auf das Window.
Ebenfalls habe ich den Zeiger auf den Button im Window.
Das habe ich so gelöst:CWnd *gefundenesfenster=GetForegroundWindow(), *derbutton=gefundenesfenster->GetNextDlgTabItem(gefundenesfenster,FALSE);
Jetzt habe ich versucht, mit
::SendNotifyMessage(derbutton->m_hWnd,WM_LBUTTONDOWN,0,0); ::SendNotifyMessage(derbutton->m_hWnd,WM_LBUTTONUP,0,0);
den Button auszulösen,aber leider ohne Erfolg ......
Was mache ich falsch ???@Ocrana:
Kannst Du mir bitte nochmal helfen ??Gruß
Klaus
-
@Klaus: Wie so ist dir die ID unbekannt, wenn du es mit Spy++ untersucht hast?
-
Hi ...
Frage von @Luckie:
Wieso ist dir die ID unbekannt, wenn du es mit Spy++ untersucht hast?Mir ist die ID zwar bekannt gewesen
, aber es ging mir
nicht nur um den Button, sondern generell um andere Button´s.
Deshalb habe ich versucht ohne die ID auszukommen.
Ich möchte nicht immer Spy++ verwenden, um die ID
eines Button´s heraus zu bekommen, sondern das Programm
von mir soll es von vornherein selbständig machen können.Die Lösung ist manchmal so einfach das man garnicht
auf die Lösung kommt.
Ich Danke vor allem nochmal @Ocranafür die tatkräftige Hilfe.
Hier meine Lösung dazu:
/* Fenster wurde zuvor durch mein Programm gestartet und befindet sich im Vordergrund*/ CWnd *gefundenesfenster=GetForegroundWindow()/*Fenster holen*/, *derbutton=gefundenesfenster->GetNextDlgTabItem(gefundenesfenster,FALSE)/* Button holen*/; ...... /*Button auslösen*/ ::SendNotifyMessage(derbutton->m_hWnd,WM_LBUTTONDOWN,0,0); ::SendNotifyMessage(derbutton->m_hWnd,WM_LBUTTONUP,0,0); ......
Bis dann
Gruß
Klaus
-
Hallo,
versuch mal derbutton->getsafehwnd();
Gruß
Ocrana
-
ID <> Handle. Die ID ändert sich nicht. Die mußt du dir nur einmal beim Porgrammieren holen - fertig.
-
Hi ...
Ich habe vergessen zu schreiben was der Fehler war,
denn ich finde es sinnvoll das hin zu schreiben
damit andere den Fehler nicht auch machen.Da habe ich leider aber auch keine Ahnung.
Auf einmal ging es, wieso ?keine Ahnung........
auf einmal ging es ......@Ocrana:
Ich werde es mit derbutton->getsafehwnd(); ausprobieren.@Luckie:
Danke für die Erklärung.
Das mit der ID <> Handle habe ich bisher nicht so gewußt.
Ich hatte angenommen eine ID wäre eine Zahl die übergeben
wird. Wie z.B.
#define IDB_BUTTONSTARTPROG 1000
oder so ...in der "Ressource.h" ,
woraus dann Handle folgt.Gruß
Klaus
-
Moin,
ein Tip, such mal nach Autoit. Das ist dann zwar nicht C++ aber ein kostenloses Tool mit dem man PC's / Programme automatisch steuern kann.
Gruß, Tom
-
Hi ...
Danke Dir @Tom für den Tipp.
Ich möchte aber nicht auf andere Programme angewiesen sein,
deshalb will ich mir mein Programm selbst für meine Zwecke
zuschneiden und weiter entwickeln.
Es ist aber eine gute Anregung (die Hilfe) für Sachen
die ich vorher noch nicht bedacht hatte.Danke
Gruß
Klaus