[C#]как вызвать программу с клавиатуры?
От: sgb Россия  
Дата: 02.05.07 18:52
Оценка:
Всем привет!
Вот собственно вопрос: как создать hotkey для проги? чтобы по нажатию вызывать...(в Win)
Если тема всплывала, извиняюсь,
где поискать код мона?

05.05.07 23:51: Перенесено модератором из '.NET' — AndrewVK
Re: [C#]как вызвать программу с клавиатуры?
От: MAPCUAHUH  
Дата: 02.05.07 19:03
Оценка:
Здравствуйте, sgb, Вы писали:

sgb>Всем привет!

sgb>Вот собственно вопрос: как создать hotkey для проги? чтобы по нажатию вызывать...(в Win)
sgb>Если тема всплывала, извиняюсь,
sgb>где поискать код мона?

RightClick->properties?( по ярлыку)
Re[2]: [C#]как вызвать программу с клавиатуры?
От: sgb Россия  
Дата: 02.05.07 20:55
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>RightClick->properties?( по ярлыку)


а по подробней?
Re[3]: [C#]как вызвать программу с клавиатуры?
От: Аноним  
Дата: 02.05.07 21:29
Оценка:
Здравствуйте, sgb, Вы писали:

sgb>Здравствуйте, MAPCUAHUH, Вы писали:


MAP>>RightClick->properties?( по ярлыку)


sgb> а по подробней?


Горячая клавиша — это свойство ярлыка виндовс. НИКАК не относящееся к тому на чем писали программу. Ярлык (это такая штучка, они зранятся с меню пуск и на рабочем столе и еще много где)... кликни правой кнопочкой на ЛЮБОМ стандартном элементе меню пуск... Там найди "Быстрый вызов", там стоя на нем нажми Ctrl+Shift+p и увидишь как именно это сочетание назначится как хоткей... Ну а если ты еще догадаешся поменять сочетание — то придет тебе счастье.

PS: Сори что так злобно...
Re[4]: [C#]как вызвать программу с клавиатуры?
От: Аноним  
Дата: 03.05.07 05:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sgb, Вы писали:


sgb>>Здравствуйте, MAPCUAHUH, Вы писали:


MAP>>>RightClick->properties?( по ярлыку)


sgb>> а по подробней?


А>Горячая клавиша — это свойство ярлыка виндовс. НИКАК не относящееся к тому на чем писали программу. Ярлык (это такая штучка, они зранятся с меню пуск и на рабочем столе и еще много где)... кликни правой кнопочкой на ЛЮБОМ стандартном элементе меню пуск... Там найди "Быстрый вызов", там стоя на нем нажми Ctrl+Shift+p и увидишь как именно это сочетание назначится как хоткей... Ну а если ты еще догадаешся поменять сочетание — то придет тебе счастье.


А>PS: Сори что так злобно...


Уточнение.
Такой метод работает только если ярлык находиться на десктопе. Да и ещё там нету сочетания с Win.
Re[5]: [C#]как вызвать программу с клавиатуры?
От: Andrbig  
Дата: 03.05.07 05:10
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Уточнение.

А>Такой метод работает только если ярлык находиться на десктопе.
Враки. У меня работает из Start-меню.

А>Да и ещё там нету сочетания с Win.


Да и не надо.
Re[4]: [C#]как вызвать программу с клавиатуры?
От: __max  
Дата: 03.05.07 08:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sgb, Вы писали:


sgb>>Здравствуйте, MAPCUAHUH, Вы писали:


MAP>>>RightClick->properties?( по ярлыку)


sgb>> а по подробней?


А>Горячая клавиша — это свойство ярлыка виндовс. НИКАК не относящееся к тому на чем писали программу. Ярлык (это такая штучка, они зранятся с меню пуск и на рабочем столе и еще много где)... кликни правой кнопочкой на ЛЮБОМ стандартном элементе меню пуск... Там найди "Быстрый вызов", там стоя на нем нажми Ctrl+Shift+p и увидишь как именно это сочетание назначится как хоткей... Ну а если ты еще догадаешся поменять сочетание — то придет тебе счастье.


А>PS: Сори что так злобно...



Ну и как ты запустишь прогу скажем по SHIFT+два_раза_клавиша_правый_плюс???
Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)
Re[5]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 03.05.07 10:49
Оценка:
Здравствуйте, __max, Вы писали:

__>Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)


не обязательно, достаточно LOW LEVEL KEYBOARD HOOK, без DLL — красиво и удобно
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[4]: [C#]как вызвать программу с клавиатуры?
От: sgb Россия  
Дата: 03.05.07 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sgb, Вы писали:


sgb>>Здравствуйте, MAPCUAHUH, Вы писали:


MAP>>>RightClick->properties?( по ярлыку)


sgb>> а по подробней?


А>Горячая клавиша — это свойство ярлыка виндовс. НИКАК не относящееся к тому на чем писали программу. Ярлык (это такая штучка, они зранятся с меню пуск и на рабочем столе и еще много где)... кликни правой кнопочкой на ЛЮБОМ стандартном элементе меню пуск... Там найди "Быстрый вызов", там стоя на нем нажми Ctrl+Shift+p и увидишь как именно это сочетание назначится как хоткей... Ну а если ты еще догадаешся поменять сочетание — то придет тебе счастье.


А>PS: Сори что так злобно...

да ничего — только с помощью ярлыка, это не программная реализация — это должен юзер делать, а не все знают...я же спрашиваю, как при установке или при запуске проги — зарегить в системе хоткей? без всяких ярлыков и пропертиз
Re[6]: [C#]как вызвать программу с клавиатуры?
От: sgb Россия  
Дата: 03.05.07 17:28
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, __max, Вы писали:


__>>Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)


_M_>не обязательно, достаточно LOW LEVEL KEYBOARD HOOK, без DLL — красиво и удобно


то есть это API надо трогать? я подумал — может в реестре мона чего-нибудь замутить: зарегить прогу и какой-нить для ключ с информацией о клавише
Re[6]: [C#]как вызвать программу с клавиатуры?
От: __max  
Дата: 04.05.07 08:30
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, __max, Вы писали:


__>>Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)


_M_>не обязательно, достаточно LOW LEVEL KEYBOARD HOOK, без DLL — красиво и удобно



The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.

API одинаковое, те же я#ц@ — вид сбоку!
Но я бы предпочел DLL...
Re[7]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 04.05.07 09:39
Оценка:
Здравствуйте, __max, Вы писали:

__>>>Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)


_M_>>не обязательно, достаточно LOW LEVEL KEYBOARD HOOK, без DLL — красиво и удобно



__>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>API одинаковое, те же я#ц@ — вид сбоку!

__>Но я бы предпочел DLL...

для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 04.05.07 09:41
Оценка:
Здравствуйте, sgb, Вы писали:

MAP>>>>RightClick->properties?( по ярлыку)


sgb>>> а по подробней?


А>>Горячая клавиша — это свойство ярлыка виндовс. НИКАК не относящееся к тому на чем писали программу. Ярлык (это такая штучка, они зранятся с меню пуск и на рабочем столе и еще много где)... кликни правой кнопочкой на ЛЮБОМ стандартном элементе меню пуск... Там найди "Быстрый вызов", там стоя на нем нажми Ctrl+Shift+p и увидишь как именно это сочетание назначится как хоткей... Ну а если ты еще догадаешся поменять сочетание — то придет тебе счастье.


А>>PS: Сори что так злобно...

sgb> да ничего — только с помощью ярлыка, это не программная реализация — это должен юзер делать, а не все знают...я же спрашиваю, как при установке или при запуске проги — зарегить в системе хоткей? без всяких ярлыков и пропертиз

втихаря вписать hidden app в укромное место реестра, которая будет слушать кнопки и при нажатии нужных запускать нужное приложение
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[8]: [C#]как вызвать программу с клавиатуры?
От: __max  
Дата: 04.05.07 09:57
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, __max, Вы писали:


__>>>>Если универсальный метод нужен (кроме CTRL+ALT+DEL), то только HOOK DLL (См. MSDN)


_M_>>>не обязательно, достаточно LOW LEVEL KEYBOARD HOOK, без DLL — красиво и удобно



__>>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>>API одинаковое, те же я#ц@ — вид сбоку!

__>>Но я бы предпочел DLL...

_M_>для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна


Может и красиво, но неудобно...
Описания структур, количество импортируемых функций...
проще все внутрь dll на плюсах завернуть...
Re[9]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 04.05.07 10:08
Оценка: 3 (1)
Здравствуйте, __max, Вы писали:

__>>>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>>>API одинаковое, те же я#ц@ — вид сбоку!

__>>>Но я бы предпочел DLL...

_M_>>для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна


__>Может и красиво, но неудобно...

__>Описания структур, количество импортируемых функций...
__>проще все внутрь dll на плюсах завернуть...

ерунда какая-то, импортировать нужно всего 4 функции

никакие структуры описывать не нужно, весь код займет 10-20 строк...

Пример, глобальная блокировка клавиш <Win>:
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security;


class Program
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if ( (nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN) )
        {
            int vkCode = Marshal.ReadInt32(lParam);
            if( ((Keys)vkCode == Keys.LWin)||((Keys)vkCode == Keys.RWin) )
            {
               Console.WriteLine("{0} blocked!", (Keys)vkCode);
               return (IntPtr)1;
            }
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurity]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurity]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurity]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurity]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: [C#]как вызвать программу с клавиатуры?
От: __max  
Дата: 04.05.07 11:18
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, __max, Вы писали:


__>>>>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>>>>API одинаковое, те же я#ц@ — вид сбоку!

__>>>>Но я бы предпочел DLL...

_M_>>>для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна


__>>Может и красиво, но неудобно...

__>>Описания структур, количество импортируемых функций...
__>>проще все внутрь dll на плюсах завернуть...

_M_>ерунда какая-то, импортировать нужно всего 4 функции


_M_>никакие структуры описывать не нужно, весь код займет 10-20 строк...


Не будем спорить, мне вот это допустим не нравится делать...

private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;

Я так понял это из хидера?

Мне проще было бы на плюсах DLL (вообще я из плюсов и пришел)
И тогда все просто — всего две функции:
HookHotkey(hotKey, callbackFunc);
UnhookHotkey(hotKey);

Вообщем спорить не буду...
Согласен удобно то, что не надо тягать за собой DLL и зависить от ++ кода,
неудобно реализовывать класс который ставит хуки... ну да ладно каждому свое.
Re[11]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 04.05.07 11:57
Оценка:
Здравствуйте, __max, Вы писали:

__>Здравствуйте, _Morpheus_, Вы писали:


_M_>>Здравствуйте, __max, Вы писали:


__>>>>>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>>>>>API одинаковое, те же я#ц@ — вид сбоку!

__>>>>>Но я бы предпочел DLL...

_M_>>>>для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна


__>>>Может и красиво, но неудобно...

__>>>Описания структур, количество импортируемых функций...
__>>>проще все внутрь dll на плюсах завернуть...

_M_>>ерунда какая-то, импортировать нужно всего 4 функции


_M_>>никакие структуры описывать не нужно, весь код займет 10-20 строк...


__>Не будем спорить, мне вот это допустим не нравится делать...


__> private const int WH_KEYBOARD_LL = 13;

__> private const int WM_KEYDOWN = 0x0100;

__>Я так понял это из хидера?


да. И что? две константы это очень плохо?

__>Мне проще было бы на плюсах DLL (вообще я из плюсов и пришел)


Я тоже, поэтому я ценю лаконичность p/invoke на C#, по сравнению с кодом на C++
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: [C#]как вызвать программу с клавиатуры?
От: Сергей Возробов Россия  
Дата: 04.05.07 17:43
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, __max, Вы писали:


__>>>>The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function.


__>>>>API одинаковое, те же я#ц@ — вид сбоку!

__>>>>Но я бы предпочел DLL...

_M_>>>для C# очень удобно и красиво, т.к. код может находится непосредственно в приложении, т.е. DLL не нужна


__>>Может и красиво, но неудобно...

__>>Описания структур, количество импортируемых функций...
__>>проще все внутрь dll на плюсах завернуть...

_M_>ерунда какая-то, импортировать нужно всего 4 функции


_M_>никакие структуры описывать не нужно, весь код займет 10-20 строк...


_M_>Пример, глобальная блокировка клавиш <Win>:

_M_>[c#]
_M_>using System;
_M_>using System.Diagnostics;
_M_>using System.Windows.Forms;
_M_>using System.Runtime.InteropServices;
_M_>using System.Security;


_M_>class Program

_M_>{
_M_> private const int WH_KEYBOARD_LL = 13;
_M_>

Спасибо, будем думать
Re[11]: [C#]как вызвать программу с клавиатуры?
От: _Morpheus_  
Дата: 04.05.07 17:45
Оценка:
Здравствуйте, Сергей Возробов, Вы писали:


СВ>Спасибо, будем думать


для спасибо есть специальная кнопочка
... << RSDN@Home 1.2.0 alpha rev. 676>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.