Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глобальные горячие клавиши, реагировать на ГК все проги 
:(
    Опции темы
AGENTxXx
  Дата 2.2.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Добрый день! Задача: создать глобальные горячие клавиши для моей программы, т.е. чтобы работая в другой проге и нажимая сочитание клавишь, моя прога отвечала на это (если конечно они зарезервированы). Я думаю что все это реализуется с помщью хуков (хотя очень надеюсь что это гораздо проще). Хотел бы чтобы подсказали оптимальный алгоритм по решению этой задачи. Сам это реализовать могу, но не считаю свой алгоритм минимальным (к процессору будет обращение частое). Кто ни будь может подсказать как это сделать оптимально?
PM MAIL   Вверх
AGENTxXx
Дата 2.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Для тех, кому это интересно:
Код

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace GlobalHotKeysExperiments
{
    
    public partial class Form1 : Form
    {

        public const int MOD_ALT = 0x1;
        public const int MOD_CONTROL = 0x2;
        public const int MOD_SHIFT = 0x4;
        public const int MOD_WIN = 0x8;
        
        [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);

        [DllImport("kernel32.dll")]
        public static extern Int16 GlobalAddAtom(string name);

        [DllImport("kernel32.dll")]
        public static extern Int16 GlobalDeleteAtom(Int16 nAtom);

        Int16 atom = GlobalAddAtom("PFight");

        public Form1()
        {
            bool state = RegisterHotKey(this.Handle, atom, MOD_SHIFT|MOD_ALT, (uint)Keys.R);
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

        }

        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            UnregisterHotKey(this.Handle, atom);
            GlobalDeleteAtom(atom);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0312 && m.WParam.ToString() == atom.ToString())
            {
                MessageBox.Show("Yahooo!");
            }
            base.WndProc(ref m);
        }
    }
}

PM MAIL   Вверх
WolfTheGrey
Дата 4.2.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: нет
Всего: 2



А эти горячие клавищи возможно реализовать в среде WPF не прибегая к интеграции с WinForms ????
PM MAIL   Вверх
AGENTxXx
Дата 4.2.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Знаю что можно их использовать и в консольных приложениях. С WPF как то не сталкивался. Да и не знаю для чего это, но думаю наверное что то с глобальными сетями связанно
PM MAIL   Вверх
AGENTxXx
Дата 7.2.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Ребят, может кто то сталкивался с такой проблемой: реализовал и глобальные клавиши (как видите выше код). Загвоздка в том, чтобы теперь пользователь непосредственно смог реализовать и назначить их на свой вкус. т.е. есть у меня контрол специальный, нажимаешь там нужные клавиши и он выдает например такую строку: Control, Shift + W. а код установки:
Код

public const int MOD_ALT = 0x1;
        public const int MOD_CONTROL = 0x2;
        public const int MOD_SHIFT = 0x4;
        public const int MOD_WIN = 0x8;
        
        [DllImport("User32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

Проблема в обращении к функции RegisterHotKey. Например, я преобразовал Control, Shift + W, в "MOD_CONTROL | MOD_SHIFT", т.е как бы все выглядит нормально:
Код

 bool state = RegisterHotKey(this.Handle, atom, "MOD_ALT | MOD_SHIFT", (uint)Keys.W);

Но как видите это строка в итоге, а он конечно же будет ругаться. Преобразование в uint тоже ни чего хорошего не дает - ругается (прога просто при запуске выдает сразу же ошибку, а компилятор говорит все ОК)
Так вот, вопрос: можно ли как то реализовать это меньшими силами (не писать полностью функцию обработки всяких событий - сейчас пример пирведу):
Код

public void hotkey()
        {
            str = hkControl1.Text;
            strarray = str.Split(new char(), ',');
            r = strarray.Length;
            if (r==1)
            {
                strarray = null;
                strarray = str.Split(new char(), ' ');
                switch (strarray[0])
                {
                    case "Shift":
                        m[0] = 0x4;
                        break;
                    case "Control":
                        m[0] = 0x2;
                        break;
                    case "Alt":
                        m[0] = 0x1;
                        break;
                }
            }

а использовать какие ни будь встроенные возможности. Например, в php и ActionScript 2.0 (кто не слышал этого - язык Flash) есть функция eval() которая дает это сделать. Есть ли в C# что либо подобное?
PM MAIL   Вверх
Ceiceron
Дата 7.2.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



Если контрол регистрации дает только текстовое представление, то парсить придется в любом случае.
Константы мдификаторов клавиш я б преобразовал в перечисление, тогда в конечную функцию и будет передавать проще.
Цитата
т.е. есть у меня контрол специальный, нажимаешь там нужные клавиши и он выдает например такую строку: Control, Shift + W

контрол самодельный? если да, то его можно допилить, что бы он возвращал элементы перечисления, о котором я уже сказал, тогда парсить не придется ни чего.
PM MAIL   Вверх
AGENTxXx
Дата 7.2.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Контрол самодельный но не мной... он в библиотеке лежит. Так что что и как там - не знаю. А в ildasm.exe еще не умею работать, чтобы вытащить эту инфу. Фленову еще по этому поводу написал. Может он че путное скажет
PM MAIL   Вверх
nmn
Дата 7.2.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



Цитата(AGENTxXx @ 7.2.2010,  19:50)
А в ildasm.exe еще не умею работать, чтобы вытащить эту инфу.

RedGate Reflector

Это сообщение отредактировал(а) nmn - 7.2.2010, 20:11
PM Skype   Вверх
AGENTxXx
Дата 7.2.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 8.6.2009

Репутация: нет
Всего: 1



Спасибо! буду разбираться)))
PM MAIL   Вверх
CasperSC
Дата 9.9.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Ну и как, решил проблему? Мне тоже нужно с горячими клавишами разобраться. Код есть, но в WPF (незнаю с этим ли связанно) он вызывает жуткие лаги при срабатывании кода запукаемого горячей клавишей.
PM MAIL   Вверх
6atoh
Дата 9.9.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 15.9.2006
Где: Minsk

Репутация: 2
Всего: 4



Цитата(AGENTxXx @  7.2.2010,  15:38 Найти цитируемый пост)
а использовать какие ни будь встроенные возможности. Например, в php и ActionScript 2.0 (кто не слышал этого - язык Flash) есть функция eval() которая дает это сделать. Есть ли в C# что либо подобное? 


Создайте перечисление, которое будет содержать все возможные строковые значения, которые возвращает элемент управления:
Код

public enum ModKeys
{
    Alt = 0x1,
    Control = 0x2,
    Shift = 0x4,
    Win = 0x8
}


Теперь вы можете можете получить значение элемента перечисления (int) по его названию:
Код

m[0] = (int)Enum.Parse(typeof(ModKeys), strarray[0]);

PM MAIL ICQ   Вверх
starostin
Дата 27.12.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.9.2009
Где: Ярославль

Репутация: нет
Всего: 1



Объясните мне тупом, что за Dispose в дизайнере форма1.цс? Что она делать должна и почему компилятор говорит что для неё нет соответствующего переопределения?
PM MAIL ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.