grofaz
Goto Top

C++ Console im Hintergrund laufen lassen und Tastenbefehle weiterhin aufnehmen und ausgeben

Hallo.
Ich habe ein kleines programm in cpp geschrieben.
Ich benötige es für einen turnierablauf.

Das programm wird vom user per console geöffnet.
Das programm wird dann mit einem hotkey gestartet (Eine tastatureingabe, welche auch das eigentliche spiel startet),
dann läuft ein countdown. Bei 0 null, gibt das programm einen tastatur key aus.(dieser befehl soll sas andere spiel stoppen)

Das problem:
Sobald die console nichtmehr im vordergrund liegt, bzw sobald es nicht mehr das aktive fenster ist, nimmt sie weder tastaturbefehle auf, noch gibt sie welche aus.
Das programm soll aber eigentlich im hintergrund arbeiten.


Wie könnte ich dieses problem lösen ?

Content-ID: 566258

Url: https://administrator.de/forum/c-console-im-hintergrund-laufen-lassen-und-tastenbefehle-weiterhin-aufnehmen-und-ausgeben-566258.html

Ausgedruckt am: 21.12.2024 um 15:12 Uhr

rubberman
rubberman 21.04.2020 um 20:19:53 Uhr
Goto Top
Wie könnte ich dieses problem lösen ?
Indem du erst mal deinen derzeitigen Code postest. Denn selbst das was du bislang tust, lässt sich nicht mit dem C++ Standard umsetzen. Also nutzt du jetzt schon eine Drittbibliothek oder direkt die API der Plattform auf der dein Programm läuft. Aber selbst das Betriebssystem hast du uns nicht verraten ...

Steffen
Grofaz
Grofaz 21.04.2020 um 20:24:42 Uhr
Goto Top
Win 10 64
Dev cpp
Code:

#include <iostream>
#include<string>
#include <stdlib.h> for system()
#include <windows.h>
for Sleep() and Beep()
#include<conio.h>
using namespace std;

int main()
{
char start, end;
int timer;
cout << "Enter Start Button ";
cin >> start;
cout << "Enter Timer in Seconds ";
cin >> timer;
cout << "Enter Button To Be Pressed At End ";
cin >> end;
system("cls"); clear screen
char start_key;
int loop;
while (true)
{
cout << "Press Start Key ";
start_key = _getch();
if (start_key == start)
{
for (loop = 0; loop <= timer; loop++)
{
system("cls");
clear screen
cout <<loop<<" Second ";
Sleep(1000); wait for one second

}
system("cls");
clear screen
Key press code
INPUT input;
INPUT structure
memset(&input, 0, sizeof(input));

fill it out for keyboard key presses...
input.type = INPUT_KEYBOARD;
input.ki.wVk = VkKeyScanA(end);

Sleep(1000);
SendInput(1, &input, sizeof(INPUT));
3rd param is size of an INPUT structure
2nd is LP to INPUT
1st is number of structures..

modify the structure to do key up, a zero will indicate key down, as used above
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));

cout << "Key Pressed Successfully";
Sleep(1000);
system("cls");
clear screen
}
system("cls"); //clear screen
}
return 0;
}
rubberman
rubberman 21.04.2020 um 20:51:56 Uhr
Goto Top
C, C++, WinAPI Gemüsesuppe face-smile

SendInput versucht eine einfache Keyboard Emulation. Heißt, der gesendete Input landet auf dem Fenster das gerade den Keyboard Focus hat (so wie bei einer normalen Tastatureingabe). Welches Verhalten du aber eigentlich willst (also welches Fenster nun welchen Input empfangen soll) habe ich noch nicht verstanden. Sicherlich musst du dir aber ein Fensterhandle holen und mit SendMessage oder PostMessage in das Messagequeue des Fensters schreiben. Nicht so trivial ...

Steffen
Grofaz
Grofaz 21.04.2020 um 20:58:48 Uhr
Goto Top
Das fenster, in dem das programm läuft, soll auch auf meine tastatureingabe reagieren können, auch wenn es nicht im vordergrund ist.
Mit dem output von meinem programm ist es das gleiche. Dieser soll das im vordergrund laufende rennspiel pausieren lassen.
rubberman
rubberman 21.04.2020 um 21:13:18 Uhr
Goto Top
Verwirrend. Immer nur ein Fenster kann den Keyboard Focus haben.
Wenn ich das halbwegs verstanden habe, müsstest du in deinem Programm einen Globalen Keyboard Hook anlegen. Das ist dann wie eine Rohrleitung. Tastatureingaben gehen erst mal zum Hook, dort kannst du programmatisch auswerten was angekommen ist. Dann geht die Tastatureingabe an das Programm mit dem Focus. Kannst du ja mal ausprobieren.

Steffen
Grofaz
Grofaz 21.04.2020 um 21:36:49 Uhr
Goto Top
Werds versuchen, danke