Varrius Geschrieben 29. März 2005 Geschrieben 29. März 2005 hi, welchen befehl muss man verwenden, um mit einem programm einen tastendruck zu simulieren (zB. wie die Bildschirmtastatur). sprich wenn ich einen button klicke, soll dem rechner vorgespielt werden, das auf der tastatur eine taste gedrückt wird danke Varrius Zitieren
Klotzkopp Geschrieben 29. März 2005 Geschrieben 29. März 2005 Das kommt auf das verwendete Betriebssystem an. Mit Standard-C oder C++ geht da gar nichts. Zitieren
Varrius Geschrieben 29. März 2005 Autor Geschrieben 29. März 2005 arbeite unter win xp pro, dafür soll es auch laufen bzw. nur xp wenn das nicht mit c bzw. c++ funktioniert womit dann? denke mal microsoft wird auch nur c benutzt haben und deren bilschirmtastatur funktioniert ja auch Zitieren
Klotzkopp Geschrieben 29. März 2005 Geschrieben 29. März 2005 wenn das nicht mit c bzw. c++ funktioniert womit dann? denke mal microsoft wird auch nur c benutzt haben und deren bilschirmtastatur funktioniert ja auch Es funktioniert nicht mit Standard-C oder C++. Du musst betriebssystemspezifische Erweiterungen benutzen, die nicht vom Standard abgedeckt werden. Darum ist dein Thread auch verschoben worden. SendInput sollte dir weiterhelfen. Zitieren
Varrius Geschrieben 29. März 2005 Autor Geschrieben 29. März 2005 vielen dank, werd das dann mal probieren ich denke bei MS Visual Studio sollte der auch inner hilfe beschrieben sein werd noch nen feedback geben ob klappt oder nicht Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 das programm steht soweit, also kompiliert ohne fehler und warnungen allerdings funktioniert das noch nicht so, wie ich das will, denn das programm läuft als mfc im vordergrund und schickt die zeichen somit an sich selbst, soll es aber in ein anderes fenster schicken wie krieg ich es jetzt hin, das das programm wie die bildschirmtastatur zwar zu sehen, aber nicht aktiv im vordergrund ist? (bsp.: start->programme->zubehör->eingabehilfen->bildschirmtastatur) danke schonmal programmiere mit MS Visual Studio 6 Zitieren
SNOWMAN Geschrieben 30. März 2005 Geschrieben 30. März 2005 oioioi.... also ne direkte lösung kann ich dir jetzt leider nicht sagen, aber: Als wir damals angefangen haben zu programmieren hat man uns erklärt das jede eingabe dir wir machen über das OS verarbeitet wird und ans entsprechene Programm geleitet wird. Ich stell mri das jetzt saukompliziert vor, aber mein Lösungsansatz wäre: Beim klicken auf deine eigene Bildschirmtastatur wird das ereigniss von Windows verarbeitet. WinXP sendet dann die Infos (was auch immer das sein mag) an dein Programm zurück und das erhält "Linke Maustaste klickt auf xyz" oder so. Tja, nun ist eigneltich alles was du machen musst: Biege die Rückgabe von WinXP um. Du musst halt dafür sorgen das alle Rückgabewerte deines Programms, (bis auf den Beendenknopf) nicht an dieses, sondern an das aktuell aktive Programm gesendet werden. Hierfür muss du dein Prog. natürlich irgendwie dazu bringen nicht aktiv zu sein. Nun, das mal fürs logische, die Umsetzung ist eine eigene Welt Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 struct tagINPUT *input; struct tagKEYBDINPUT key; input=new struct tagINPUT; input->type=1; key.wVk=0x77; key.wScan=0x77; key.dwFlags=KEYEVENTF_KEYUP; key.time=100; key.dwExtraInfo=NULL; input->ki=key; SendInput(1,input, sizeof(input)); so sieht bei mir das senden des "w" aus, zumindest sollte es das sein ich weiss nun aber nicht, wie ich ein anderes fenster aktiv machen kann, damit es dorthin geleitet wird Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 so sieht bei mir das senden des "w" aus, zumindest sollte es das sein Leider nicht ganz. sizeof(input) == sizeof(INPUT *) == 4 (wie alle Zeiger auf 32Bit-Windowsplattformen) sizeof(INPUT) passt besser. Die simulierten Tasten landen in dem Fenster, das den sog. Fokus hat. Du kannst einem Fenster den Fokus mit SetFocus zuweisen. Dazu brauchst du ein Fensterhandle, das du z.B. mit FindWindowEx bekommen kannst. Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 sizeof(INPUT) passt besser. Die simulierten Tasten landen in dem Fenster, das den sog. Fokus hat. Du kannst einem Fenster den Fokus mit SetFocus zuweisen. Dazu brauchst du ein Fensterhandle, das du z.B. mit FindWindowEx bekommen kannst. müsste das nicht wenn sizeof(tagINPUT) heissen? ich hab mal das hier probiert, um ein offenes Word nach vorne zu bringen, allerdings gibt's ne fehlermeldung von wegen überladene funktion für das "=" SetFocus = FindWindowEx(NULL, NULL, "","Microsoft Word"); ich hab das so verstanden, das das FindWindowEx mir die Adresse des gesuchten Fensters gibt und ich diese SetFocus zuweisen muss, da das ja ein Zeiger auf ein Fenster sein soll Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 müsste das nicht wenn sizeof(tagINPUT) heissen?Wenn, dann sizeof(struct tagINPUT). Die tag-Namen sind für C, denn nur da brauchst du überhaupt einen typedef für die struct. Beim typedef-Namen kannst du nämlich das "struct" weglassen. Unter C++ brauchst du gar keinen typedef. SetFocus = FindWindowEx(NULL, NULL, "","Microsoft Word"); ich hab das so verstanden, das das FindWindowEx mir die Adresse des gesuchten Fensters gibt und ich diese SetFocus zuweisen muss, da das ja ein Zeiger auf ein Fenster sein sollSetFocus ist eine Funktion, die du aufrufst, keine Variable, der du etwas zuweisen könntest. Du solltest hier auch nicht die Begriffe "Adresse" und "Zeiger" verwenden. Handles sind etwas anderes als Zeiger. Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 das mit dem sizeof hab ich nun geändert wie du sagtest, hat problemlos funktioniert :floet: ich kann aber an SetFocus keine Parameter übergeben, woher weiss er dann welches Fenster er aktivieren soll? (hab leider nur ne Englische Hilfe ) hab das auch ein wenig mit dem Ruckgabezeiger verplant und sag mir nicht das das keiner ist, denn meine Hilfe sagt es wird ein Pointer zurück gegeben bei SetFocus Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 Du bringst zwei unterschiedliche Funktionen durcheinander: Die WinAPI-Funktion HWND SetFocus(HWND) und die MFC-Funktion CWnd* CWnd::SetFocus(). Benutzt du die MFC? Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 hab es bisher immer mit dieser MFC probiert CWnd* CWnd::SetFocus(). werd mir dir andere mal angucken, ob es damit funktioniert er bietet mir die andere auch nicht an, wie kann ich diese aufrufen? wenn ich das so aufrufe, kommt die fehlermeldung, das die funktion keine parameterübergabe erlaubt SetFocus(FindWindowEx(NULL, NULL, "","Microsoft Word")); Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 Wenn du die WinAPI-Funktion innerhalb einer Memberfunktion einer von CWnd abgeleiteten Klasse benutzen willst, musst du zwei Doppelpunkte vor den Funktionsnamen schreiben: ::SetFocus(wasauchimmer); Dann wird die Funktion im globalen Namensraum gesucht. Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 ok, das klappt schonmal allerdings scheint mein FindWindowEx nicht ganz zu stimmen, da er nicht mein offenes Word in den Vordergrund holt sieht so aus: ::SetFocus(FindWindowEx(NULL, NULL, "","Microsoft Word")); gibt es dazu Beispiele, die mir beim verstehen helfen? Zitieren
U-- °LoneWolf° Geschrieben 30. März 2005 Geschrieben 30. März 2005 ok, das klappt schonmal allerdings scheint mein FindWindowEx nicht ganz zu stimmen, da er nicht mein offenes Word in den Vordergrund holt sieht so aus: ::SetFocus(FindWindowEx(NULL, NULL, "","Microsoft Word")); gibt es dazu Beispiele, die mir beim verstehen helfen? Das liegt vermutlich daran das der Name des Fensters vom offenen Dokument abhängig ist. Beispielsweise Dokument1.doc - Microsoft Word. Versuche mal *.Microsoft Word oder so, bei Winrunner ist das ähnlich. Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 hab das hier gefunden, das liefert den Wert des Yes-Buttons von ZoneAlarm FindWindowEx(findwindow('#32770',nil),0,nil,'&Yes'); ich versuche grad mit findwindow an das richtige fenster zu kommen, sollte dann ca. diese form haben FindWindowEx(findwindow('#xxxx', "* Word"), 0, NULL,NULL); woher krieg ich denn nun die Werte für #xxxx und würde das dann vielleicht funktionieren oder such ich dann totalen quatsch? oder is Word ein Child Window des Desktop, dann könnt ich das weglassen und hiermit krieg ich die adresse des ie HWND ie = FindWindowEx(NULL, NULL, "IEFrame", NULL); leider klappt es nicht, das mit ::SetFocus(ie); in den Vordergrund zu holen Zitieren
Varrius Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 das mit dem IEFrame funktioniert leider nur, weil das der Klassenname der IExplorer is, ich hät das lieber allgemein kann es sein, das das mit dem SetFocus nicht in den Vordergrund kommt, weil nur die Keyboardeingabe dahin umgeleitet wird und nix anderes? der edit war nicht mehr da Zitieren
U-- °LoneWolf° Geschrieben 30. März 2005 Geschrieben 30. März 2005 #32770' Das wird vermutlich nicht Funktionieren. Da dies nur das Aktuelle Windowhandle darstellt. Beim nächsten Strat ist dort wider ein ganz anderer Wert zu nutzen siehe Spy++. Spy++ ist beim Visal Studio dabei unter Microsoft Visual Studio 6.0\Microsoft Visual Studio 6.0-Dienstprogramme\Spy++. Damit kannst du dir aktuelle Handels anzeigen lassen. Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 FindWindowEx unterstützt keine Wildcards. Du musst durch alle Top-Level-Fenster iterieren, den Fenstertitel mit GetWindowText holen und darin dann nach "Microsoft Word" suchen. Zitieren
Varrius Geschrieben 31. März 2005 Autor Geschrieben 31. März 2005 so, das finden der Fenster is nicht mehr das Problem, zumindest wenn es nur eins gibt, wenn aber 2 word fenster da sind, is das ein wenig schwieriger, is aber erstmal egal, soll nur 1 da sein zur zeit sieht das so aus: INPUT *input; KEYBDINPUT key; input=new INPUT; input->type=1; key.wVk=0x77; key.wScan=0x77; key.dwFlags=KEYEVENTF_KEYUP; key.time=100; key.dwExtraInfo=NULL; input->ki=key; HWND word=FindWindowEx(0,0,"OpusApp",0); ::SetFocus(word); SendInput(1,input, sizeof(INPUT)); allerdings erscheint im Word kein "w", wie ich mir das dachte (es erscheint nix) sind meine KEYBDINPUT Daten so ok? oder wo liegt der Fehler danke mal wieder für meine kleinen fortschritte FindWindowEx(0,0,"OpusApp",0); <- das "OpusApp" hab ich mir bei Spy++ als Klasse abgeguckt Zitieren
U-- °LoneWolf° Geschrieben 31. März 2005 Geschrieben 31. März 2005 Word bekommt das 'W' vermutlich, jedoch weis Word nichts damit anzufangen so lane du nicht in die Seite geklickt hast. Versuchs doch erstmal mit dem Editor (NotePad). Zitieren
Varrius Geschrieben 31. März 2005 Autor Geschrieben 31. März 2005 hab alles so gelassen wie es war, nur das hier verändert: HWND word=FindWindowEx(0,0,"Notepad",0); allerdings erscheint auch dort kein zeichen, geschweige denn ein w Zitieren
Klotzkopp Geschrieben 31. März 2005 Geschrieben 31. März 2005 Varrius, du schickst nur ein Key-Up-Event, d.h. das Loslassen einer Taste. Das reicht nicht. Da ist aber auch noch ein Fehler von mir drin: SetFocus funktioniert nur bei Fenstern, die aus dem aufrufenden Thread erzeugt wurden. Ersetze SetFocus durch SetForegroundWindow. Die Tastenkommandos kannst du dann so senden: INPUT input[2]; input[0].type = INPUT_KEYBOARD; input[0].ki.dwFlags = 0; // Key down input[0].ki.wVk = 'W'; input[0].ki.dwExtraInfo = 0; input[0].ki.time = 0; input[1] = input[0]; input[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(2,input, sizeof(INPUT)); [/CODE] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.