четверг, 6 января 2011 г.

Блокированиие ввода на powershell

Мой маленький сынуля начал добираться до компьютера. Требовать мультиков и всего такого. Однако при просмотре этих самых мультиков он никак не может усидеть на месте. Жмет все кнопки клавиатуры. Дергает мышь и все такое.Вот я и задался вопросом, как заблокировать клавиатуру и мышь для него, но так чтобы можно было разблокировать. В общем, я в очередной раз убедился, что много всякого уже кем-то либо сделано либо написано. Решение нашел вот тут. В итоге родился вот такой вот “скрипт”. Хотя от скрипта тут только вызов функции.

$type = '
using System;
using System.Collections.Generic;
using System.Threading;
using System.Runtime.InteropServices;
using System.Text;

namespace blockInput
{
public class blockInputClass
{
public const uint MOD_ALT=0x0001;
public const uint MOD_CONTROL = 0x0002;
public const uint MOD_NOREPEAT = 0x4000; //not supported in vista/2003
public const uint MOD_SHIFT = 0x0004;
public const uint MOD_WIN = 0x0008;

public const int V_BKey = 0x42;
public const int V_QKey = 0x51;
public const int V_altKey = 0x12;
public const uint WM_HOTKEY = 0x0312;

public struct POINT
{
public Int32 x;
public Int32 y;
};
public struct MSG
{
public Int32 hwnd;
public Int32 message;
public Int32 wParam;
public Int32 lParam;
public Int32 time;
public POINT pt;
}

[DllImport("User32.dll")]
public static extern bool BlockInput(bool fBlockIt);

[DllImport("user32.dll")]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

[DllImport("user32.dll")]
static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);

public static void Block()
{
RegisterHotKey((IntPtr)null, 1, MOD_ALT, V_BKey);
RegisterHotKey((IntPtr)null, 7, MOD_ALT, V_QKey);
MSG msg = new MSG();

while (GetMessage(out msg, (IntPtr)null, 0, 0) == true)
{
if (msg.message == WM_HOTKEY)
{
//BlockInput(true);
switch (msg.wParam){
case 1: BlockInput(true); break;
case 7: return;
}
}
}
}
}
}
'

Add-Type -TypeDefinition $type

[blockInput.blockInputClass]::Block()




Пользоваться просто – alt+b заблокировать, alt+q – закрыть приложение. К сожалению используемый API, не дает возможности разблокировать ввод просто так. Для разблокировки нужно нажать ctrl+alt+del. После разблокировки процесс остается активным, и позволяет заблокировать ввод повторно. Для его закрытия нужно нажать alt+q.
Для работы код должен быть запущен с повышенными привилегиями.

Комментариев нет: