Tooltip Problem
-
Sorry falsch kopiert:
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { if(Keyboard::IsKeyDown(Key::F4)) MessageBox::Show("F4 down"); if(Keyboard::IsKeyToggled(Key::F4)) MessageBox::Show("F4 toogle"); if(Keyboard::IsKeyUp(Key::F4)) MessageBox::Show("F4 UP"); }
Edit: KeyUp regiert immer... ich sollt zuerst alles doppelt testen bevor ich da was rein schreib
lg
-
Ja der Process für den Thread muss static sein, also mach es eben und ich denke einmal IsKeyDown reicht. Und nur weil du auf 1ms schaltest heißt noch lange nciht das es dann so in der Laufzeit wirklich passiert. Je nach Rechnerleistung eher 25ms. Dazu kommt es werden pro 1ms bestimmt jede menge Taktungen gemacht. Also chanche gleich NULL
-
Also hab mal die klasse static gemacht (ich hoffe das hast du gemient)
Folgender Fehler:
Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in PresentationCore.dll aufgetreten.Zusätzliche Informationen: The calling thread must be STA, because many UI components require this.
Code:
#pragma once using namespace System::Windows; using namespace System::Threading; using namespace System::Windows::Input; static ref class keyEventThread { public: static void waitOnKey() { while(1) { if(Keyboard::IsKeyDown(Key::F4)) //Debug haltepunkt für Fehler MessageBox::Show("F4 down"); } } };
-
seek1338 schrieb:
Also hab mal die klasse static gemacht (ich hoffe das hast du gemient)
Folgender Fehler:
Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in PresentationCore.dll aufgetreten.Zusätzliche Informationen: The calling thread must be STA, because many UI components require this.
Code:
#pragma once using namespace System::Windows; using namespace System::Threading; using namespace System::Windows::Input; static ref class keyEventThread { public: static void waitOnKey() { while(1) { if(Keyboard::IsKeyDown(Key::F4)) //Debug haltepunkt für Fehler MessageBox::Show("F4 down"); } } };
Zeig mir bitte mal den Thread deklartions-/instanzierungssatz.
-
So sieht der aus - 1zu1 MSDN Copy
Thread^ keyThread = gcnew Thread( gcnew ThreadStart( &keyEventThread::waitOnKey ) ); keyThread->Start();
Naja auch egal im Timer müsste wenigsten das Toogle Event funktionieren wenn ichs die ganze zeit gedrückt halte - tuts aber auch ned
lg
-
seek1338 schrieb:
So sieht der aus - 1zu1 MSDN Copy
Thread^ keyThread = gcnew Thread( gcnew ThreadStart( &keyEventThread::waitOnKey ) ); keyThread->Start();
Naja auch egal im Timer müsste wenigsten das Toogle Event funktionieren wenn ichs die ganze zeit gedrückt halte - tuts aber auch ned
lg
LOL
Was fehlt dir hier auf "&keyEventThread::waitOnKey"? Es sind die :: das geht nicht, dass musst anders erreichbar machen
-
Thread funktioniert normal das hab ich schon getestet. Nur wenn ich die System::Windows::Input::Keyboard static Methoden instanziere funktioneirts nicht.
Ich bin ein zu großer c++ noob um das so zu lösen. Ich werde einfach ne kleine headerdatei für Hooks schreiben und dann hat sich das problem gelöst.
lg seek
-
guch mal wenn du "The calling thread must be STA, because many UI components require this" in google eingibst findest du schon die Antworten.
-
Du hast wirklich eine Delegate von Keyboard erstellt?
-
Also ich hab dien rat befolgt und folgendes ergänzt:
keyThread->SetApartmentState(ApartmentState::STA);
Der Thread funktioniert jetzt.
Ich hab kein Delegate eingerichtet muss man das wenn ich die abfrage direkt mache mit :
static ref class keyEventThread { public: static void waitOnKey() { while(1) { if(Keyboard::IsKeyDown(Key::Z)) MessageBox::Show("F4 down"); if(Keyboard::IsKeyToggled(Key::Z)) MessageBox::Show("F4 down"); } } };
While(1) der Thread läuft die ganze zeit durch... also müssten auch die abfragen IsKeyEvents erkannt werden... oder nicht?
lg seek
-
Da habe ich voher schon bedenken gehabt! Was heißst while(1) ? mach mal lieber:
do {
...
down = true;
...} while(down == true);
-
Sag mal ich bin mir sicher das die Keyboard Klasse auch Events, wenn eine taste gedrückt wurde, hat.
-
Also
while(1) { //toDo }//endlosschleife
ist das gleiche wie
while(true) { //toDo }//endlosschleife
0 = true
0 = falseDie Klasse hat delegaten aber ich hab kien plan wie man die erstellen und benutzen kann
http://msdn.microsoft.com/de-de/library/system.windows.input.keyeventhandler(VS.85).aspx
lg seek
-
mach mal if(isKeyDown(Key::F4) == true)
-
-
Das Keyboard Event Problem habe ich neu reingepostet http://www.c-plusplus.net/forum/viewtopic-var-p-is-1753093.html#1753093 damit alle mal das durchlesen, ich hoffe das mir geholfen werden kann.
lg seek