Другие языки программирования и технологии

c# (отловить комбинацию клавиш в системе)

Пишу приложение, делаю чтобы оно запускалось через autorun, невидимым.
Нужно реализовать возможность, что бы при нажатии какой-либо комбинации, появлялось окно программы.
Как именно отловить комбинацию (допустим ctrl+shift+6)?
Сергей Белов
Сергей Белов
1 752
На уровне C# безопасного кода это сделать невозможно на сколько я понимаю.

Вам нужны API функции RegisterHotKey и UnregisterHotKey и соотв. небезопасный код.
Подробнее о них:
http://technet.microsoft.com/ru-ru/query/ms646309
http://technet.microsoft.com/ru-ru/query/ms646327
Подробнее про WM_HOTKEY VK_KEY / параметры
http://msdn.microsoft.com/en-us/library/ms927178.aspx

Чей-то исходник (работающий) на Microsoft
http://social.msdn.microsoft.com/Forums/ru/fordesktopru/thread/f95d3ea4-cebe-42ff-9ea9-358391c5f845

Пример работы с C# (более грамотный, чем предыдущий навскидку)
(код честно стырен - на память я такое не напишу сходу, а источник ссылку муторно выковыривать =)
using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using System.Windows.Media;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace GlobalKeyboardHook
{
public class KeyboardHandler : IDisposable
{

public const int WM_HOTKEY = 0x0312;
public const int VIRTUALKEYCODE_FOR_CAPS_LOCK = 0x14;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

private readonly Window _mainWindow;
WindowInteropHelper _host;

public KeyboardHandler(Window mainWindow)
{
_mainWindow = mainWindow;
_host = new WindowInteropHelper(_mainWindow);

SetupHotKey(_host.Handle);
ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage;
}

void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled)
{
if (msg.message == WM_HOTKEY)
{
//Здесь будет обработчик по хоткею.
}
}

private void SetupHotKey(IntPtr handle)
{
RegisterHotKey(handle, GetType().GetHashCode(), 0, VIRTUALKEYCODE_FOR_CAPS_LOCK);
}

public void Dispose()
{
UnregisterHotKey(_host.Handle, GetType().GetHashCode());
}
}
}

P.S: Есть и более экзотический способ у ярлыка на рабочем столе прописать горячие клавиши для вызова и соотв.
если программа уже в памяти, то её на экран выводить, если первый запуск - прятать. Но это немножко извращение.
А К
А К
84 764
Лучший ответ
Сергей Белов Благодарю за информацию!
все равно антивир это приложение задетектирует
Сергей Белов я не вирус пишу...
можете что-нибудь по существу посоветовать?