KeyEvent Problem



  • Hallo!

    Dieses Problem existiert schon einmal im forum aber es ist in einem Thread der nichts damit zu tun hat, also eröffne ich mal ein neuen Post.

    Folgendes Problem:
    .) Es soll beim drücken von F4 zBsp: die Form Visible=false gestzt werden

    Damit ich es hier besser darstellen kann habe ich ein Test Consolen Projekt erstellt. Hier der Code dazu:

    // testen2.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Windows::Input;
    
    [STAThread]
    int main(array<System::String ^> ^args)
    {
    
    	bool check = true;
    
    	while(check) {
    
    		//Check after Down Status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    
    		//Check after Pressed(toogled) status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    
    		Console::WriteLine(".");
    	}
    }
    

    Es wird
    1.)...\program files\reference assemblies\microsoft\framework\v3.0\presentationcore.dll
    2.)...\program files\reference assemblies\microsoft\framework\v3.0\windowsbase.dll
    als Verweis includiert. Diese beinhalten die notwändigen Namespaces und KeyEnumaration.

    Problem ist es funktioniert nicht 😃

    Man kann F4 drücken so oft wie man will oder gedrückt halten aber es wird nicht erkannt.

    Das überhaupt die dll funktioniert sieht man anhand des folgenden beispiels:

    //Check after Up status
    		if(Keyboard::IsKeyUp(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    

    Hier wird die ganze zeit die If bedienung erfühlt, da das key nicht gedrückt ist.

    Vielleicht muss man ein delegaten einrichten aber ich weis nicht wie das geht. Hier der Link zu MSDN http://msdn.microsoft.com/de-de/library/system.windows.input.keyboard.keydown.aspx

    Es wäre super toll wenn mir jemand sagen könnte wie es funktionieren sollten vielleicht anhand eines codes oder link (ich hab leider nichts dafür gefunden was derweil funktioniert hat)

    lg seek



  • http://msdn.microsoft.com/de-de/library/system.windows.input.keyeventhandler.aspx

    gcnew System::Windows::Input::KeyEventArgs(...keyEvent)

    private: System::Void keyEvent(System::Object^  sender, KeyEventArgs^ e) {
                if(e->.. == Key::F4) {
                Console::WriteLine("F4 KeyDown");
                check = false;
                }
    }
    


  • Hi

    Ich hab derzeit mal folgendes:

    // testen2.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Windows::Input;
    
    void keyEvent(System::Object^  sender, KeyEventArgs^ e) { 
    	if(e->Key == Key::F4) { 
            Console::WriteLine("F4 KeyDown"); 
    	} 
    }
    
    [STAThread]
    int main(array<System::String ^> ^args)
    {
    
    	gcnew System::Windows::Input::KeyEventArgs(KeyboardDevice::KeyboardDevice(InputManager::PrimaryKeyboardDevice),
    												System::Windows::PresentationSource::CurrentSources,
    												123,
    												Key::F4);
    
    	bool check = true;
    
    	while(check) {
    
    		//Check after Down Status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    
    		//Check after Pressed(toogled) status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    
    		Console::WriteLine(Keyboard::GetKeyStates(Key::Return));
    	}
    
    }
    

    Das Problem ist hier bei der delegate erstellung:

    gcnew System::Windows::Input::KeyEventArgs(KeyboardDevice::KeyboardDevice(InputManager::PrimaryKeyboardDevice),
    												System::Windows::PresentationSource::CurrentSources,
    												123,
    												Key::F4);
    

    Ich hab mir im MSDN die sachen durchgelesen aber ich werde nicht schlau draus, was soll ich da eintragen 😕

    Wenn ich die geforderten Args richtig verstehe dann muss man da sein keyboard (das was überwacht wird eintragen) aber ich glaub ich versteh das nciht richtig.

    Ich glaub ich sollte lieber noch ein paar tutorials machen *g*

    gn8 & lg seek



  • Ich glaube das liegt daran, dass das du eine Konsolenanwendung hast in der du WPF aufrufst. Da ist das Problem.

    Außerdem:

    MSDN schrieb:

    Das KeyboardDevice unterstützt die Windows Presentation Foundation (WPF)-Infrastruktur und ist nicht für die direkte Verwendung im Code bestimmt.

    Oder:

    InputManager::Current::PrimaryKeyboardDevice
    


  • seek1338 schrieb:

    Hi

    Ich hab derzeit mal folgendes:

    // testen2.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Windows::Input;
    
    void keyEvent(System::Object^  sender, KeyEventArgs^ e) { 
    	if(e->Key == Key::F4) { 
            Console::WriteLine("F4 KeyDown"); 
    	} 
    }
    
    [STAThread]
    int main(array<System::String ^> ^args)
    {
    
    	gcnew System::Windows::Input::KeyEventArgs(KeyboardDevice::KeyboardDevice(InputManager::PrimaryKeyboardDevice),
    												System::Windows::PresentationSource::CurrentSources,
    												123,
    												Key::F4);
    
    	bool check = true;
    
    	while(check) {
    		
    		//Check after Down Status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    		
    		//Check after Pressed(toogled) status
    		if(Keyboard::IsKeyDown(Key::F4)) {
    			Console::WriteLine("F4 KeyDown");
    			check = false;
    		}
    
    		Console::WriteLine(Keyboard::GetKeyStates(Key::Return));
    	}
    
    	
    
    }
    

    Das Problem ist hier bei der delegate erstellung:

    gcnew System::Windows::Input::KeyEventArgs(KeyboardDevice::KeyboardDevice(InputManager::PrimaryKeyboardDevice),
    												System::Windows::PresentationSource::CurrentSources,
    												123,
    												Key::F4);
    

    Ich hab mir im MSDN die sachen durchgelesen aber ich werde nicht schlau draus, was soll ich da eintragen 😕

    Wenn ich die geforderten Args richtig verstehe dann muss man da sein keyboard (das was überwacht wird eintragen) aber ich glaub ich versteh das nciht richtig.

    Ich glaub ich sollte lieber noch ein paar tutorials machen *g*

    gn8 & lg seek

    ehm seek1338, das while unten brauchst du dann nicht mehr und es ist eh unssinig weil damit Keydings nicht gesagt wird, dass auf einen Tastenschlag gewartet werden soll. zu gcnew da kommt noch was davor, guck dir mal bitte in CLI ein Event im Code an wenn du das Event FormLoad über den Designer erstellt hast und suche im inialisierungscode den bereich Form(Name), da findest du sowas wie this->Load += gcnew ...



  • Ich hab mittlerweile alles mögliche ausprobiert aber ohne Erfolg, dafür bin ich noch zu schlecht.

    @Rhombicosidodecahedron: ich kanns auch nicht in der Form verwenden, da ich nicht weis wie man ein delegate/event einrichten kann.

    @LiGERWooD: Du hast recht in der Form werden die Objekte instanziert zBsp:

    Private: System::Windows::Form::ListView^ meinlistView;
    

    Bei den components werden die Events mit den Methoden verknüpft:

    this->listView1->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::listView1_KeyDown);
    

    Das Problem ist KeyDown ist ein Event von ListView, aber das Input Namespace hat viele Klassen KeyEventHandler, Keyboardhandler etz. etz... Ich hab da kein plan was man verwenden muss oder kann und weiters find ich in den Klassen auch keine Events (im Visual Studio das Blitz Icon) die man über gcnew verknüpfen könnte.

    Nach mehreren Tagen vergebliches versuchen habe ich mir überlegt das Programm im Tray laufen zu lassen dann braucht man auch kein Hockey für Sichtbar und Unsichtbar 🙂

    Schade finde ich es nur das in diesem Forum kein C++ .net profi unterwegs ist, der einfache hätte sagen können: ne geht nicht benutz hooks, GetAsyncKeyState.... oder hier 2 Zeilen Code so kann man das Event einrichten.

    Die MSDN könnte Microsoft auch mal um ein paar c++ / clr Beispiele erweitern immer nur c#, des nervt auch 😃

    also danke für eure antworten.... Gute Nacht!

    lg seek


Anmelden zum Antworten