Herausfinden welches Programm gerade aktiv ist
-
Hallo !
Weiss jemand wie das geht ?
Mit WIN API und C++MFG
-
Dieser Thread wurde von Moderator/in davie aus dem Forum C++ 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.
-
Wenn du mit "Programm das gerade aktiv ist" das Fenster meinst, mit dem der User momentan interagiert, dann kannst du GetForegroundWindow() verwenden um ein Handle auf dieses Fenster zu erhalten.
-
okay aber geht trotzdem nicht.
Der Rückgabewert der Funktion ist CWnd *
und damit das funktioniert muss ich die afxwin.h einbinden.Aber ich mach eine Konsolenanwendung und irgendwie lässt sich das nicht kompilieren. Wegen MFC oder ?
Was mach ich falsch ?
MFG
-
Der Rückgabewert sollte nicht CWnd* sein. Das kann nur sein wenn die Funktion innerhalb einer MFC-Fensterklasse aufgerufen wird (oder auch ein anderes Framework). Wenn du nämlich keine Doppelpunkte (Scope-Operator '::') vor die Funktion setzt, dann wählt der Compiler die Klassenfunktion statt der globalen API-Funktion. Soviel mal dazu...
Hast du jetzt eine Konsolenanwendung als Projekt erstellt oder eine MFC-Anwendung?
-
Ich mach eine Konsolenanwendung.
Was bekomm ich denn dann als Rückgabewert bei ::GetActiveWindow() ?
-
@chr1s: Es geht um diese Funktion: GetForegroundWindow und dazu musst du windows.h einbinden

-
Mist du warst zu schnell... wollts grad eritieren
Ich mein natürlich folgendes :Was bekomm ich denn dann als Rückgabewert bei ::GetForgroundWindow() ?
-
Die Antwort hast du doch jetzt schon - ein HWND. Aber was hast du überhaupt damit vor?
-
In den FAQs gibts doch das KeyboardHook.
Und da muss man an die Funktion SetupHook(HWND) HWND uebergeben.
naja das mach ich ja jetzt und es lässt sich auch kompilieren aber
wie man dann einen Tastendruck simuliert blick ich bis jetzt noch nicht ...
Mal sehn vielleicht find ichs raus hier mal mein Code :while(true) { SetupHook(::GetForegroundWindow()); UINT_PTR x = 10; LONG_PTR y = 10; SendMessage ((::GetForegroundWindow()), (0x0400 + 2), (UINT_PTR) x, (LONG_PTR) y); Pause(5); UninstallHook(); }ist bestimmt völlig falsch ^^
bin mir nichtmal sicher ob diese Keyboard Hook Klasse dafür gemacht ist zum Tastendruck simulieren ...
Oder ganz einfach gesagt:
Was ich brauche ist mouse_event(...)
nur für keyboard !
-
oh mann ich habs glaub ich gefunden
keybd_event heisst des !
oh mann mal testen obs funkt !
-
Da bist du jetzt leider völlig falsch

edit: jetzt nicht mehr
Mit dem Hook kannst du über einen Tasten-Druck informiert werden - und dann hättest du eine Message an dein Fenster bekommen (hier ein fremdes anzugeben macht absolut keinen Sinn).
Aber willst du jetzt einen Tastendruck oder eien Mausklick?! Weil du hast oben ein x und ein y Wert angegeben

Ansonsten schau dir mal SendInput an
-
Okay die Simulation funktioniert schonmal.
Aber wie kann ich möglichst einfach jegliche Tastatur und Mausereignisse
abfangen bzw. empfangen wenn das Programm welches dies tut im Hintergrund läuft.
Also nur damit es keine Misverständnisse gibt :
Ich möchte im Prinzp jeden Tastendruck, jeden Mausklick und jede Mauspositionveränderung mitspeichern (loggen).
Muss ich das in einer Schleife machen die andauernd alles überprüft oder gibts da ne möglichkeit das ich einfach die ereignisse zum Zeitpunkt der Entstehung mitspeichern kann ??
-
Dzu brauchst du jetzt den Key- bzw. Mouse-Hook

-
Die Tastenereignisse von Maus und Tastatur hol ich mir mit
GetAsyncKeyState
und die Mausposition mit
GetCursorPosSo ists am einfachsten find ich.
Funktioniert ganz gut.Aber da ist auch schon das nächste Prob:
Wie kann ich eine While(true) Schleife, also eine Unendlichschleife mit einem Timer programmieren ?

Bei der While schleife laggt alles voll rum aber den Timer blick ich im Moment grad nicht.
Ich such im Prinzip sowas wie DoEvents bei Visual Basic!
Gibts da sowas in C++ oder wie mach ich das am besten ?
Sollte schon schön flüssig laufen das programm ohne so doofe n00bie-schleifen
Falls du mir da noch mal den Schubs in die Richtige Richtung geben könntest wäre ich dir sehr dankbar

-
Wenn ich dich richtig verstanden habe hast du doch eine Konsolenamnwendung, oder nicht - also hast du auch keine Messages zu verarbeiten.
Also sollte ein einfaches Sleep(0) in der while-Schleife schon helfen - aber mit einem Hook wäre es sicher sauberer