Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] Установка глобального HotKey

Ответить
Настройки темы
.NET - [решено] Установка глобального HotKey

Старожил


Сообщения: 258
Благодарности: 14


Конфигурация

Профиль | Отправить PM | Цитировать


Привет всем. Нужно: установить сочетания клавиш глобальное. Делаю так:

Код: Выделить весь код
       [DllImport("user32.dll")]  
        public static extern bool RegisterHotKey(IntPtr hWND, int id, uint fsModifiers, uint vk); 
        [DllImport("user32.dll")] 
        public 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 Form() 
       { 
             RegisterHotKey(this.Handle, 42, MOD_WIN, (int)Keys.Escape); 
       } 
 
        protected override void WndProc(ref Message m) 
        { 
            base.WndProc(ref m); 
            if (m.Msg == WM_HOTKEY) 
            { 
                switch (m.WParam.ToInt32()) 
                { 
                    case 42: 
                        if (this.Visible == false) 
                        { 
                            this.Show(); 
                            this.Tray.Visible = false; 
                            this.ShowInTaskbar = true; 
                        } 
                        break; 
                } 
            }             
        }

Но ничего не происходит когда я нажимаю комбинацию клавишь. Ставлю точку останова на строке if (m.Msg == WM_HOTKEY) но программа туда даже не заходит. Что я сделал не так?

Отправлено: 06:35, 03-02-2011

 

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Глобальная клавиша для чего нужна, для того, чтобы на форме в любом месте нажать, например, F3 и открылось какое то меню или действие? Если да, то все гораздо проще:
1. Выставляем у формы свойство KeyPreview=true;
2. Вставляем обработчик на KeyDown:

Код: Выделить весь код
 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
           if (e.KeyCode == Keys.F1)
            {
             //тут код после нажатия нужной клавиши
            }
}

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 08:24, 03-02-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 258
Благодарности: 14

Профиль | Отправить PM | Цитировать


Нет без привязки к форме. Все нужно чтобы вызывать свернутое окно.

Отправлено: 08:39, 03-02-2011 | #3


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


ну хотя бы на base.WndProc(ref m); он доходит? Или просто не заходит в функцию?

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 08:48, 03-02-2011 | #4


Старожил


Сообщения: 258
Благодарности: 14

Профиль | Отправить PM | Цитировать


Да доходит не срабатывает именно условие как будто клавишу и не нажимали вовсе.
Код: Выделить весь код
 if (m.Msg == WM_HOTKEY)
вот это место "пролетает".

Отправлено: 08:57, 03-02-2011 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


giv5dot26 приведённый код неполон. Но должен работать.
Первоначально хотел предложить вызов RegisterHotKey перенести из конструктора формы (подозрение на не валидный this.Handle) куда-нибудь в OnLoad (событие наступает сразу после первого отображения формы). Но нет, работать будет и там (this.Handle валидный в обоих случаях).
читать дальше »
Код: Выделить весь код
using System;
using System.Drawing;
using System.Windows.Forms;

using System.Runtime.InteropServices;   //for DllImport

class Form1 : Form
{
    [DllImport("user32.dll")]
    public static extern bool RegisterHotKey(IntPtr hWND, int id, uint fsModifiers, uint vk);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWND, int iD); 
    private const int MOD_WIN = 0x8;
    private const int WM_HOTKEY = 0x312;

    public static void Main()
    {
        Application.Run(new Form1());
    }
    public Form1() 
    {
       RegisterHotKey(this.Handle, 42, MOD_WIN, (int)Keys.Escape);
    }
    protected override void OnLoad(EventArgs ea)
    {
       base.OnLoad(ea);
       //RegisterHotKey(this.Handle, 42, MOD_WIN, (int)Keys.Escape);
    }
    protected override void WndProc(ref Message msg)
    {
        base.WndProc(ref msg);
        if (msg.Msg == WM_HOTKEY)
        {
            switch (msg.WParam.ToInt32())
            {
                case 42:
                    MessageBox.Show("Hello there");
                break;
                default:
                    MessageBox.Show("Hello stranger");
                break;
            }
        }       
    }
    protected override void OnClosing(System.ComponentModel.CancelEventArgs cea)
    {
        base.OnClosing(cea);
        UnregisterHotKey(this.Handle, 42);
    }
}
Есть реакция на сочетание Win+Esc.
В примере название экземпляра класса Form1, а не Form (что бы не было путаницы с именем класса).

Отправлено: 02:22, 04-02-2011 | #6


Старожил


Сообщения: 258
Благодарности: 14

Профиль | Отправить PM | Цитировать


В общем приведенный Вами код работает, но вот стоит форму свернуть в трей как реакция на нажатие прекращается и вот это уже не проходит
Код: Выделить весь код
 if (msg.Msg == WM_HOTKEY)
        {
            switch (msg.WParam.ToInt32())
            {
                case 42:
                    MessageBox.Show("Hello there");
                break;
                default:
                    MessageBox.Show("Hello stranger");
                break;
            }
        }
Почему как считаете?

Отправлено: 05:28, 04-02-2011 | #7


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


giv5dot26, в предыдущем посте пропустил слово - приведённый выше код неполон. Иными словами, в первом посте приводится вполне рабочий код (на его основе полный вариант под споллером в 6 посте), однако не уточнен способ сворачивания в трей.
Что касается трея, то как-то не доводилось его программировать, но есть предположение создать две формы, первая (невидимая) пускай принимает сообщения, вторая получает их от первой, будучи свёрнута в трей.

Здесь WndProc doesn't receive hotkey message when minimized человек пришёл к выводу, что виной всему this.ShowInTaskbar = false; после которого описатель приложения становится не валидным.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:48, 05-02-2011 | #8


Старожил


Сообщения: 258
Благодарности: 14

Профиль | Отправить PM | Цитировать


Да так и есть. Если не использовать
Код: Выделить весь код
this.ShowInTaskbar = false
то все работает как надо. Все нормально.

Отправлено: 07:33, 11-02-2011 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] Установка глобального HotKey

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Проблема с открытием глобального каталога IgorFromLipetsk Microsoft Windows NT/2000/2003 3 08-11-2010 11:30
помогите найти hotkey mosya Поиск драйверов, прошивок и руководств 4 06-07-2010 00:40
Microsoft не боится глобального экономического кризиса OSZone News Новости и события Microsoft 4 26-11-2008 14:54
Утилиты - [addon] Alt+Q HotKey Tool Wills Наборы обновлений для Windows XP/2003/Windows 7 8 25-05-2008 23:57
Моя маленькая проблема с видео Глобального характера)) Flashdance Видеокарты 13 19-08-2006 20:23




 
Переход