Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 02.07.2019
Сообщений: 7

Powershell скрипт вылетает ввиду неизвестных причин

03.02.2026, 00:43. Показов 367. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имею следующий код на powershell. Ввиду неизвестных причин он вылетает. Притом, что самое интересное, если убрать строку 62 (с $activeKeys.Remove), то код работает стабильно без ошибок. Ошибка воспроизводитя при этом с любыми коллекциями, кроме Dictionary (и то, наверное, лишь по той причине, что я там не пытался что-либо удалить). В чём заключается проблема?
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using namespace System.Collections.Generic
# Определяем Win32 API функции
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections.Generic;
 
public static class Win32Api
{
    public const int WH_KEYBOARD_LL = 13;
    public const int WM_KEYDOWN = 0x0100;
    public const int WM_KEYUP = 0x0101;
    public const int WM_SYSKEYDOWN = 0x0104;
    public const int WM_SYSKEYUP = 0x0105;
    public const int KF_REPEAT = 0x4000;
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr GetModuleHandle(string lpModuleName);
 
    [DllImport("user32.dll")]
    public static extern short GetAsyncKeyState(int vKey);
 
    public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
}
'@
 
# Подключаем сборку System.Windows.Forms
Add-Type -AssemblyName System.Windows.Forms
 
# Создаем упорядоченное множество для отслеживания состояния клавиш
$activeKeys = New-Object List[int]
 
# Определяем функцию обратного вызова
$processKeys = {
    param($nCode, $wParam, $lParam)
    # Получаем виртуальный код клавиши напрямую
    $vkCode = [System.Runtime.InteropServices.Marshal]::ReadInt32($lParam)
 
    # Определяем тип события
    $eventType = switch ($wParam) {
        0x0100 { "KeyDown" }
        0x0101 { "KeyUp" }
        0x0104 { "SysKeyDown" }
        0x0105 { "SysKeyUp" }
        default { $wParam }
    }
 
    # Обновляем состояние клавиши
    switch ($vkCode){
        {("KeyDown", "SysKeyDown") -contains $eventType} {$activeKeys.Add($_)}
        {("KeyUp", "SysKeyUp")     -contains $eventType} {$activeKeys.Remove($_)}
 
    }
 
    # Обновляем состояния всех клавиш в словаре с помощью GetAsyncKeyState
    # и получаем список активных клавиш
    $activeKeyNames = $activeKeys | ForEach-Object {
        $tmp = "UnknownKey($_)"
        if([System.Enum]::IsDefined([System.Windows.Forms.Keys], $_)){
            $tmp = [System.Windows.Forms.Keys]$_
        }
        $tmp
    }
           
    # Выводим активные клавиши в одну строку
    Write-Host "$(Get-Date -Format "yyyy-MM-ddTHH:mm:ss.fffffff") " -NoNewline
    Write-Host "$($activeKeyNames -join '+') " -NoNewline
    Write-Host $(if ($activeKeys){"($($activeKeys -join '+'))"})
    if ($false){Write-Host "suckcess"}
}
 
$hookCallback = {
    param($nCode, $wParam, $lParam)
    while($busy){
    }
    $nextHookId = [Win32Api]::CallNextHookEx($hookID, $nCode, $wParam, $lParam)
    if ($nCode -lt 0){return $nextHookId}
    try{
        &$processKeys $nCode $wParam $lParam
    } catch {
        Write-Host "Error processing key event: $_"
    }
    $nextHookId
}
 
# Создаем делегат для функции обратного вызова
$callbackDelegate = [Win32Api+LowLevelKeyboardProc]$hookCallback
 
# Устанавливаем хук
$hookID = [Win32Api]::SetWindowsHookEx(
    [Win32Api]::WH_KEYBOARD_LL,
    $callbackDelegate,
    [Win32Api]::GetModuleHandle($null),
    0
)
 
# Запускаем цикл обработки сообщений
try {
    while ($true) {
        [System.Windows.Forms.Application]::DoEvents()
    }
} finally {
    # Убираем хук
    if ($hookID -ne [IntPtr]::Zero) {
        [Win32Api]::UnhookWindowsHookEx($hookID)
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2026, 00:43
Ответы с готовыми решениями:

PowerShell vs PowerShell ISE
Скажите, пожалуйста, чем PowerShell отличается от PowerShell ISE. Спасибо.

Отваливается RDP без видимых причин Windows 7
В общем, начала мучать меня проблема с RDP сервером на Windows 7.( периодически надо подключаться к...

Программа без причин прекращает работу
Здравствуйте! Я написал программу на Visual Studio C++ 2008. При работе в ОС Windows она без...

2
 Аватар для volodin661
6686 / 2278 / 347
Регистрация: 10.12.2013
Сообщений: 7,873
03.02.2026, 01:50
Цитата Сообщение от Programmer_01 Посмотреть сообщение
Ошибка воспроизводитя при этом с любыми коллекциями, кроме Dictionary (и то, наверное, лишь по той причине, что я там не пытался что-либо удалить).
Но приведённая строка 42 вообще не является валидной ( для моей версии Core 7.4.7 ) ( для 5.1 проверить не могу )
PowerShell
42
$activeKeys = New-Object List[int]
New-Object: Cannot find type[List[int]]: verify that the assembly containing this type is loaded.

а вот так норм
PowerShell
42
$activeKeys = New-Object System.Collections.Generic.List[int]
0
0 / 0 / 0
Регистрация: 02.07.2019
Сообщений: 7
03.02.2026, 03:31  [ТС]
Версия powershell следующая.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\Саша> $PSVersionTable
 
Name                           Value
----                           -----
PSVersion                      5.1.19041.6456
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.6456
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2026, 03:31
Помогаю со студенческими работами здесь

Копирование всех каталогов с одним заданным именем из множества неизвестных каталогов
Всем добрый день. Сложилась необходимость создания бекапа определенной папки в пользовательских...

Поиск известного файла в неизвестных подкаталогах
Привет скучающим. Нужен батничек для решения такой задачи: - Есть известная папка "C:\Folder" ...

Не выполняется подписанный PowerShell-скрипт
Ситуация следующая: Есть скрипт, который я подписал с помощью этой статьи. Есть сертификат,...

Запустить PowerShell-скрипт как службу
Есть скрипт, он находит некоторый процесс (он в кол. 4 штук) и разбрасывает каждый процесс на...

Что такое скрипт PowerShell?
у меня Windows7 а что такое PowerShell script и для чего нужен?? run.ps1 его еще называют верно??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru