Systemweiten Shortcut einrichten

Alles rund um die Programmierung mit Qt
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

So... Nachschlag für diejenigen die es interessiert: Das Abfragen welche der selbst registrierten Hotkeys gedrückt wurde erwies sich ebenfalls als einfacher als man denkt. Die ID die man in

Code: Alles auswählen

RegisterHotKey( this->winId(), 1, 0, VK_SCROLL );
festlegt (in dem Fall: 1) kann über die Message die der Handle des Programms bekommt abgefragt werden.

Code: Alles auswählen

bool main_window::winEvent( MSG *message, long *result )
{
	*result = 0;
	if( message->message == WM_HOTKEY )
	{
		switch( message->wParam )
		{
		case 0:
			on_take_screenshot();
			break;
		case 1:
			on_show_hide();
			break;
		default:
			;// ...
		}
		return true;
	}

	return false;
}
Ich frage ab, ob einer meiner von mir selbst registrierten Hotkeys gedrückt wurde (message->message == WM_HOTKEY) und überprüfe mit dem Parameter wParam von der MSG, welche ID der Hotkey hat...

Das einzige Problem, das mir jetzt bleibt ist, dass ich es nicht schaffe, während eines Spiels einen Screenshot zu machen.. wenn ich ein Spiel im Vollbildmodus laufen habe und mit meinem Programm einen Screenshot mache, bleibt das Bild schwarz. Ich vermute, das liegt an der Verhaltensweise von QPixmap::grabWindow. Kennt da jemand eine bessere Methode?
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Exasperation hat geschrieben: Das einzige Problem, das mir jetzt bleibt ist, dass ich es nicht schaffe, während eines Spiels einen Screenshot zu machen.. wenn ich ein Spiel im Vollbildmodus laufen habe und mit meinem Programm einen Screenshot mache, bleibt das Bild schwarz. Ich vermute, das liegt an der Verhaltensweise von QPixmap::grabWindow. Kennt da jemand eine bessere Methode?
Die Spiele oder Videos werden wohl DirectX oder DirectView oder DirectDraw oder so was verwenden. Da musst Du andere Techniken verwenden.
Gehen tut das irgendwie, siehe hier: http://www.softlist.net/search/qt-capture/
Linux, das längste Text-Adventure aller Zeiten
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Als Idee hätte ich noch den Vorschlag, dass man über Qt die Windows Screenshot-Funktion aufrufen könnte.. Also das, was über die Print-Taste aufgerufen wird... Weiß jemand, wie ich diese Funktion aus C++/Qt erreiche?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

Exasperation hat geschrieben:Als Idee hätte ich noch den Vorschlag, dass man über Qt die Windows Screenshot-Funktion aufrufen könnte.. Also das, was über die Print-Taste aufgerufen wird... Weiß jemand, wie ich diese Funktion aus C++/Qt erreiche?
- windows hotkeys
- windows screenshot-funktionalitaet
- wozu dann noch qt? das kleine fensterchen oder was da noch ist, kannste dann auch noch mit der win api machen ;-)

aber ich kann bestaetigen, dass QPixmap::grabWindow fuer directX, zumindest im vollbild, nicht funktioniert (openGl ist dagegen kein problem).

mfg,
julian
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Als weitere Möglichkeit habe ich mich jetzt daran versucht, einfach bei Druck auf meinen Hotkey die Print-Taste zu simulieren um danach dann mittels QClipboard aus dem Zwischenspeicher das Pixmap in eine Datei zu speichern...

Code: Alles auswählen

void main_window::sim_print_key()
{
	keybd_event( VK_PRINT, MapVirtualKey(VK_PRINT,0), 0, 0 ); // Key down
	keybd_event( VK_PRINT, MapVirtualKey(VK_PRINT,0), KEYEVENTF_KEYUP, 0); // Key up
}
Allerdings will das auch nicht funktionieren..

Kennt jemand die Funktion, die normalerweise in der winapi bei Druck auf die Drucken-Taste aufgerufen wird? Dann könnte ich die nämlich selbst aufrufen...
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Klasse... funktioniert auch nicht... wenn ich mir das Pixmap aus dem Clipboard hole bleibt das Bild bei Videos und Spielen immernoch schwarz... sehr schade :/

Hat jemand ne bahnbrechende Idee um Bilder aus Spielen und Filmen festzuhalten..? mit Qt ein Pixmap anzulegen klappt bie DirectX leider nicht :/



/Edit:
Tja... siehe da: Es liegt doch nicht am Pixmap Zeugs von Qt... Wenn ich mit meinem Programm einfach die Windows-Drucken-Taste auslöse und dann mal in Paint einfüge was im Zwischenspeicher ist, dann seh ich da bei einem Screenshot von einem Video/Spiel AUCH einen schwarzen Bildschirm ;) Also kann das wohl nichtmal die Windows-funktion... klasse... ;)
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

Ich habe vor dem gleichen Problem (unter Windows) gestanden.
Leider habe ich über Tante Google kein Beispiel für SystemHooks + QT
gefunden.

Musste mir meine Lösung also selber erarbeiten. Aber es hat geklappt!
Funktioniert einwandfrei.

Und wenn ich auch noch die Routine keybd_event verwende kann ich
Tastatureingaben verändern.

Z.B. ist auf meinem Laptop POS1 und PGUP auf der selben Taste und POS1
ist nur über eine Kombination von FN erreichbar. Das gleiche gilt für
ENDE und PGDOWN...

Also Programmierer finde ich das eher lästig. Ich brauche eher POS1
und ENDE im direkten Zugriff.

Daher biege ich nun per HOOK die Keyboard-Events um....
Antworten