C# привязка к клавишам

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by brasco2k, 4 Feb 2008.

Thread Status:
Not open for further replies.
  1. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    Здраствуйте у меня вопрос как можно привязать кнопку к комбинации клавиш. Например сохранить кнопка (ctrl+s)
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    API: user32.dll --> RegisterHotKey() ...

    Code:
     [DllImport("user32")] 
        public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
        [DllImport("user32.dll")]
        static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        private const int MOD_ALT = 0x1;
        private const int MOD_CONTROL = 0x2;
        private const int MOD_SHIFT = 0x4;
        private const int MOD_WIN = 0x8;
        private const int WM_HOTKEY = 0x312;
    
        public frmMain()
        {
            // Например хоткей WIN+T
            RegisterHotKey( this.Handle, 42, MOD_WIN, (int)Keys.T );
        }
    
        protected override void WndProc(ref Message m)
        {
            base.WndProc (ref m);
            if( m.Msg == WM_HOTKEY )
            {
                if( !this.Visible )
                    this.Visible = true;
                this.Activate();
            }
        }
    
        private void frmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            UnregisterHotKey( this.Handle, 42 );
        }
     
    3 people like this.
  3. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    А можно как нибудь попроще?
    A то сложно здесь както
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Code:
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
    if (e.Alt && e.KeyCode == Keys.Enter)
    {
    MessageBox.Show("WoW");
    }
    }
    так что-ли?

    тут один нюанс, код сработает при нажатии сочетания на активном окне...
     
    #4 W!z@rD, 5 Feb 2008
    Last edited: 5 Feb 2008
    1 person likes this.
  5. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    Не не пашет
     
  6. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    А можно ли по другому))?
     
  7. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    на api практичнее ...
     
    2 people like this.
  8. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    Ну мне расскажи как подключить все это дело
     
    #8 brasco2k, 9 Feb 2008
    Last edited: 10 Feb 2008
  9. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    Code:
    using System.Runtime.InteropServices;
    и собственно код , что выше ...
    После класса добавляешь библиотеки и констнаты

    Code:
      public partial class Form1 : Form
        {
            [DllImport("user32")]
            public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
            [DllImport("user32.dll")]
            static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
    
            private const int MOD_ALT = 0x1;
            private const int MOD_CONTROL = 0x2;
            private const int MOD_SHIFT = 0x4;
            private const int MOD_WIN = 0x8;
    
            private const int WM_HOTKEY = 0x312;

    RegisterHotKey(

    this.Handle, > хэндл нашего окна
    42, > магическое число ;) , идентифекатор хоткея , запомни его ...
    MOD_WIN, > значит первой клавишей хоткея будет Win - клавиша , соответственно смотри констаты сверху
    (int)Keys.T > значит что второй клавишей будет клавиша "T" , можешь поменять на любую , например (int)Keys.R
    )
    используем например:
    RegisterHotKey(this.Handle, 42, MOD_WIN, (int)Keys.A);
    RegisterHotKey(this.Handle, 43, MOD_SHIFT, (int)Keys.W);

    Code:
     protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_HOTKEY)
                {
     Здесь - код выполняемый для хоткея ,
    
    
    поскольку хоткеев может быть несколько, находим нужный по идентификатору ...
    
     switch (m.WParam.ToInt32())
                    {
                        case 42:
    
                            Код для первого хоткея
    
                            break;
    
                        case 43:
                            Код для другого хоткея с id 43
    
                            break;
                    }
    }
    
    

    и незабуть при закрытии убрать все хоткеи:
    UnregisterHotKey(this.Handle, 42);
    UnregisterHotKey(this.Handle, 43);
     
    2 people like this.
  10. brasco2k

    brasco2k Elder - Старейшина

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    БО000000000000льшое спасибо!!!
     
Thread Status:
Not open for further replies.