Tasten druck simulieren
-
hallo ich Arbeite mit VC++ 6.0 unter winxp pro
Gibt es einen Befehl mit dem ich dem System einen Tastendruck simulieren kann?
es handelt sich dabei um Alt+Bildauf und Alt+Bildab, denn damit kann ich Anrufe von Skype annehmen oder ablehnen.Vielen Dank im voraus
-
ja, man kann Tasten simulieren. Jedoch soweit ich weiß nur betreffend des eigenen Programmes.
void PressNumLock( BOOL bState=true ) { BYTE keyState[256]; GetKeyboardState((LPBYTE)&keyState); if( (bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)) ) { keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 ); keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0); } }
Diese Funktion zB habe ich in der Konsole verwendet, und sollte einen Tastendruck auf die NUM-Taste simulieren...
der betreffende befehl wäre keybd_event. vielleicht funktionierts ja auch in MFCkeybd_event: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/keybd_event.asp
tasten: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/UserInput/VirtualKeyCodes.aspmfg (c)h
-
diese Beispiel hab ich auch schon gefunden nur funzt das bei mir nicht... sprich es springt erst gar nicht in die Funktion rein (if(bState .....) ) da fehlts bei mir. Ich nehme mal an das das unter MFC nich so recht will. Hat eventuell jemand eine andre Lösung bzw die hier in abgeänderter form?
-
Mach doch einen Hook!
Damit kann man auch systemweit Nachrichten wie WM_KEYDOWN verwalten.
-
Zu beachten ist, dass man heute eigentlich "SendInput" verwenden sollte... und bei mir funktioniert das sehr gut...
INPUT pInput[2]; pInput[0].type = INPUT_KEYBOARD; pInput[0].ki.wVk = VK_NUMLOCK; pInput[0].ki.wScan = 0; pInput[0].ki.dwFlags = 0; // Nill for keydown pInput[0].ki.time = 0; pInput[0].ki.dwExtraInfo = 0; pInput[1].type = INPUT_KEYBOARD; pInput[1].ki.wVk = VK_NUMLOCK; pInput[1].ki.wScan = 0; pInput[1].ki.dwFlags = KEYEVENTF_KEYUP; pInput[1].ki.time = 0; pInput[1].ki.dwExtraInfo = 0; if (SendInput(2, pInput, sizeof(INPUT)) == 0) { return false; } return true;
-
Wenn man die HardwareScancodes mit einbezieht funktionierts sogar für DirectInput
(SendInput)
-
das mit dem input läuft bei mir nicht so... muss ich da eine bestimmte bibliothek einbinden? und das mit dem hook... könntet ihr mir da eventuel bitte ein beispiel geben?
-
Frittnschneider schrieb:
das mit dem input läuft bei mir nicht so... muss ich da eine bestimmte bibliothek einbinden?
Was geht denn nicht. Kommt da vielleicht eine Fehlermeldung vom Compiler oder sonstwas??? Wäre es vielleicht sinnvoll, wenn Du diese als Fehlerbeschreibung mitteilen würdest?
Frittnschneider schrieb:
und das mit dem hook... könntet ihr mir da eventuel bitte ein beispiel geben?
Für was willst Du denn einen Hook, wenn Du tastedrücke simulieren willst!?
-
nun ja das mit dem hook hab ich qasdfgh (siehe oben)
der compiler erkennt die klasse bzw. des struct input nicht
: error C2065: 'INPUT' : nichtdeklarierter Bezeichner
: error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'pInput'
: error C2065: 'pInput' : nichtdeklarierter Bezeichner
: error C2109: Index benoetigt ein Feld oder einen Zeigertyp
: error C2109: Index benoetigt ein Feld oder einen Zeigertyp
: error C2228: Der linke Teil von '.type' muss eine Klasse/Struktur/Union sein
: error C2065: 'INPUT_KEYBOARD' : nichtdeklarierter Bezeichner
: error C2109: Index benoetigt ein Feld oder einen Zeigertyp
: error C2228: Der linke Teil von '.ki' muss eine Klasse/Struktur/Union sein
: error C2228: Der linke Teil von '.wVk' muss eine Klasse/Struktur/Union sein
: error C2109: Index benoetigt ein Feld oder einen Zeigertyp
[....]
: error C2065: 'SendInput' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.ach ja kann man auch zwei tastendrücke zu gleich simuliren? müsste nähmlich alt+bild auf bzw bild ab simulieren.
-
Vermutlich musst Du noch "_WIN32_WINNT=0x0400" in den Projekteinstellungen definieren, oder VOR dem #inlcude <windows.h>
#define _WIN32_WINNT 0x0400 #inlcude <windows.h>
Natürlich kannst Du auch mehrere "Tastedrücke" Simulieren... das wird gerade auch gemacht (nämlich 2: Taste drücken und Taste loslassen).
-
ich weis nicht was ich verkehrt mache es läuft halt immer noch nicht.... es sind die gleichen fehler beim compilieren. gibt es eventuell auch eine andre lösung?
-
Nimm eine richtige Entwicklungsumgebung und ein aktuelles PSDK...
-
Diese includes werden für die INPUT struktur und die DX Funktionen gebraucht
#include <WinAble.h> //SendInput #include <windows.h> //Standart #include <dinput.h> //DirectX #pragma comment(lib, "dinput8.lib" ) //DirectX #pragma comment(lib, "dxguid.lib" ) //DirectX
-
Ein vollständiges Beispiel:
#include <stdio.h> #define _WIN32_WINNT 0x0403 #include <windows.h> #include <tchar.h> int _tmain() { INPUT pInput[2]; pInput[0].type = INPUT_KEYBOARD; pInput[0].ki.wVk = 'A'; pInput[0].ki.wScan = 0; pInput[0].ki.dwFlags = 0; // Nill for keydown pInput[0].ki.time = 0; pInput[0].ki.dwExtraInfo = 0; pInput[1].type = INPUT_KEYBOARD; pInput[1].ki.wVk = 'A'; pInput[1].ki.wScan = 0; pInput[1].ki.dwFlags = KEYEVENTF_KEYUP; pInput[1].ki.time = 0; pInput[1].ki.dwExtraInfo = 0; if (SendInput(2, pInput, sizeof(INPUT)) == 0) { return 1; } return 0; }