Zum Inhalt springen

Tastendruck simulieren


Varrius

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

        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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 soll

SetFocus 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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"));

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

#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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...