Пытаюсь блокировать клавиатуру глобальным хуком. Возник ряд вопросов. После того как таймер отдыха отсчитал, положенное ему время:
1: Клава не включается.
2. Как с помощью того же хука заблокировать мышь? Я знаю, что нужно изменить константу WH_KEYBOARD_LL на WH_MOUSE_LL в SetWindowsHookEx, и дописать соотв. константу WH_MOUSE_LL = 14; но как их совместить в одном хуке я не знаю
Как вернуть работоспособность (вопрос по клаве)? Вот мой код:
....
/// запуск отсчета времени отдыха
/// </summary>
public void timerRest_Tick(object sender, System.EventArgs e)
{
//присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
//его после окончания первого же вызова функции
_proc = new LowLevelKeyboardProc(HookCallback);
KillCtrlAltDelete();//Блокируем диспетчер задач
SetHook(_proc);// устанавливаем хук
countSec++;
// счетчик отдыха достиг порогового времени
if(countSec >= timeRest)
{
// оповещение пользователя
this.notifyIcon.Text = "Таймер не запущен!";
// отдохнули - можно притупать к работе
LiveCtrlAltDelete();//Возобновляем работу диспетчера задач
UnhookWindowsHookEx(_hookID);// снимаем хук
countSec = 0;
timerRest.Stop();
strPrompt = "Работа!";
pictureBox1.Invalidate();
panel1.Visible = false;
// меняем активность элементов
menuItemStart.Enabled = true;
menuItemStop.Enabled = false;
//
PrepareWork();
// оповещение, что пора начать работать
PlaySound(strPathSound, Handle, (uint)0x00020000L|0x0001);
// разрешим изменять временные интервалы перед запуском программы
menuItemSetTimes.Enabled = true;
}
P.S. Глобальный хук клавы писал, исходя из этой статьи
http://www.sql.ru/forum/actualthread.aspx?tid=632552 вот код:
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace hook
{
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;
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)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
}
Как сделать исходя из выше приведеного кода хук для мыши и клавы?