Autor Beitrag
Baenky
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 14.07.08 13:30 
Hallo zusammen,

ich möchte mein Formular, das im System-Tray liegt, gerne auf Doppel-Druck von Alt GR oder einer anderen Taste anzeigen lassen.

Mit generellen Tastenkombinationen wie z.B. Strg + Shift + A ist es kein Problem - das klappt... aber ich hätte das gerne auch bei doppeltem Drücken einer Taste, damit man nicht mehrere Tasten nacheinander - womöglich noch mit zwei Händen - drücken muss...

Ist das überhaupt möglich?

Würde mich freuen, wenn jmd. hierzu eine Idee hat;-)

Gruß

Nadine
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mo 14.07.08 13:55 
Naja da du ja das abfragen von gedrückten Tasten schon hast musst du ja nur noch das doppelt drücken umsetzen, z.B. indem du immer wenn die Taste gedrückt wird Zählvariable erhöst und von einem Timer nach einem bestimmten Intervall wieder auf 0 setzten lässt. (Wenn die Taste zum zweiten mal gedrückt wird bevor das Intervall abgelaufen ist erkennst du das an deiner Zählvariablen.)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 14.07.08 13:58 
Ich würde beim Tastendruck einfach DateTime.Now in einem Feld speichern und damit überprüfen, wie viel Zeit seit dem letzten Aufruf vergangen ist.
Baenky Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 14.07.08 14:00 
Hallo,

vielen Dank für die Anregungen.

Werde ich mal ausprobieren!

Gruß

Nadine
Baenky Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 16.07.08 12:53 
Ich habe nun leider folgende zusätzliche Problematik:

Da meine Form-Anwendung im SysTray liegt, kann ich keine normalen KeyEvents verwenden - diese werden nicht registriert, da das Form nicht aktiv ist.

Wie bereits erwähnt, hatte ich hierfür eine Lösung.

Uns zwar habe ich eine Funktion register Hotkey verwendet:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 /* Deklaration der RegisterHotKey-Funktion */
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers,
        uint vk);
 ...
// Hotkey SHIFT + STRG + A zuweisen. Als Id (die für alle in diesem
            // Thread zugewiesenen Hotkeys eindeutig sein muss) wird das Fenster-
            // Handle selbst übergeben

            if (RegisterHotKey(this.Handle, HOTKEY_ID, (uint)(Modifiers.Shift | Modifiers.Control), (uint)Keys.A) == false)


Funktioniert prinzipiell gut. Leider unterstützt die Funktion aber nur min. 2 Tasten für eine Kombination, nicht weniger - was ich brauche, wäre aber eine Reaktion auf eine Taste!

Sehe ich das so richtig?

Falls ja, wie reagiere ich in einer SysTray-Anwendung auf eine Taste? Evtl. ist es ja auch viel einfacher, als ich denke?

Gruß

Nadine
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mi 16.07.08 13:33 
Dein RegisterHotkey funktioniert über die WinAPI und darüber müsste es auch eine KeyDown oder KeyPress Variante geben, musst im Internet mal ein bischen suchen. (Stichwörter z.B. WinAPI+KeyPress)
Baenky Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 16.07.08 14:01 
Ok... dann suche ich mal.

Wäre ja super, wenn es da was gibt!

Gruß

Nadine
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 16.07.08 18:28 
Mit einem Hotkey kommst du hier nicht weiter, das nächstmächtigere Werkzeug wäre ein Journal Hook, mit dem du jeden Tastendruck im gesamten System abfangen kannst.
Baenky Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 17.07.08 14:19 
Hallo,

also etwas vergleichbares wie KeyPress scheint es in der win32Api nicht zu geben. Ihc kann höchstens einen Key-Status abfragen, was mir aber für meine Tray-Applikation nichts bringt.

Auf Hooks bin ich jetzt schon mehrmals gestoßen... damit muss ich mich aber erstmal auseinander setzen - da gibt es einiges zu beachten.

Würde es mir etwas bringen, wenn ich einen Dienst schreibe, der dann auf Tastendruck mein Form aufruft und es auf Esc wieder ausblendet?

Könnte ich den Tastendruck in einem Dienst irgendwie besser/einfacher abfangen und müsste so keine Tray-App verwenden?

Gruß

Nadine
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 17.07.08 14:40 
www.codeproject.com/KB/cs/globalhook.aspx
müsste dir weiterhelfen (global Hooks)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 17.07.08 14:46 
Mit dem richtigen Wrapper ist ein Keyboard Hook nicht schwieriger als ein Hotkey :nixweiss: .

[edit]Gnaaa...:mrgreen:[/edit]
Baenky Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 17.07.08 15:09 
Vielen Dank für die Links/den Link (war der selbe)!

Werde ich mir zu Gemüte ziehen...

Ich denke, ich stelle mir das ganze einfach mal wieder viel zu kompliziert vor und habe mich einfach mit Hooks noch nie auseinandergesetzt bisher - also, wenn das so einfach wie das Arbeiten mit Hotkeys ist, sollte ich das wohl irgenwie hingebkommen :wink:

Gruß

Nadine