<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=18458</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=18458&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)».]]></description>
		<lastBuildDate>Wed, 18 Jun 2025 19:57:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162517#p162517</link>
			<description><![CDATA[<p>Через время бездействия - годный вариант, спасибо. И тут тоже про эту проблему с горячей строкой - <a href="https://www.autohotkey.com/boards/viewtopic.php?t=114814">autohotkey.com/boards/viewtopic.php?t=114814</a>. Правильно ли понял, что там советуют добавить #InputLevel?</p>]]></description>
			<author><![CDATA[null@example.com (1srafel)]]></author>
			<pubDate>Wed, 18 Jun 2025 19:57:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162517#p162517</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162515#p162515</link>
			<description><![CDATA[<div class="quotebox"><cite>1srafel пишет:</cite><blockquote><p>когда горячая строка не откликается на &quot;102&quot;, если много раз перед этим набирались случайные цифры</p></blockquote></div><p>Может делать Reset через время бездействия?<br /></p><div class="quotebox"><cite>Справка пишет:</cite><blockquote><p>Immediately resets the hotstring recognizer.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Wed, 18 Jun 2025 13:15:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162515#p162515</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162514#p162514</link>
			<description><![CDATA[<p>Советую для отслеживания причины проблемы максимально минимизировать скрипт до размера, который сможет продемонстрировать проблему.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 18 Jun 2025 06:15:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162514#p162514</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162513#p162513</link>
			<description><![CDATA[<p>Просто имеется большой v1 скрипт, который постоянно запущен, и потому удобно запускать из него.</p>]]></description>
			<author><![CDATA[null@example.com (1srafel)]]></author>
			<pubDate>Tue, 17 Jun 2025 23:31:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162513#p162513</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162512#p162512</link>
			<description><![CDATA[<p>Не очень понятно, зачем один скрипт из другого запускать.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 17 Jun 2025 20:48:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162512#p162512</guid>
		</item>
		<item>
			<title><![CDATA[AHK v2: Заблокировать клавиатуру и мышь (+ AHK v1)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162511#p162511</link>
			<description><![CDATA[<p>Составил такой вариант v2-скрипта для блокировки клавиатуры и мыши, который запускаю из v1-скрипта с правами администратора. </p><p>— блокирует по &quot;F1 + Пробел&quot; (можно разблокировать по этой же клавише, но закомментировано);<br />— после блокировки создает файл &quot;BlockKbrdMouse.FLG&quot;, чтобы после перезапуска компьютера блокировка восстановилась;<br />— разблокирует по горячей строке &quot;102&quot; (в гуи записано словами, для защиты от неумеющих читать детей);<br />— разблокировка удаляет файл &quot;BlockKbrdMouse.FLG&quot;;<br />— если запущен PotPlayer — остается рабочей только клавиша &quot;Пробел&quot;, для возможности остановки/старта воспроизведения;<br />— добавил дополнительно почти все клавиши с return, так как &quot;BlockInput(true)&quot; некоторые мои клавиши преодолевали.</p><p>Есть вопрос по коду v2. Как исправить поведение, когда горячая строка не откликается на &quot;102&quot;, если много раз перед этим набирались случайные цифры?</p><p>Код для v1:<br /></p><div class="codebox"><pre><code>IfExist, %MY_DATA%\_Scripts\BlockKbrdMouse.FLG
   Gosub, BlockKbrdMouse

; Заблокировать клавиатуру и мышь
F1 &amp; Space::
BlockKbrdMouse:
   ;Запуск программы С ПРАВАМИ Администратора

   Run *RunAs &quot;C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe&quot; &quot;%MY_DATA%\_Scripts\BlockKbrdMouse_(+ADMIN+AHKv2).ahk&quot;
Return</code></pre></div><p>Код для v2:<br /></p><div class="codebox"><pre><code>#Requires AutoHotkey v2.0
#SingleInstance Force
#UseHook
;KeyHistory 0 ; Отключает историю нажатий клавиш для оптимизации и снижения использования памяти.



; Путь к файлу флага
BlockKbrdMouseFile := A_ScriptDir &quot;\BlockKbrdMouse.FLG&quot;

; Создание файла флага, если он не существует
if !FileExist(BlockKbrdMouseFile) {
    FileAppend(&quot;&quot;, BlockKbrdMouseFile)  ; Создаёт пустой файл
}

; Инициализация переменных
isLocked := true

; Создание GUI
; Внешнее окно с красным фоном (для каймы)
myGui := Gui()
myGui.BackColor := &quot;Red&quot;  ; Красный фон для имитации каймы
myGui.Opt(&quot;-Caption +AlwaysOnTop +ToolWindow +E0x80000&quot;) ; WS_EX_LAYERED, без +Border

; Внутреннее окно с жёлтым фоном и текстом
innerGui := Gui()
innerGui.BackColor := &quot;Yellow&quot;  ; Жёлтый фон
innerGui.Opt(&quot;-Caption +Parent&quot; myGui.Hwnd) ; Внутреннее окно

; Включить обнаружение скрытых окон 
;!!DetectHiddenWindows(true)
;MsgBox WinExist(&quot;ahk_exe PotPlayerMini64.exe&quot;) ? &quot;PotPlayer существует&quot; : &quot;PotPlayer не найден&quot; ; Раскомментировать для отладки

; Проверка, существует ли процесс PotPlayer
if WinExist(&quot;ahk_exe PotPlayerMini64.exe&quot;) {
    innerGui.SetFont(&quot;s18 cRed&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x10 y10 w120&quot;, &quot;Сто два&quot;) ;Сто два
    innerGui.SetFont(&quot;s18 cBlack&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x+20 y10 w580&quot;, &quot; — разблокировать клавиатуру и мышь&quot;)
    innerGui.Show(&quot;x10 y10 w680 h60&quot;) ; Уменьшенное окно
    myGui.Show(&quot;w700 h80 y0&quot;) ; Внешнее окно по центру
    myGui.Title := &quot;BlockKbrdMouse_Win&quot;
} else {
    innerGui.SetFont(&quot;s20 cRed&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x10 y10 w120&quot;, &quot;Сто два&quot;) ;Сто два
    innerGui.SetFont(&quot;s20 cBlack&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x+20 y10 w350&quot;, &quot; — разблокировать клавиатуру и мышь&quot;)
    innerGui.SetFont(&quot;s12 cRed&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x10 y100 w120&quot;, &quot;F1+Пробел&quot;)
    innerGui.SetFont(&quot;s12 cBlack&quot;, &quot;Segoe UI&quot;)
    innerGui.Add(&quot;Text&quot;, &quot;x+20 y100 w140&quot;, &quot; — заблокировать&quot;)
    innerGui.Show(&quot;x10 y10 w410 h140&quot;) ; Полное окно
    myGui.Show(&quot;w430 h160 Center&quot;) ; Внешнее окно по центру
    myGui.Title := &quot;BlockKbrdMouse_Win&quot;
}

; Проверка существования окна GrandGui
if WinExist(&quot;GrandGui&quot;)
{
    ; Установить прозрачность (100 — нечётко видимое)
    DllCall(&quot;SetLayeredWindowAttributes&quot;, &quot;Ptr&quot;, myGui.Hwnd, &quot;UInt&quot;, 0, &quot;UChar&quot;, 90, &quot;UInt&quot;, 0x2)
}
else
{
    ; Установить прозрачность (255 — чётко видимое)
    DllCall(&quot;SetLayeredWindowAttributes&quot;, &quot;Ptr&quot;, myGui.Hwnd, &quot;UInt&quot;, 0, &quot;UChar&quot;, 255, &quot;UInt&quot;, 0x2)
}

WinShow(myGui.Hwnd) ; Принудительно показать окно
WinRedraw(myGui.Hwnd) ; Перерисовать окно для гарантии отображения






; Включение блокировки при запуске скрипта
BlockInput(true)
SoundBeep(500, 200) ; Звуковой сигнал для подтверждения



; Исключения для клавиш
#InputLevel 1
; Исключение для пробела в окне PotPlayer: пробел не блокируется
$Space:: {
    ; Проверка, существует ли процесс PotPlayer
    if WinExist(&quot;ahk_exe PotPlayerMini64.exe&quot;) {
        WM_KEYDOWN := 0x0100
        WM_KEYUP := 0x0101
        VK_Space := 0x20
        potPlayerTitle := &quot;ahk_exe PotPlayerMini64.exe&quot;
        potPlayerID := WinGetID(potPlayerTitle)

        DetectHiddenWindows(false)
        BlockInput(false)

        if potPlayerID {
            persistentClass := getPersistentClass(potPlayerID)
            hwnd := findChildByClass(potPlayerID, persistentClass)

            if !hwnd {
                ToolTip(&quot;❌ Класс &quot; persistentClass &quot; не найден, пробую заново&quot;)
                persistentClass := getPersistentClass(potPlayerID)
                hwnd := findChildByClass(potPlayerID, persistentClass)
            }
            if hwnd {
                ; Временно активируем PotPlayer, чтобы пробел точно сработал
                WinActivate(&quot;ahk_id &quot; potPlayerID)
                Sleep(40) ;100

                ; Отправляем пробел
                PostMessage(WM_KEYDOWN, VK_Space, 0, , hwnd)
                Sleep(15) ;30
                PostMessage(WM_KEYUP, VK_Space, 0, , hwnd)

                ToolTip(&quot;Пробел отправлен в HWND: &quot; hwnd)

                ; Снова поднимаем GUI поверх PotPlayer
                WinSetAlwaysOnTop(true, &quot;ahk_id &quot; myGui.Hwnd)
                WinSetAlwaysOnTop(true, &quot;ahk_id &quot; innerGui.Hwnd)
                WinActivate(&quot;ahk_id &quot; myGui.Hwnd) ; Только после отправки
            } else {
                ToolTip(&quot;❌ Не удалось найти нужное окно даже после повтора&quot;)
            }
        } else {
            Send(&quot;{Space}&quot;)
            ToolTip(&quot;PotPlayer не найден, пробел отправлен&quot;)
        }
        ToolTip()
        BlockInput(true)
        DetectHiddenWindows(true)
    }
}

getPersistentClass(potPlayerID) {
    persistentClass := &quot;&quot;
    foundHwnd := 0

    EnumChildProc(hwnd, _) {
        class := WinGetClass(&quot;ahk_id &quot; hwnd)
        if class {
            foundHwnd := hwnd
            persistentClass := class
            return false
        }
        return true
    }
    cb := CallbackCreate(EnumChildProc, &quot;Fast&quot;)
    DllCall(&quot;User32.dll\EnumChildWindows&quot;, &quot;Ptr&quot;, potPlayerID, &quot;Ptr&quot;, cb, &quot;Ptr&quot;, 0)
    CallbackFree(cb)

    return (foundHwnd != 0) ? persistentClass : &quot;&quot;
}

findChildByClass(parentHwnd, className) {
    foundHwnd := 0

    EnumChildProc(hwnd) {
        class := WinGetClass(&quot;ahk_id &quot; hwnd)
        if (class = className) {
            foundHwnd := hwnd
            return false
        }
        return true
    }
    cb := CallbackCreate(EnumChildProc, &quot;Fast&quot;)
    DllCall(&quot;User32.dll\EnumChildWindows&quot;, &quot;Ptr&quot;, parentHwnd, &quot;Ptr&quot;, cb, &quot;Ptr&quot;, 0)
    CallbackFree(cb)

    return foundHwnd
}

#InputLevel 0





/*
; удерживать F1 + F5 + Пробел одновременно, чтобы разблокировать
SetTimer(CheckUnlock, 50)
CheckUnlock() {
    global isLocked
    if (isLocked &amp;&amp; GetKeyState(&quot;F1&quot;, &quot;P&quot;) &amp;&amp; GetKeyState(&quot;F5&quot;, &quot;P&quot;) &amp;&amp; GetKeyState(&quot;Space&quot;, &quot;P&quot;)) {
        UnBlock()
    }
}
*/




; Горячая строка для разблокировки
; --- Автозамена в любом месте ввода ---
:?*:102::
{
    global isLocked
    if (!GetKeyState(&quot;F1&quot;, &quot;P&quot;) &amp;&amp; isLocked)
    {
        UnBlock()
    }
}



/*
; Горячая клавиша для блокировки (F1 + Пробел)
#HotIf GetKeyState(&quot;F1&quot;, &quot;P&quot;) ; Проверяем, удерживается ли F1
Space::
{
    UnBlock()
}
#HotIf
*/

; Функция разблокировки
UnBlock() {
    global isLocked
    BlockInput(false) ; Отключаем блокировку
    isLocked := false
    if FileExist(BlockKbrdMouseFile) {
        FileDelete(BlockKbrdMouseFile) ; Удаляем файл флага
    }
    ;myGui.Destroy() ; Уничтожаем GUI после разблокировки
    ;SoundBeep(1000, 200) ; Звуковой сигнал для подтверждения
    ExitApp
}

; Перехват всех клавиш, кроме цифр, в состоянии блокировки
#HotIf isLocked
; Буквы
$a::return
$b::return
$c::return
$d::return
$e::return
$f::return
$g::return
$h::return
$i::return
$j::return
$k::return
$l::return
$m::return
$n::return
$o::return
$p::return
$q::return
$r::return
$s::return
$t::return
$u::return
$v::return
$w::return
$x::return
$y::return
$z::return

/*
; Цифровые клавиши
0::Return
1::Return
2::Return
3::Return
4::Return
5::Return
6::Return
7::Return
8::Return
9::Return
*/

; Функциональные клавиши
$F1::return
$F2::return
$F3::return
$F4::return
$F5::return
$F6::return
$F7::return
$F8::return
$F9::return
$F10::return
$F11::return
$F12::return

; Специальные клавиши
$AppsKey::Return   ; Меню (context menu key)
;$Space::return
$Enter::return
$Tab::return
$Backspace::return
$Delete::return
$Insert::return
$Home::return
$End::return
$PgUp::return
$PgDn::return
$Up::return
$Down::return
$Left::return
$Right::return
$Esc::return
$CapsLock::return
$ScrollLock::return
$NumLock::return
$PrintScreen::return
$Pause::return

; Модификаторы
$LShift::return
$RShift::return
$LCtrl::return
$RCtrl::return
$LAlt::return
$RAlt::return
$LWin::return
$RWin::return

/*
; Знаки препинания и символы
$`::return
$~::return
$!::return
$@::return
$#::return
$$::return
$%::return
$^::return
$&amp;::return
$*::return
$(::return
$)::return
$_::return
$+::return
$[::return
$]::return
${::return
$}::return
$|::return
$\::return
$;::return
$Colon::return
$&#039;::return
$&quot;::return
$,::return
$.::return
$&lt;::return
$&gt;::return
$/::return
$?::return
*/

/*
; Математические символы
Multiply::Return ; Умножение (*)
Add::Return      ; Плюс (+)
Subtract::Return ; Минус (-)
Divide::Return   ; Деление (/)
Decimal::Return  ; Десятичная точка (.)
*/

; Клавиши цифрового блока (кроме цифр)
$NumpadDiv::return
$NumpadMult::return
$NumpadAdd::return
$NumpadSub::return
$NumpadEnter::return
$NumpadDot::return

; Мышь
$LButton::return
$RButton::return
$MButton::return
$XButton1::return
$XButton2::return
$WheelUp::return
$WheelDown::return

; Мультимедийные клавиши
Browser_Back::return
Browser_Forward::return
Browser_Refresh::return
Browser_Stop::return
Browser_Search::return
Browser_Favorites::return
Browser_Home::return
Volume_Mute::return
Volume_Down::return
Volume_Up::return
Media_Next::return
Media_Prev::return
Media_Stop::return
Media_Play_Pause::return
Launch_Mail::return
Launch_Media::return
Launch_App1::return
Launch_App2::return

#HotIf

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (1srafel)]]></author>
			<pubDate>Tue, 17 Jun 2025 19:14:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162511#p162511</guid>
		</item>
	</channel>
</rss>
