Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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

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

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

        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

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.

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

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.

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

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

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?

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.

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

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

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

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

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

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

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]

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.