Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2013, 01:45   #1
Snake22
Пользователь
 
Регистрация: 06.01.2011
Сообщений: 22
По умолчанию установить более одного глобального хоткея

нашел в инете приемер как регистрировать в системе глобальные хоткеи
Код:
[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 );
    }
во первых я не понял что такое 42, откуда оно взялось, решил что это рандомное число, некий уникальный id сообщения которое будет возникать при нажатии хоткея, но не уверен.

пишу значит у себя такой код:
Код:
using System.Diagnostics;
...
[DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


private void button2_Click(object sender, EventArgs e)
        {
            const int WM_HOTKEY = 0x312;          
            
            const byte ModAlt = 1, ModControl = 2, ModShift = 4, ModWin = 8;
            
            byte Modifier = ModAlt;

            bool success = RegisterHotKey(this.Handle, 0x312, Modifier, (int)Keys.Z);
            bool success2 = RegisterHotKey(this.Handle, 0x314, Modifier, (int)Keys.X);

            if (success && success2) MessageBox.Show("reg ok");
            else
                MessageBox.Show("reg fail");

        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg )
            {
                case 0x312: MessageBox.Show("Z");
                            break;
                case 0x314: MessageBox.Show("X");
                            break;
            }       
           
            Debug.WriteLine(m.Msg);
            base.WndProc(ref m);
        }
регистрируются клавиши нормально без ошибки.
и при нажатии хоткея alt+Z событие происходит, но при нажатии alt+X происходит событие будто я нажал alt+z.
подскажите пожалуйста где я накосячил??

Последний раз редактировалось Snake22; 10.05.2013 в 01:48.
Snake22 вне форума Ответить с цитированием
Старый 10.05.2013, 01:51   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

http://msdn.microsoft.com/en-us/library/ms911003.aspx
eval вне форума Ответить с цитированием
Старый 10.05.2013, 01:57   #3
Snake22
Пользователь
 
Регистрация: 06.01.2011
Сообщений: 22
По умолчанию

ааа всё разобрался, в id мы передаём id клавиши

Код:
bool success = RegisterHotKey(this.Handle, 1, Modifier, (int)Keys.Z);
bool success2 = RegisterHotKey(this.Handle, 2, Modifier, (int)Keys.X);
а прослушиваем нажатия так:

if (m.Msg== 0x312)
                switch (m.WParam.ToInt32() )
            {
                //id = 1:
                case 1: MessageBox.Show("Z");
                            break;
                //id = 2:
                case 2: MessageBox.Show("X");
                            break;
            }
Snake22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Максимальное из чисел, встречающихся в заданной матрице более одного раза voodooism Общие вопросы C/C++ 15 23.01.2013 20:33
Добавить в Grid более одного элемента coNsept WPF, UWP, WinRT, XAML 2 20.01.2013 21:28
Запрет на загрузку более одного файла. MrJenika PHP 2 20.11.2010 21:37
Максимальное из чисел встречающих в заданной матрице более одного раза Seo-optimist Общие вопросы C/C++ 11 25.10.2010 21:44
поиск максимального элемента, который встречается более одного раза счастливая Помощь студентам 1 25.05.2010 16:41