Tastatur ansteuerung
-
Hi,
ich muß ein Progamm über eine Hardware fernsteuern. Leider läßt sich dies nur durch die Steuertasten ansteuern (links,rechts,oben ,unten). Habe mit Spy++ die Nachricht ausgelesen und diese im Prinzip nachgebildet. Leider reagiert das Programm überhaupt nicht. Was fehlt noch??? Welche Nachrichten sind noch notwendig um ein Programm mit den Steuertasten ansteuern zu können? Kann mir jemand helfen?KEYDATA sKey ; memset ( &sKey , 0 , sizeof ( KEYDATA ) ) ; sKey.cRepeat = 1; sKey.ScanCode = 0x4B; sKey.fExtended = 1 ; sKey.fAltDown = 0 ; sKey.fRepeat = 1 ; sKey.fUp = 0 ; DWORD dwVal_down ; memcpy ( &dwVal_down , &sKey , sizeof ( DWORD ) ) ; HWND hwnd = ::FindWindow("XXX",NULL); ::PostMessage(hwnd,WM_KEYDOWN,VK_LEFT,dwVal_down);
-
Hatten wir das nicht gerade eben erst!?
Ach ja:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1595296.html#1595296"Die Unsitte Tastatureingaben mit WM_KEYDOWN Nachrichten zu simulieren"
http://blog.m-ri.de/index.php/2007/12/27/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren/
-
folgendes hab ich auch leider ohne Erfolg ausprobiert.(Das war mein erster Versuch)
HWND hwnd = ::FindWindow("XXX",NULL); AttachThreadInput(GetWindowThreadProcessId(hwnd,NULL), GetCurrentThreadId(), TRUE); ::SetForegroundWindow(hwnd); ::SetActiveWindow(hwnd); ::SetFocus(hwnd); if(hwnd) { m_st_connect.SetWindowText("verbunden!"); if(v0>2.7) { INPUT in; KEYBDINPUT kin; kin.wVk = kin.wScan = VK_LEFT; kin.dwFlags = 0; kin.time = NULL; kin.dwExtraInfo = GetMessageExtraInfo(); in.type = INPUT_KEYBOARD; in.ki = kin; UINT si = SendInput (1, &in, sizeof(in)); } }was ist daran falsch
-
Du solltest die Taste *drücken* und dann natürlich auch wieder *loslassen*!
-
HWND hwnd = ::FindWindow("XXX",NULL);
AttachThreadInput(GetWindowThreadProcessId(hwnd,NULL), GetCurrentThreadId(), TRUE);
::SetForegroundWindow(hwnd);
::SetActiveWindow(hwnd);
::SetFocus(hwnd);
if(hwnd)
{ m_st_connect.SetWindowText("verbunden!");
if(v0>2.7)
{
INPUT ipSignal;
ipSignal.type = INPUT_KEYBOARD;
ipSignal.ki.wVk = VK_LEFT;
ipSignal.ki.wScan = 0;
ipSignal.ki.dwFlags = 0L;
ipSignal.ki.time = 0L;
ipSignal.ki.dwExtraInfo = 0L;
SendInput(1, &ipSignal, sizeof(ipSignal));ipSignal.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ipSignal, sizeof(ipSignal));
}
}auch kein erfolg

wird noch irgendwas benötigt.
-
Christian Steinmann schrieb:
auch kein erfolg
Es wäre schön, wenn Du uns ein bißchen mehr Infos geben würdest...
Erst mal eins nach dem anderen...

Klappt es überhaupt mit dem AttachThreadInput() ? Wenn ja, wie hast Du Dich da vergewissert?
Martin
-
AttachThreadInput() gibt ein bool zurück. Da kann man schauen. Wahrscheinlich geht es über DirectInput. Ist meine Vermutung. Hab mal zur Sicherheit das Notepad als "Senke" genommen. Da funktioniert alles. Auch alle anderen Versuche... Das würde bedeuten einen Treiber zu schreiben. Einzige Hoffnung das ich falsch liege ist ein kleines Programm was sich PPJoy nennt. Damit kann ich ein Virtuelles Joystick erstellen und zum beispiel "Left" auf die 1 mappen. Und das geht. Aber bei meinem Glück ist das ein Treiber... womit ich wieder bei DirectInput und einem neuen Treiber wäre.
Was ich machen möchte:
Ich hab einen Drehgeber und einem USB Analog Digital Wandler. Kann also ein Analogsignal einlesen. Was auch alles funktioniert. Damit möchte ich einen Simulator "fernsteuern". Da keine Schnittstelle OLE oder irgendwas offen liegt also der Versuch über die Tastatur oder ein Joystick zu gehen.
-
An welche Applikation willst Du es denn senden?
Was für ein OS?
Bitte prüfe die Rückgabewerte den Funktionen!!!
Auch "SendInput" kann versagen (z.B: wegen UIPI)!
-
Jochen Kalmbach schrieb:
Bitte prüfe die Rückgabewerte den Funktionen!!!
sehr schön. aber könntest du endlich mal diese bescheuerten ausrufezeichen weglassen?
-
Christian Steinmann schrieb:
AttachThreadInput() gibt ein bool zurück. Da kann man schauen. Wahrscheinlich geht es über DirectInput.
Hmmm, glaubst Du, diese Information bringt uns als Helfer weiter? (Ja, wir wollen Dir helfen
)Nun, bleiben wir also bei Deiner Problemsituation (hier also im Zusammenhang mit PPJoy).
Ich weiß nicht, wieviel Programmiererfahrung Du hast.
Bei einem Problem müssen wir nun mal Schritt für schritt die einzelnen Funktionen abchecken, bis wir den (oder die) Übeltäter gefunden haben.
Welche Funktionen arbeiten fehlerfrei, welche ist die erste Funktion die einen Fehler (oder ein unsinniges Handle) liefert?
Und deshalb hatte ich meine Frage nach dem Gelingen von FindWindow() und AttachThreadInput() hier reingestellt. (sie sind ja die ersten Funktionen in Deinem Code).
Und deshalb empfiehlt Jochen auch, die Rückgabewerte der Funktionen zu prüfen.Die erste und wichtigste Frage lautet daher: Was liefert AttachThreadInput() für einen Rückgabewert?
Martin
-
Hallo Martin und Jochen,
tschuldigung das ich mich nicht melden konnte. War bis jetzt beschäftigt. Zu Euren Fragen. Mein Programmierlevel ist ausreichend. Aber man kann ja nie alles wissen. Und es sah auch so aus als ob ich irgendwas vergessen oder übersehen hätte. Kennt Ihr sowas?
Also AttachThreadInput() und FindWindow() liefern das richtige. Das passt alles. Hab gestern abend dann noch den Hack mit DirectInput versucht. Also Adresse suchen und mal frech reinschreiben. Aber der Erfolg war sehr NAJA. Irgendwas passierte. Ist mir aber zu heikel. Wenn ich mal ein bisl Zeit hab werde ich das weiter verfolgen. Variante 2 war dann Treiber schreiben. Hab ich nach dem Untersuchen des DDK direkt verworfen. Nicht in 2 Tagen.
Jetzt hab ich einen Workaround gefunden der zwar funktioniert aber aus dem ich noch nicht ganz schlau werde. Muss aber erstmal schnell meine Application stricken und dann untersuch ich nochmal alles. Der Trick ist einfach PPjoy nehmen dann zum Beispiel für "up" scannen lassen und natürlich aus meiner applikation mit SendInput eine "1" schicken. Tja und dann kommt ein "N" raus. Das ist sozusagen das einzige Rätsel. Bei "2" kommt ein "M" raus. Ich vermute mal entweder irgend ein UNICODE spass oder ein falsches Casting. Geht aber. Auch Deterministisch.danke für Eure Hilfe.
Wenn Ihr mal hilfe braucht stehe auch gern zur Verfügung ...Christian