Announcement

Collapse
No announcement yet.

RegisterHotkey - CTRL + ALT + H - oder so -

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RegisterHotkey - CTRL + ALT + H - oder so -

    Hallo,

    (Kurzfassung bzw. grundlegende Frage in Fettdruck weiter unten)
    ich möchte gerne in meiner Anwendung ein HOTKEY registrieren und habe dafür via StackOverlflow schon ca. 4 verschiedene Beispiele ausprobiert.

    Randfrage: Die meisten Klassen, die ich von dort weghole, haben irgendwelche Fehler, wo ich nicht verstehe, wieso die dort gepostet werden unter LÖSUNG, als ob sie funkionieren müssten?!
    Ich benutze Visual Studio 2019 Community und frage mich dabei, ob diese Version vielleicht irgendwie abgespeckt ist, fehlen da vielleicht irgendwelche Funktionen in der Library?

    Also z.B.

    System.Windows.Input -> KeyGestureConverter
    Fehlt bei mir
    Laut MSDN soll diese besagte Klasse "KeyGestureConverter" in der System.Windows.Input enthalten sein, bei mir ist dies nicht der Fall.

    So kommt es, dass ein angeblich funktionieren sollendes Beispiel bei mir unter solchen Punkten rot unterstrichen ist und ich weiß nicht mehr, was ich noch machen soll, um ein solchen Code zum laufen zu bekommen.

    Das einzige funktionierende Beispiel, was ich gefunden habe, was bei mir funktioniert, registriert außgerechnet nur eine einzige HOTKEY-Taste, die [F9] und ich kann in diesem Beispiel nicht übertragen, wie das mit einer Tastenkombination STRG+ALT+H funktionieren würde.

    Mir fehlt dafür irgendwie das Verständnis, wie ich aus diesem STRG+ALT+H einen IntegerWert bekomme...
    Das ENUM (None = 0, Alt = 1, Control = 2, Shift = 4, WinKey = 8) dazu ist mir zwar bekannt, aber ich kann es leider nicht übertragen, weil ich ich keine passenden Beispiele finde, auf die ich das rückschließen kann, die auch bei mir im Studio funktionieren.
    Es gibt dazu auch noch eine solche Formulierung:

    0101 (Binary) bzw. 0x0101, aber wo ist dann da die H Taste?!

    Es gibt andere Varianten als diese (siehe unten), wo man mit Übergeben von den zusätzlich gedrückten Tasten registrieren kann:

    PHP Code:
    hook.RegisterHotKey(ModifierKeys.Control ModifierKeys.AltKeys.H); 
    wobei hook eine mitgelieferte Klasse ist, die ich dafür auch eingebunden hatte.

    Er kennt aber diese "ModifierKeys" so nicht, bzw. erwartet eine Umwandlung von mir, die ich nicht verstehe. (Stichwort Casting), darum hab ich dieses Beispiel erstmal wieder verworfen, weil ich den Code garnicht kompiliert bekomme.



    Hier mal die komplette Klasse der Form1, die ausschließlich eine F9-Taste anhand eines Integers registriert (siehe unten)
    Das funktioniert bei mir - zum nachstellen muss man das Event Form1_Load noch im XML der FORM1 eintragen, sonst wird das nicht eingebunden...

    Anhand dieser Information : None = 0, Alt = 1, Control = 2, Shift = 4, WinKey = 8
    muss nun dieser Integerwert weiter unten angepasst werden, aber ich weiß einfach nicht wie. :-(

    Festgelegt wird die F9 - Taste an dieser Stelle:

    int HotKeyCode = (int)(Keys.F9);

    Kann jemand dieses Beispiel für folgende Tastenkombinationen umformulieren?
    STRG + ALT + H
    (oder)
    STRG + H
    (oder)
    ALT + H

    Ich bräuchte einfach ein paar Beispiele, um das zu verstehen.



    Hier das dazu von allen anderen Klassen unabhängige funktionierende Script zur Registrierung der Taste [F9]


    PHP Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace 
    CBW
    {   
        public 
    partial class Form1 Form
        
    {
            [
    DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWndint idint fsModifiersint vlc);
            [
    DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWndint id);

            
    int UniqueHotkeyId 1;
            
    //int HotKeyCode = (int)Keys.Control + (int)Keys.Alt + (int)Keys.H;
            //int HotKeyCode = (int)Keys.F9;

            
    int HotKeyCode = (int)(Keys.F9);
            
    // None = 0, Alt = 1,  Control = 2, Shift = 4, WinKey = 8

            
    static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
            static 
    readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
            static 
    readonly IntPtr HWND_TOP = new IntPtr(0);
            static 
    readonly IntPtr HWND_BOTTOM = new IntPtr(1);
            const 
    UInt32 SWP_NOSIZE 0x0001;
            const 
    UInt32 SWP_NOMOVE 0x0002;
            const 
    UInt32 TOPMOST_FLAGS SWP_NOMOVE SWP_NOSIZE;

            public 
    Form1()
            {
                
    Console.WriteLine("Gestartet!");
                
    InitializeComponent();      
            }
            protected 
    override void WndProc(ref Message m)
            {
                if (
    m.Msg == 0x0312)
                {
                    
    int id m.WParam.ToInt32();
                    
    MessageBox.Show(string.Format("Hotkey #{0} pressed"id));

                    if (
    id == 1)
                    {
                        
    // This will never happen because we have registered the hotkey !
                        
    MessageBox.Show("F9 Was pressed !");
                    }
                }
                
    base.WndProc(ref m);
            }

            private 
    void Form1_Load(object senderEventArgs e)
            {
                
    Boolean F9Registered RegisterHotKey(
                    
    this.HandleUniqueHotkeyId0x0000HotKeyCode
                
    );

                if (
    F9Registered)
                {
                    
    Console.WriteLine("Global Hotkey F9 was succesfully registered");
                }
                else
                {
                    
    Console.WriteLine("Global Hotkey F9 couldn't be registered !");
                }
            }

            private 
    void Form1_FormClosing(object senderFormClosingEventArgs e)
            {
                
    Boolean F9UnRegistered UnregisterHotKey(this.HandleUniqueHotkeyId);
                if (
    F9UnRegistered)
                {
                    
    Console.WriteLine("Global Hotkey F9 was succesfully UNregistered");
                }
                else
                {
                    
    Console.WriteLine("Global Hotkey F9 couldn't be UNregistered !");
                }
            }
        }


  • #2

    https://docs.microsoft.com/en-us/win...registerhotkey

    RegisterHotKey(this.Handle, UniqueHotkeyId, MOD_ALT|MOD_CONTROL, Keys.F9)


    Christian

    Comment


    • #3
      Bezüglich deiner Frage zu Stackoverflow. Nirgendwo wird da von etwas wie "Lösung" geschrieben. Da gibt es "Antworten" und vom Fragesteller akzeptierte "Antworten". Das als Lösung zu bezeichnen ist zumindest gewagt.
      Letztlich kommt es immer auf an Context in dem die Antwort funktioniert. Meist ist es auch nur ein Beispiel und keine Copy&Paste Lösung. Was du da mitnehmen solltest ist das du Codebeispiele nur benutzt die du auch verstehst ansonsten benutzt du nur Code dessen Rahmenbedingungen du nicht verstehst und nicht mal weiß wann er aufhört zu funktionieren.

      Was aufgrund des Contextes in den verschiedenen "Lösungen" die du möglicherweise gesehen hast schiefgehen kann wäre zum Beispiel anderem OS, anderer Bittigkeit etc. Davon unabhängig könnte es eine ungültige Key Kombination sein die nicht erlaubt ist (hab die natürlich nicht alle im Kopf). Zum Beispiel STRG- ALT-ENTF darf man aber sich nicht einfach "weg-hotkeyen". Oder die Antwort enthält bestimmte Details einfach nicht weil man nach Einschätzungen des eigentlichen Fragestellers bestimmte Details weggelassen hast die dem Fragesteller wohl bewusst sein werden.

      Zur KeyGestureConverter Klasse. Die MSDN ist mittlerweile oft recht dünn da steht aber zumindest immer dran in welchem Framework es das gibt und funktioniert. Welches Visual Studio du benutzt ist da eher irrelevant du musst wissen gegen welches Framework du programmierst. Es gibt da reichlich Varianten. Es ist nicht einfach das .Net Framework. Solltest du zum Beispiel gegen Net. Core oder gegen Net 5 programmieren wirst du auch oft dazu genötigt werden bestimmte Nuget Packages nachzuinstallieren. Die aktuelleren Frameworks sind da wesentlich modularer und da ist nicht einfach so alles drin.
      Insbesondere Betriebsystemspezifika wirst du eher gar nicht finden oder nachinstallieren müssen. Neuere Frameworks sind systemunabhängig und HotKeys werden woanders anders funktionieren oder existieren da nicht.

      Zu den Enum Werten. Das ver-oder-n per | (Pipe) ist da der richtige Weg. Du musst halt nur die richtigen Enum erwischen. Je nach API sind das halt unterschiedliche. Bei einigen gibt es von Keys unabhängige ModifierKeys bei anderen nicht. Da muss man wieder auf den Context aufpassen.
      Hier geht es explizit darum Tasten zu referenzieren und nicht Zeichen. Darum wird nur Keys benutzt damit man linke Strg von rechter Strg oder die Zahlentasten auf dem Nummernblock von den Standard OEM Tasten unterscheiden kann. Oder auch einfach auch nur die F-Tasten nutzen kann.
      Das funktioniert bei ModifierKey + Char eher nicht gut.

      Du solltest also für alle Tasten die du benutzen willst die aus der Keys Enumeration nehmen und wenn du mehrere brauchst die mit der | ver-oder-n. Und dich nebenbei Fragen ob das etwas ist das schon von irgendwas belegt ist.

      Comment


      • #4
        Vielen Dank euch beiden für die Tipps und Aufklärung. Hab jetzt eine funktionierende Variante dessen.

        Comment

        Working...
        X