DirectInput Hintergrund Anwendung



  • Hallo 🙂

    Ich weiß nicht, ob ich hier im richtigen Unterforum bin, da man auch denken könnte, dass es sich um Spieleprogrammierung handelt wegen DirectX.
    Nein das stimmt nicht.
    Es ist mit DirectX, aber es ist eine Hilfsanwendung und keine Spieleprogrammiererei. Falls es noch ein besser passendes Unterforum gibt einfach hier schreiben, oder falls der Leser ein Administrator ist einfach verschieben 🙂

    Das Problem:
    Ich möchte ein Programm macht welches Tastendrücke emuliert.
    Das ist auch ganz einfach mit einer Funktion.
    Das Problem ist jedoch, dass das Programm im Hintergrund laufen muss.
    Sodass ich bei der Funktion als zweiten Parameter DISCL_BACKROUND verwendet habe.
    Sodass es eigentlich auch im Hintergrund laufen sollte.
    Der Code von SetCooperativeLevel ist folgender:

    if (FAILED(lpDevice->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)))
    	{
    		MessageBox(NULL, "Fehler bei der Funktion SetCooperativeLevel(...)", "Error", NULL);
    		return;
    	}
    

    Es läuft einfach nicht im Hintergrund das heißt normalerweise wenn es im Fordergrund ist und ich 0 schreibe wird eine Zahl von -1 - 9 emuliert.
    Was genau dahinter steckt ist jetzt ja irrelevant.
    Jedenfalls, wenn das Programm im Hintergrund ist erkennt es keine Tastendrücke mehr.
    Hier noch die Abfrage, ob eine Taste gedrückt wurde:

    void Input(void)
    {
    	int input = Taste.GetKeyboardInput();
    	if (input & zeroo)
    	{
    		switch (ob)
    		{
    		case -1: {ob++; VR = 0x30; break; }
    		case 0: {ob++; VR = 0x31; break; }
    		case 1: {ob++; VR = 0x32; break; }
    		case 2: {ob++; VR = 0x33; break; }
    		case 3: {ob++; VR = 0x34; break; }
    		case 4: {ob++; VR = 0x35; break; }
    		case 5: {ob++; VR = 0x36; break; }
    		case 6: {ob++; VR = 0x37; break; }
    		case 7: {ob++; VR = 0x38; break; }
    		case 8: {ob++; VR = 0x39; break; }
    		}
    		char bol[256];
    		sprintf_s(bol, "%i", ob);
    		SetWindowText(hwNd, bol);
    		keybd_event(VR,
    			0x45,
    			KEYEVENTF_EXTENDEDKEY | 0,
    			0);
    
    		keybd_event(VR,
    			0x45,
    			KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
    			0);
    		Sleep(300);
    	}
    }
    

    So ich hoffe das mir jemand weiterhelfen kann und ich werde auf keine Vorschläge eingehen wie, DirectInput ist total alt, hol dir xInput.
    Ok ?

    MfG Ja aber nur mit der Rei In Der Tube !



  • Entschludigung für die ganzen Rechtschreibfehler !!!

    Ich habe es leider nicht korrigiert 😞



  • wenn ich fragen darf:
    Warum möchtest du so etwas machen?
    Was willst du damit bezwecken?



  • FrageAntwort schrieb:

    wenn ich fragen darf:
    Warum möchtest du so etwas machen?
    Was willst du damit bezwecken?

    Ok dann werde ich es eben verraten.

    Es gibt Spiele wie Euro Truck Simulator 2, die verschiedene Schaltoptionen haben.
    Sequenziell (nur hoch und runter), h-gang (das ganz normaler mit kupplung usw.),
    Automatik.
    So, das Problem ist nur das viele trotz eines Sequenziellen Schaltwerkes mit Kupplung fahren möchte.
    Das geht aber nicht so ainfach weswegen ich ein Programm erstelle, das folgender maßen funktioniert. Am Start des Programmes muss der gang 0 eingelegt sein.
    Wenn man 0 drückt soll er eines Höher, das heißt von 0 auf 1 usw.
    Und das ganze auch noch zurück. Und dann wäre es halt möglich Kupplung und Sequenziell zu benutzen.



  • ReiInDerTube123 schrieb:

    FrageAntwort schrieb:

    wenn ich fragen darf:
    Warum möchtest du so etwas machen?
    Was willst du damit bezwecken?

    Ok dann werde ich es eben verraten.

    Es gibt Spiele wie Euro Truck Simulator 2, die verschiedene Schaltoptionen haben.
    Sequenziell (nur hoch und runter), h-gang (das ganz normaler mit kupplung usw.),
    Automatik.
    So, das Problem ist nur das viele trotz eines Sequenziellen Schaltwerkes mit Kupplung fahren möchte.
    Das geht aber nicht so ainfach weswegen ich ein Programm erstelle, das folgender maßen funktioniert. Am Start des Programmes muss der gang 0 eingelegt sein.
    Wenn man 0 drückt soll er eines Höher, das heißt von 0 auf 1 usw.
    Und das ganze auch noch zurück. Und dann wäre es halt möglich Kupplung und Sequenziell zu benutzen.

    gute erklärung... 😃

    hast du mal das versucht: 😉

    RegisterRawInputDevices
    GetRawInputData

    oder

    SetWindowsHookEx

    vll hilft dir das... 🙄
    oder willst du unbedingt genau deine methode nutzen?



  • nachtrag: ACHTUNG globale hooks werden von virenprogrammen als virus/keylogger erkannt... 🙄



  • ach so du könntest auch dein problem ganz anders angehen...
    du schaltest einfach auf tasten druck ...
    also wenn 0 gedrückt wird event XYZ ausgelöst was dann alles macht ....
    dann brauchst du nicht "lauschen" ob etwas gedrückt wird sondern du "löst" auf tastendruck etwas aus 😉 ist vll einfacher umzusetzen und gibt weniger probs mit anti-viren programmen...

    sofern du wirklich ein beschriebenes prog. erstellen willst... 🙄



  • HALLO 🙂

    Ich habe das Problem gefunden.
    Undzwar: Man kann die Tastatur nicht im Hintergrund laufen lasssen.
    Ich habe das jetzt mit einem Controller gemacht und es funzt 🙂



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Holzhammermethode wäre GetAsyncKeyState() zu verwenden.
    Ist zwar verpönt, aber halt auch ach-so-praktisch 🙂


Anmelden zum Antworten