Пишу приложение, делаю чтобы оно запускалось через autorun, невидимым.
Нужно реализовать возможность, что бы при нажатии какой-либо комбинации, появлялось окно программы.
Как именно отловить комбинацию (допустим ctrl+shift+6)?
Другие языки программирования и технологии
c# (отловить комбинацию клавиш в системе)
На уровне 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: Есть и более экзотический способ у ярлыка на рабочем столе прописать горячие клавиши для вызова и соотв.
если программа уже в памяти, то её на экран выводить, если первый запуск - прятать. Но это немножко извращение.
Вам нужны 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: Есть и более экзотический способ у ярлыка на рабочем столе прописать горячие клавиши для вызова и соотв.
если программа уже в памяти, то её на экран выводить, если первый запуск - прятать. Но это немножко извращение.
Сергей Белов
Благодарю за информацию!
все равно антивир это приложение задетектирует
Сергей Белов
я не вирус пишу...
можете что-нибудь по существу посоветовать?
можете что-нибудь по существу посоветовать?
Похожие вопросы
- какие существуют комбинации горячих клавиш??? дайте список всех комбинаций горячих клавиш по офисным программам
- Какая комбинация для удаления Windows? Комбинация должна состоять из 3 клавиш. И как его водить?
- Как сделать чтобы змейка продолжала путь без нажатия клавиш? C++
- В каких unix системах надо уметь работать на уровне ПОЛЬЗОВАТЕЛЯ программисту c++ ?
- как нажать enter комбинацией ctr + "" чтобы левой а на клавишу нажимать?
- Информация о системе и железе в C#
- как в Microsoft Visual Studio 2010 в C# в системе счисления, перевести в десятеричную? Как дополнить код? Помогите плиз
- Народ, напишите "горячие клавиши" компа типа ctrl+V, ctrl+C с описанием
- скажите горячие клавиши типо cntrl+c cntrl+p типо этих для видоуса xp профешенал
- PascalABC.NET Графика, движение объекта после нажатия клавиши