Быстрый мониторинг реестра с помощью process monitor
Давайте выясним, откуда «Установка и удаление программ» берет сведения об установленном uTorrent. На панели инструментов Process Monitor и Process Explorer есть мишень, помогающая точно определить процесс.
- Перетяните мишень из Process Monitor на окно панели управления.
- В панели управления выполните поиск программы, чтобы спровоцировать запрос в реестр.
- В Process Monitor нажмите CtrlF и поищите имя программы или издателя (я искал torrent).
- Перейдите в редактор реестра сочетанием клавиш CtrlJ.
Process Monitor автоматически определит процесс окна и отфильтрует по нему результаты мониторинга, в чем легко убедиться, открыв список фильтров сочетанием CtrlL. В данном случае за руку был схвачен процесс explorer.exe с PID 3704.
Изменение громкости звука windows с помощью командной строки
сделайте файлы JavaScript:
echo var oShell = new ActiveXObject("WScript.Shell"); >> volup.js<BR>
echo oShell.SendKeys(String.fromCharCode(0xAF)); >> volup.js
echo var oShell = new ActiveXObject("WScript.Shell"); >> voldown.js<BR>
echo oShell.SendKeys(String.fromCharCode(0xAE)); >> voldown.js
echo var oShell = new ActiveXObject("WScript.Shell"); >> togglemute.js<BR>
echo oShell.SendKeys(String.fromCharCode(0xAD)); >> togglemute.js
показать регулятор громкости, так что вы можете видеть, что вы делаете:
sndvol
(or maybe sndvol32)
изменить громкость:
cscript voldown.js
Примечание: у меня был этот подход надежно работать на машинах, которые я пытался использовать его на. ответ Хелен на вопрос о StackOverflow Сибо Лина об этом указывает, что отключение звука ненадежно, но изменение громкости может быть не столь надежным. Подозреваю, что уровень надежности может быть разные на разных машинах. Этот подход использует технологию имитации нажатия клавиши и, в частности, клавиши регулировки громкости на расширенной мультимедийной клавиатуре. В то время, когда Windows начала поддерживать это, такая клавиатура была в основном мало используемой легкомысленной функцией, которая предлагала функциональность, которая ранее была доступна только с пользовательскими драйверами. Меня бы не удивило, если бы этот код был менее отполирован и с меньшей вероятностью работал на некоторых из различных (возможно, более старых) аппаратных средств, которые туда. Все, что сказал, У меня не было проблем с этим.
благодарности:
одно предостережение: этот вопрос был помечен Windows XP. Я только что попробовал это в Windows 10. Я знаю, что я использовал это в Windows 7 (по крайней мере, достаточно, чтобы проверить его). Поскольку я впервые начал видеть встроенную поддержку Microsoft для этих расширенных клавиатур во время Windows ME, я бы подумал, что это, вероятно, будет хорошо работать и WinXP. Я не помню, если Я на самом деле протестировал это с этой операционной системой. Тем не менее, если этот подход не работает хорошо, я не ожидаю, что он вызовет проблемные побочные эффекты.
Как удалить встроенные программы windows 10
Вместе с системой Windows 10 на компьютер устанавливается множество приложений, некоторые из них нельзя удалить просто так. Однако, используя Powershell все-таки можно выполнить эту операцию.
Итак, нажимаем на “Пуск” правой кнопкой мыши, а затем выбираем “Выполнить”.
В окне “Выполнить “пишем “powershell”.
В открывшемся окне впишите:
- Get-AppxPackage | Select Name, PackageFullName
Нажмите “Enter”, перед вами появится список установленных программ, где в левой части краткое название, а в правой – полное. Для удаления приложения воспользуйтесь командой:
- Get-AppxPackage “Полное имя программы” | Remove-AppxPackage
Например:
Удаляем 3D Builder:
Get-AppxPackage *3dbuilder* | Remove-AppxPackage
Вот полный список программ встроенных в Windows 10.
3D Builder:
Get-AppxPackage *3dbuilder* | Remove-AppxPackage
Часы и будильник:
Get-AppxPackage *windowsalarms* | Remove-AppxPackage
Калькулятор:
Get-AppxPackage *windowscalculator* | Remove-AppxPackage
Календарь и почта:
Get-AppxPackage *windowscommunicationsapps* | Remove-AppxPackage
Камера:
Get-AppxPackage *windowscamera* | Remove-AppxPackage
Получить Office:
Get-AppxPackage *officehub* | Remove-AppxPackage
Получить Skype:
Get-AppxPackage *skypeapp* | Remove-AppxPackage
Начало работы:
Get-AppxPackage *getstarted* | Remove-AppxPackage
Groove Music:
Get-AppxPackage *zunemusic* | Remove-AppxPackage
Карты:
Get-AppxPackage *windowsmaps* | Remove-AppxPackage
Кинои ТВ:
Get-AppxPackage *zunevideo* | Remove-AppxPackage
Новости:
Get-AppxPackage *bingnews* | Remove-AppxPackage
OneNote:
Get-AppxPackage *onenote* | Remove-AppxPackage
Люди:
Get-AppxPackage *people* | Remove-AppxPackage
Диспетчер телефонов:
Get-AppxPackage *windowsphone* | Remove-AppxPackage
Фотографии:
Get-AppxPackage *photo* | Remove-AppxPackage
Магазин Windows:
Get-AppxPackage *windowsstore* | Remove-AppxPackage
Спорт:
Get-AppxPackage *bingsports* | Remove-AppxPackage
Запись голоса:
Get-AppxPackage *soundrecorder* | Remove-AppxPackage
Погода:
Get-AppxPackage *bingweather* | Remove-AppxPackage
Xbox:
Get-AppxPackage *xboxapp* | Remove-AppxPackage
Замените “Полное имя программы” на название из правой части списка, нажмите “Enter”. Программа будет полностью удалена с вашего компьютера. Будьте осторожны, и не удаляйте программы, отсутствие которых приведет к нарушению работы Windows.
Как удалить программу в windows 10 из командной строки – cpab

Если вы используете Windows 10 и вам нужно освободить место на диске, вы можете удалить приложения, которые больше не используете, прямо из командной строки. Вот как это делается.
Сначала вам нужно запустить командную строку от имени администратора, чтобы удалить программу. В поле поиска Windows введите «cmd», а затем щелкните правой кнопкой мыши «Командная строка» в результатах.
Затем щелкните «Запуск от имени администратора» в появившемся меню.
Командная строка теперь запускается с правами администратора. Чтобы удалить программу с помощью командной строки, необходимо использовать служебную программу командной строки инструментария управления Windows (WMIC).
В командной строке введите следующую команду и нажмите Enter:
wmic
Теперь вы увидите wmic:rootcli>
подсказка в консоли. Это означает, что теперь вы можете использовать операции инструментария управления Windows (WMI).
Затем вам понадобится список программ, установленных на вашем компьютере. Получение этого списка важно, потому что вы должны указать точное название продукта, чтобы успешно выполнить команду удаления.
Введите следующую команду, чтобы получить список:
product get name
Наконечник: Вы также можете запускать команды wmic непосредственно из стандартной командной строки, не запуская «wmic
»И сначала войдите в подсказку WMIC. Для этого добавьте к ним «wmic
. » Например, «wmic product get name
«Работает так же, как и»wmic,
» а потом «product get name.
«
Найдите в списке название программы, которую хотите удалить. Вы можете удалить программу, выполнив эту команду:
product where name="program name" call uninstall
Просто замените program name
с названием программы, которую вы хотите установить. Например, если мы хотим удалить приложение Skype Meetings, мы должны ввести эту команду:
product where name="Skype Meetings App" call uninstall
Затем вас попросят подтвердить, действительно ли вы хотите выполнить команду. Тип Y
для подтверждения, а затем нажмите Enter. Тип N
для отмены операции.
Через несколько секунд вы получите сообщение о том, что метод был успешно выполнен.
Приложение было удалено с вашего компьютера.
Это лишь один из многих способов удалить приложение в Windows 10. Это также можно сделать из панели управления, меню «Пуск» или окна «Настройки».
Мгновенный вызов диспетчера задач
Windows 2000. Диспетчер задач Windows позволяет с легкостью отключать скрытые или проблемные приложения, проверять, какие из программ пожирают оперативную память, и анализировать работу ЦП. Вы можете быть страстным поклонником Диспетчера задач — и не знать кратчайшего способа добраться до этой утилиты.
В Windows 2000 Диспетчер задач можно запустить, нажав сочетание клавиш
для вывода на экран диалогового окна «Безопасность Windows» и щелкнув потом на кнопке «Диспетчер задач».
В Windows XP надо просто щелкнуть правой кнопкой на свободном пространстве Панели задач и выбрать в раскрывшемся меню опцию «Диспетчер задач».
А вот способ, позволяющий сделать обращение к Диспетчеру задач еще более удобным. Читатель Тимоти Дж. Луома из шт. Флорида указывает, что когда Диспетчер задач работает, то он помещает в Системный лоток (в правом нижнем углу экрана) крохотный анимированный значок, отражающий работу ЦП.
Наведя на него курсор мыши и задержав его там на несколько мгновений, можно также увидеть сообщение о том, на сколько процентов используется ЦП, — оно выводится в составе подсказки к этому значку. Если эта функция вам нравится, то почему бы не заставить Диспетчер задач работать постоянно, поместив ярлык к нему в папку «Автозагрузка»?
Щелкните правой кнопкой мыши на кнопке «Пуск» и выберите пункт «Открыть». Дважды щелкните на значке «Программы», потом «Автозагрузка». Снова щелкнув на кнопке «Пуск», выберите «Найти?Файлы и папки», введите в верхнюю графу команду tаskmgr.exe, в графе «Где искать» укажите диск, с которого запускается система (для большинства пользователей это будет c:), и щелкните на кнопке «Найти».
Когда увидите программный файл Диспетчера задач в окне результатов поиска, перетащите его при нажатой правой кнопке в раскрытую папку «Автозагрузка». Отпустив кнопку мыши, выберите опцию «Создать ярлыки». Теперь щелкните правой кнопкой на новом ярлыке и укажите пункт «Свойства».
Выберите затем закладку «Ярлык», а в ниспадающем списке в графе «Окно» — «Свернутое в значок». Щелкните на OK. Чтобы Диспетчер задач не попадался на глаза, когда он не нужен, дважды щелкните на ярлыке для запуска утилиты и в меню в верхней части ее окна задайте «Параметры?Скрывать свернутое».
Теперь Диспетчер задач будет запускаться незримо, но вы всегда сможете раскрыть его окно, дважды щелкнув на значке ЦП на Системной панели.
Scott Dunn. Sound Off: Take Charge of Windows Audio Controls. PC World, январь 2002 г., с. 148.
Настройка звука в игре для наушников в counter-strike: global offensive
В данном руководстве присутствуют консольные команды для настройки звука CS:GO (желательно их сохранить в CFG) и настройки звука в Windows 10, чтобы чётко понимать, откуда издаются звуки шагов и выстрелов ваших союзников и соперников в игре
Настройка наушников
Настройка в приложении
Запустите Диспетчер Realtek HD, который можно найти в системном трее, и поставьте настройки как у меня, если у вас 5.1, но если 7.1, то включаем его и включаем все колонки, которые работают
Настройка в Windows 10
Если у вас другая версия Windows и не знаете как это сделать, то найдите информацию в Интернете
Нажмите ПКМ на системный значок Громкость и ЛКМ на Открыть параметры звука
Далее щелкните ЛКМ на
Панель управления звуком
Затем ПКМ на
Наушники
, ЛКМ
Свойства
ЛКМ переходим в раздел на Улучшения и ставим галочки внутри квадратах на Эквалайзер, Виртуальное окружение и Тонкомпенсация
Нажимаем ЛКМ на название Эквалайзер, затем на троеточие «…«, который находится ниже в Свойства звукового эффекта, настраиваем его как у меня и сохраняем его, как «Название эквалайзера» (можете назвать как хотите)
Причины возникновения ошибки
В большинстве случаев ошибка PAGE_FAULT_IN_NONPAGED_AREA связана с:
В некоторых случаях источником ошибки “STOP: 0x00000050” могут быть:
- некорректно работающие или вышедшее из строя физические компоненты компьютера и периферийные устройства (оперативная память, блок питания и т.д.);
- повреждение системного реестра или жесткого диска;
Примечание: Следует помнить, что некорректное завершение работы компьютера (сбой в электросети или, например, выключение путем выдергивания вилки из розетки) может привести к повреждению компьютера.
Имя файла, вызвавшего ошибку, может быть указано непосредственно на самом синем экране: win32k.sys, ntfs.sys, hal.dll, atikmdag.sys и т.д.
Однако так бывает не всегда. В таких случаях помогут программы для сканирования дампов системы, например, BlueScreenView. Установка и работа с этим продуктом описана в нашей статье – “Как исправить ошибку System Service Exception в Windows 10”.
Примечание: прежде, чем приступать к каким-либо действиям по решению проблемы, следует понять характер ее проявления и воздействия – если ошибка возникла один раз, после чего больше не повторялась и не повлияла на работоспособность и производительность компьютера, может быть, стоит оставить все как есть и повторно задуматься о ней в случае повторного появления.
Решение 1: отключение/удаление торрент-клиента
Довольно часто источником проблемы (ошибка появляется при запуске системы) является клиент uTorrent (если он установлен), поэтому можно попробовать удалить его или, хотя бы, отключить его автозагрузку. Для этого:
- Запускаем Диспетчер задач (например, через контекстное меню Пуска, вызываемое нажатием клавиш Win X или щелчком правой кнопкой мыши по значку Пуска).
- Переходим во вкладку “Автозагрузка”, находим строку с названием программы, щелкаем по ней правой кнопкой мыши и выбираем в открывшемся меню пункт “Отключить”. Либо нажимаем аналогичную кнопку в нижнем правом углу окна, предварительно выбрав программу.
Решение 3: отключение/удаление сетевого моста
Если на синем экране BSoD указаны файлы “tcpip.sys” и “tm.sys”, скорее всего, проблема заключается в мосте между подключениями. В этом случае:
- Жмем сочетание Win R, чтобы вызвать окно “Выполнить”.
- Пишем команду “ncpa.cpl” и щелкаем OK (или Enter на клавиатуре) для запуска ее выполнения.
- Откроется окно “Сетевые подключения”. Проверяем наличие сетевых мостов и в случае их обнаружения отключаем или удаляем (в зависимости от того, какое из данных действие доступно, а также, от необходимости в данном мосте).
В некоторых случаях решением может быть обновление или, наоборот, откат драйвера Wi-Fi адаптера или сетевой карты.
Сведения из реестра windows
Зато все нормальные программы при установке должны записывать сведения в реестр, откуда их извлекает элемент панели управления appwiz.cpl. Конкретный раздел реестра хорошо известен и давно задокументирован в статье KB314481 (ее я всегда нагугливаю запросом uninstall registry).
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
У каждого приложения там свой подраздел, именем которого по воле разработчика является название или идентификатор программы. Команда для удаления записана в параметре UninstallString – именно она вызывается из панели управления.
Заметьте, что команда открывает графический интерфейс деинсталлятора, но не удаляет программу автоматически, как в случае со способом WMI. Поэтому нужно еще выяснить ключ тихой установки/удаления, зависящий от типа установщика. Зачастую, это /s или /silent, и тогда команда для автоматического удаления выглядит примерно так:
"C:Program FilesVideoLANVLCuninstall.exe" /s
Но и у этого способа есть нюанс – в обсуждаемом разделе реестра могут отображаться не все программы. Например, я не нашел там установленный uTorrent (проверьте у себя).
Откуда панель управления о нем знает? К ответу можно прийти поиском по реестру или просто догадаться, но лучше сразу взять простой и удобный инструмент — Process Monitor.
Справочник по командам cmd windows
Данная страница представляет собой самый полный документ в русскоязычном сегменте Интернет, содержащий список команд командной строки всех версий Windows. Наименования подавляющего большинства команд являются ссылками и ведут на страницы с подробным их описанием и примерами использования.
В разных версиях ОС семейства Windows набор поддерживаемых команд, их параметры командной строки, синтаксис и отображение результатов выполнения могут различаться. Одна и та же утилита командной строки может присутствовать в стандартной поставке одной версии Windows, но отсутствовать в другой, или входить в состав дополнительных средств, как например, Resource Kit или Software Development Kit.
На данной странице представлено описание не только внутренних команд CMD, но и стандартных утилит командной строки, входящих в состав конкретных версии операционной системы (ОС) семейства Windows. Некоторые из приведенных команд устарели, и больше не поддерживаются разработчиком или не имеют смысла в современных операционных системах, что отмечается в описании команды.
Список команд постоянно обновляется и включает в себя все новейшие команды, добавляемые в стандартную поставку при выходе новых версий или обновлений ОС Windows 10.
APPEND – позволяет программам открывать файлы данных из указанных
папок так, как будто они находятся в текущей папке.
ARP – просмотр и изменение таблиц ARP (Address Resolution Protocol)
ASSOC – просмотр или изменение сопоставлений расширений файлов приложениям
AT – управление планировщиком задач
ATTRIB – изменение атрибутов файлов
Auditpol – управление политиками аудита.
BASH – командная оболочка BASH в подсистеме Windows для Linux (WSL).
BCDBOOT – копирование в системный раздел файлов загрузки и создание
нового хранилища конфигурации загрузки (BCD)
BCDEDIT – редактирование хранилища данных конфигурации загрузки (BCD)
BOOTCFG – редактирование параметров загрузки в файле boot.ini
BOOTIM – вызов меню загрузки и восстановления (Выбор действия) Windows 10
BOOTREC – восстановление загрузочных записей и конфигурации загрузки Windows
BOOTSECT – редактирование загрузочных секторов для обеспечения загрузки NTLDR или BOOTMGR
BREAK – включить или выключить обработку комбинации клавиш CTRL C в DOS
CACLS – редактирование списков управления доступом к файлам (ACL – Access Control List)
CALL – вызов из командного файла подпрограмм или других командных файлов
CD – смена каталога (Change Directory)
Сторонние утилиты для очистки
Сторонний софт появился уже на все случаи жизни, в том числе и на деинсталляцию ненужных программ. Для кого-то это баловство для ленивых пользователей, а для кого – это более удобное средство по сравнению со стандартными средствами операционной системы.
И в том и в другом случае альтернативных вариантов на сегодняшний день полно, и по-настоящему годных действительно не мало. К таковым можно отнести Revo Uninstaller, IObit Uninstaller, Ashampoo UnInstaller и некоторые другие. Поскольку их функционал приблизительно схож между собой – рассмотрим только первый.
Первое, что бросается в глаза после установки Revo Uninstaller – это новые пункты в контекстном меню при выборе ярлыка программы правым кликом мыши.
Нечто подобное уже мелькало в Диспетчере задач, но здесь, именно в таком варианте – действительно удобно. Тут и манипуляции с автозапуском, и управление процессом приложения, и классическая деинсталляция – и все это доступно даже без запуска «Revo»! Впрочем, интерфейс главного окна программы тоже не обделили функционалом.
Загадочная опция «Режим охотника» – режим для массового удаления объектов одним кликом. Появляется аналог курсора в виде прицела, которым и производятся все манипуляции. Большинство остальных инструментов программы в представлении не нуждается, исходя из названия, но парочка из них достойна отдельного внимания.
А если затронуть тему работы с операционной системой – то тут тоже могут позавидовать многие платные оптимизаторы.
По праву программу можно считать удивительной. За серым скромным названием «Revo uninstaller» прячется не только качественный деинсталлятор, но и целый комбайн по работе с системой и поддержании ее в оптимальном состоянии.
Таблица скан-кодов клавиатуры:
Key | Make (HEX) | Break (HEX) |
---|---|---|
Num Lock | 45 | C5 |
Num Divide | E0 35 | E0 B5 |
Num Multiply | 37 | B7 |
Num Minus | 4A | CA |
Num Plus | 4E | CE |
Num Enter | E0 1C | E0 9C |
Num Dot | 53 | D3 |
Num 0 | 52 | D2 |
Num 1 | 4F | CF |
Num 2 | 50 | D0 |
Num 3 | 51 | D1 |
Num 4 | 4B | CB |
Num 5 | 4C | CC |
Num 6 | 4D | CD |
Num 7 | 47 | C7 |
Num 8 | 48 | C8 |
Num 9 | 49 | C9 |
Print Screen | E0 2A E0 37 | E0 B7 E0 AA |
Scroll Lock | 46 | C6 |
Pause | E1 1D 45 E1 9D C5 | |
Insert | E0 2A E0 52 | E0 D2 E0 AA |
Home | E0 2A E0 47 | E0 C7 E0 AA |
Page Up | E0 2A E0 49 | E0 C9 E0 AA |
Delete | E0 2A E0 53 | E0 D3 E0 AA |
End | E0 2A E0 4F | E0 CF E0 AA |
Page Down | E0 2A E0 51 | E0 D1 E0 AA |
Arrow Up | E0 2A E0 48 | E0 C8 E0 AA |
Arrow Left | E0 2A E0 4B | E0 CB E0 AA |
Arrow Down | E0 2A E0 50 | E0 D0 E0 AA |
Arrow Right | E0 2A E0 4D | E0 CD E0 AA |
Power | E0 5E | E0 DE |
Sleep | E0 5F | E0 DF |
Wake Up | E0 63 | E0 E3 |
Esc | 01 | 81 |
F1 | 3B | BB |
F2 | 3C | BC |
F3 | 3D | BD |
F4 | 3E | BE |
F5 | 3F | BF |
F6 | 40 | C0 |
F7 | 41 | C1 |
F8 | 42 | C2 |
F9 | 43 | C3 |
F10 | 44 | C4 |
F11 | 57 | D7 |
F12 | 58 | D8 |
Tab | 0F | 8F |
Caps Lock | 3A | BA |
Shift Left | 2A | AA |
Shift Right | 36 | B6 |
Ctrl Left | 1D | 9D |
Ctrl Right | E0 1D | E0 9D |
Alt Left | 38 | B8 |
Alt Right | E0 38 | E0 B8 |
Win Left | E0 5B | E0 DB |
Win Right | E0 5C | E0 DC |
Applications | E0 5D | E0 DD |
Space | 39 | B9 |
Enter | 1C | 9C |
Back Space | 0E | 8E |
1 | 02 | 82 |
2 | 03 | 83 |
3 | 04 | 84 |
4 | 05 | 85 |
5 | 06 | 86 |
6 | 07 | 87 |
7 | 08 | 88 |
8 | 09 | 89 |
9 | 0A | 8A |
0B | 8B | |
Q | 10 | 90 |
W | 11 | 91 |
E | 12 | 92 |
R | 13 | 93 |
T | 14 | 94 |
Y | 15 | 95 |
U | 16 | 96 |
I | 17 | 97 |
O | 18 | 98 |
P | 19 | 99 |
A | 1E | 9E |
S | 1F | 9F |
D | 20 | A0 |
F | 21 | A1 |
G | 22 | A2 |
H | 23 | A3 |
J | 24 | A4 |
K | 25 | A5 |
L | 26 | A6 |
Z | 2C | AC |
X | 2D | AD |
C | 2E | AE |
V | 2F | AF |
B | 30 | B0 |
N | 31 | B1 |
M | 32 | B2 |
~ | 29 | A9 |
– | 0C | 8C |
= | 0D | 8D |
2B | AB | |
[ | 1A | 9A |
] | 1B | 9B |
; | 27 | A7 |
“ | 28 | A8 |
< | 33 | B3 |
> | 34 | B4 |
? | 35 | B5 |
ПРИМЕЧАНИЕ Если повнимательнее присмотреться к скан-коду клавиши Pause (E1 1D 45 E1 9D C5), можно заметить, что первые 3 байта являются Make-кодом, а вторые Break-кодом. То есть клавиатура при её нажатии генерирует сразу же и код нажатия и отжатия. В дальнейшем это немного упростит нам жизнь. Если нажать клавишу и удерживать её, то через заданное время, называемое временем автоповтора, скан-код удерживаемой клавиши будет повторяться с частотой автоповтора. При автоповторе дополнительные скан-коды содержат два байта вместо четырех. Например, последовательность байт при удержании и отпускании клавиши Page Up (E0 2A E0 49) выглядит так: E0 2A E0 49 E0 49 E0 49 E0 49 E0 49 E0 49 E0 49 E0 C9 E0 AA. Обратите внимание: при отпускании клавиши с дополнительным кодом последовательность перевёрнута – признак дополнительного кода (E0 AA) идёт в конце, а не в начале. |
Следующие позиции в таблице скан-кодов заняты и однозначно не могут быть использованы другими клавишами (и, соответственно, нами):
- обычные скан-коды: [0x01 – 0x53], [0x57 – 0x58]
- расширенные: [0x1C – 0x1D], 0x35, 0x38, [0x5B – 0x5F], 0x63
- дополнительные: 0x37, [0x47 – 0x49], 0x4B, 0x4D, [0x4F – 0x53]
ПРИМЕЧАНИЕ Всем расширенным скан-кодам предшествует байт 0x0E, а дополнительным – последовательность байт 0xE0, 0x2A, 0xE0. |
Если решать нашу задачу в лоб, то придётся проверять каждый байт, полученный от клавиатуры. А так как байты из набора обычных кодов пересекаются с последними байтами остальных наборов (имеются одинаковые значения), дополнительные коды при отпускании идут перевёрнутыми парами, прерывание возникает столько раз, сколько байт в скан-коде, имеется ещё и Pause, то определить, что именно за клавиша была нажата, становится не очень просто. В конечном итоге все эти аспекты приведут к реализации с кучей неудобоваримых ветвлений.
Честно говоря, даже не представляю, чем руководствовались разработчики, создавая такой беспорядок. В этой статье я сосредоточусь именно на том, как всё это безобразие привести в более простой и красивый вид.
Для информирования о том, что скан-код является расширенным или дополнительным, используются значения 0xE0, 0x2A/0xAA и 0xE1 для Pause. Этот факт однозначно говорит о том, что эти значения также не используются ни одной из клавиш – иначе определить нажатую/отжатую клавишу было бы просто невозможно.
Введём понятие виртуальной клавиши – это номер, определяющий функцию клавиши. Например: Ctrl исполнен в виде двух физических клавиш, но их виртуальный код – один и тот же.
ПРЕДУПРЕЖДЕНИЕ Мои определения виртуальных клавиш несколько отличаются от используемых в Windows, хотя и очень похожи на них. |
Создадим таблицу трансляции скан-кодов в виртуальные клавиши, состоящую из 256 элементов по 2 байта каждый. В первом байте мы будем хранить сам виртуальный код клавиши, а во втором – некоторые атрибуты.
Если бы все коды состояли из одного байта, то по младшим семи разрядам значения этого байта можно было бы однозначно идентифицировать клавишу. Впрочем, для большей части клавиш это условие выполняется, и их преобразование можно свести к такому правилу: обнулить старший разряд, и полученное значение использовать в качестве индекса в таблице трансляции, по которому находится виртуальный код клавиши независимо от того, нажимается она или отжимается.
Поскольку мы обнуляем старший разряд, все значения в промежутке [128 – 255] таблицы трансляции свободны для наших нужд. Виртуальные коды расширенных и дополнительных клавиш мы будем хранить именно в этом диапазоне. Поступим следующим образом: если скан-код является расширенным или дополнительным (Pause пока отбросим), то установим в единицу старший разряд в его последнем байте.
Всё осложняется тем, что за одно прерывание мы получаем лишь один байт скан-кода, и так просто установить старший разряд последнего байта не удастся.
Начнём с рассмотрения дополнительных клавиш. Все они начинаются с байта 0xE0. Модифицируем ранее приведённое правило: если виртуальный код, полученный из таблицы трансляции, равен нулю, то виртуальный код не готов и скан-код ещё не принят полностью. Отбросив старший разряд у 0xE0, мы получим значение 0x60 (которое также не используется ни одной клавишей), которое можно использовать в качестве индекса, по которому будет храниться значение 0.
При обработке следующего прерывания мы получим последний байт скан-кода, у которого и должны установить старший разряд. Проще всего это сделать, модифицировав правило преобразования. Вспомним о том, что у нас имеется ещё и байт атрибутов в таблице, который до сих пор никак не задействован.
Новое правило будет выглядеть так: при каждом получении значения из таблицы будем сохранять его в переменной, а при формировании индекса будем использовать какой-либо разряд байта атрибутов, отражающий, что необходимо изменить старший разряд полученного байта.
Теперь определимся, какой разряд мы будем использовать, и как с его помощью получать индекс. Как я уже сказал, нам необходимо установить самый старший бит. Получается всё очень просто и красиво: старший бит атрибутов, взятый из переменной, переносится в старший разряд полученного байта.
Давайте разберём всё вышеизложенное на примере клавиши Ctrl Right (E0 1D):
Назовём переменную, которая должна хранить байт виртуального кода и байт атрибутов, KeyInfo. Инициализируем ее значением 0. Первый получаемый байт имеет значение 0xE0. Обнуляем старший разряд и получаем 0x60. Берём старший разряд байта атрибутов из переменной KeyInfo и переносим его в старший разряд полученного индекса: (0xE0 & 0x7F)
| ((KeyInfo >> 8) & 0x80). В итоге получаем индекс 0x60, по которому в таблице будет храниться виртуальный код с нулевым значением и байт атрибутов с установленным старшим разрядом: KeyInfo = 0x8000. Следующий байт в последовательности 0x1D:
Едем дальше – на очереди дополнительные коды. Отличаются они лишь тем, что первые 2 байта имеют значение 0xE0, 0x2A. Самый простой способ их приёма даже не потребует изменений правила получения индекса. После получения 0xE0 байт 0x2A превратится в индекс 0xAA, по которому будем хранить значение 0, указывающее на то, что виртуальный код не готов, и модифицировать старший разряд следующего байта не нужно (как будто бы этой последовательности и вовсе не было). Следующие 2 байта последовательности ничем не отличаются от расширенного скан-кода, и для их приёма уже всё готово.
ПРИМЕЧАНИЕ Всё вышеизложенное прекрасно работает при получении 2 байт вместо 4 при автоповторе и обратном порядке следования пар при отпускании. Причём при отпускании первые 2 байта дадут виртуальный код отжатой клавиши, а последние 2 (E0 AA) будут преобразованы в 0x0000 (проигнорированы). |
Но как вы уже, наверное, забыли, мы отбросили клавишу Pause (E1 1D 45) – давайте теперь разберёмся и с ней. Если пойти по предыдущему пути, и по индексу 0x61 (0xE1 & 0x7F) хранить значение 0x8000, то мы получим коллизию, связанную с правым Ctrl’ом (E0 1D).
Что же нам в этом случае делать? Ну что ж, будем в очередной раз модифицировать наше правило получения индекса: посмотрим на двоичное представление числа 0x1D – 0001 1101. Чтоб не возникло коллизий, можно, например, модифицировать 5-й, 6-й, или оба разряда вместе, или 7-й и 1-й, но раз уж мы начали модифицировать старшие разряды, то давайте продолжим.
Новое правило получения индекса будет таким: (Value & 0x7F) | ((KeyInfo >> 8) & 0xC0). Но на этом наши мучения с клавишей Pause не закончились. По индексу 0x61 будем хранить значение KeyInfo = 0x4000 (не 0xC000, чтоб не возникло коллизии с Applications (E0 5D)), и, следуя новому правилу, получим: (1D & 0x7F)
| ((KeyInfo >> 8) & 0xC0) == 0x5D. Но, поскольку код Pause состоит из трёх байт, то по этому индексу тоже должен быть какой-то модификатор – и о благо: если взять 0x8000, то никаких коллизий не возникнет, и по индексу 0xC5 будет находиться виртуальный код Pause.
ПРИМЕЧАНИЕ Несмотря на то, что KeyInfo изменяется после каждого принятого байта, никаких проблем при приёме следующего скан-кода не возникнет, так как для модификации принятого байта используется только байт атрибутов. Если конечный индекс получен, то по нему в таблице модифицирующие разряды отсутствуют (сброшены в ноль) и уже неважно, что находится в первом байте KeyInfo. |
Таблица трансляции:
Key | Index (HEX) | Virtual Key | Attribute | Comment |
---|---|---|---|---|
00 | VK_UNKNOWN | |||
Esc | 01 | VK_ESCAPE | ||
1 | 02 | VK_1 | ||
2 | 03 | VK_2 | ||
3 | 04 | VK_3 | ||
4 | 05 | VK_4 | ||
5 | 06 | VK_5 | ||
6 | 07 | VK_6 | ||
7 | 08 | VK_7 | ||
8 | 09 | VK_8 | ||
9 | 0A | VK_9 | ||
0B | VK_0 | |||
– | 0C | VK_OEM_MINUS | ||
= | 0D | VK_OEM_PLUS | ||
Back Space | 0E | VK_BACK | ||
Tab | 0F | VK_TAB | ||
Q | 10 | VK_Q | ||
W | 11 | VK_W | ||
E | 12 | VK_E | ||
R | 13 | VK_R | ||
T | 14 | VK_T | ||
Y | 15 | VK_Y | ||
U | 16 | VK_U | ||
I | 17 | VK_I | ||
O | 18 | VK_O | ||
P | 19 | VK_P | ||
[ | 1A | VK_OEM_4 | ||
] | 1B | VK_OEM_6 | ||
Enter | 1C | VK_RETURN | ||
Ctrl Left | 1D | VK_CONTROL | ||
A | 1E | VK_A | ||
S | 1F | VK_S | ||
D | 20 | VK_D | ||
F | 21 | VK_F | ||
G | 22 | VK_G | ||
H | 23 | VK_H | ||
J | 24 | VK_J | ||
K | 25 | VK_K | ||
L | 26 | VK_L | ||
; | 27 | VK_OEM_1 | ||
“ | 28 | VK_OEM_7 | ||
~ | 29 | VK_OEM_3 | ||
Shift Left | 2A | VK_SHIFT | ||
2B | VK_OEM_5 | |||
Z | 2C | VK_Z | ||
X | 2D | VK_X | ||
C | 2E | VK_C | ||
V | 2F | VK_V | ||
B | 30 | VK_B | ||
N | 31 | VK_N | ||
M | 32 | VK_M | ||
< | 33 | VK_OEM_COMMA | ||
> | 34 | VK_OEM_PERIOD | ||
? | 35 | VK_OEM_2 | ||
Shift Right | 36 | VK_SHIFT | RIGHT | |
Num Multiply | 37 | VK_MULTIPLY | ||
Alt Left | 38 | VK_MENU | ||
Space | 39 | VK_SPACE | ||
Caps Lock | 3A | VK_CAPITAL | ||
F1 | 3B | VK_F1 | ||
F2 | 3C | VK_F2 | ||
F3 | 3D | VK_F3 | ||
F4 | 3E | VK_F4 | ||
F5 | 3F | VK_F5 | ||
F6 | 40 | VK_F6 | ||
F7 | 41 | VK_F7 | ||
F8 | 42 | VK_F8 | ||
F9 | 43 | VK_F9 | ||
F10 | 44 | VK_F10 | ||
Num Lock | 45 | VK_NUMLOCK | ||
Scroll Lock | 46 | VK_SCROLL | ||
Num 7 | 47 | VK_NUMPAD7 | ||
Num 8 | 48 | VK_NUMPAD8 | ||
Num 9 | 49 | VK_NUMPAD9 | ||
Num Minus | 4A | VK_SUBTRACT | ||
Num 4 | 4B | VK_NUMPAD4 | ||
Num 5 | 4C | VK_NUMPAD5 | ||
Num 6 | 4D | VK_NUMPAD6 | ||
Num Plus | 4E | VK_ADD | ||
Num 1 | 4F | VK_NUMPAD1 | ||
Num 2 | 50 | VK_NUMPAD2 | ||
Num 3 | 51 | VK_NUMPAD3 | ||
Num 0 | 52 | VK_NUMPAD0 | ||
Num Dot | 53 | VK_DECIMAL | ||
54 | VK_UNKNOWN | |||
55 | VK_UNKNOWN | |||
56 | VK_UNKNOWN | |||
F11 | 57 | VK_F11 | ||
F12 | 58 | VK_F12 | ||
59 | VK_UNKNOWN | |||
5A | VK_UNKNOWN | |||
5B | VK_UNKNOWN | |||
5C | VK_UNKNOWN | |||
5D | EXTEND | Pause (E1 1D) | ||
5E | VK_UNKNOWN | |||
5F | VK_UNKNOWN | |||
60 | EXTEND | Extended (E0) | ||
61 | PAUSE_EXTEND | Pause (E1) | ||
62 | VK_UNKNOWN | |||
63 | VK_UNKNOWN | |||
64 | VK_UNKNOWN | |||
65 | VK_UNKNOWN | |||
66 | VK_UNKNOWN | |||
67 | VK_UNKNOWN | |||
68 | VK_UNKNOWN | |||
69 | VK_UNKNOWN | |||
6A | VK_UNKNOWN | |||
6B | VK_UNKNOWN | |||
6C | VK_UNKNOWN | |||
6D | VK_UNKNOWN | |||
6E | VK_UNKNOWN | |||
6F | VK_UNKNOWN | |||
70 | VK_UNKNOWN | |||
71 | VK_UNKNOWN | |||
72 | VK_UNKNOWN | |||
73 | VK_UNKNOWN | |||
74 | VK_UNKNOWN | |||
75 | VK_UNKNOWN | |||
76 | VK_UNKNOWN | |||
77 | VK_UNKNOWN | |||
78 | VK_UNKNOWN | |||
79 | VK_UNKNOWN | |||
7A | Acknowledge (FA) | |||
7B | VK_UNKNOWN | |||
7C | VK_UNKNOWN | |||
7D | VK_UNKNOWN | |||
7E | VK_UNKNOWN | |||
7F | VK_UNKNOWN | |||
80 | VK_UNKNOWN | |||
81 | VK_UNKNOWN | |||
82 | VK_UNKNOWN | |||
83 | VK_UNKNOWN | |||
84 | VK_UNKNOWN | |||
85 | VK_UNKNOWN | |||
86 | VK_UNKNOWN | |||
87 | VK_UNKNOWN | |||
88 | VK_UNKNOWN | |||
89 | VK_UNKNOWN | |||
8A | VK_UNKNOWN | |||
8B | VK_UNKNOWN | |||
8C | VK_UNKNOWN | |||
8D | VK_UNKNOWN | |||
8E | VK_UNKNOWN | |||
8F | VK_UNKNOWN | |||
90 | VK_UNKNOWN | |||
91 | VK_UNKNOWN | |||
92 | VK_UNKNOWN | |||
93 | VK_UNKNOWN | |||
94 | VK_UNKNOWN | |||
95 | VK_UNKNOWN | |||
96 | VK_UNKNOWN | |||
97 | VK_UNKNOWN | |||
98 | VK_UNKNOWN | |||
99 | VK_UNKNOWN | |||
9A | VK_UNKNOWN | |||
9B | VK_UNKNOWN | |||
Num Enter | 9C | VK_RETURN | RIGHT | |
Ctrl Right | 9D | VK_CONTROL | RIGHT | |
9E | VK_UNKNOWN | |||
9F | VK_UNKNOWN | |||
A0 | VK_UNKNOWN | |||
A1 | VK_UNKNOWN | |||
A2 | VK_UNKNOWN | |||
A3 | VK_UNKNOWN | |||
A4 | VK_UNKNOWN | |||
A5 | VK_UNKNOWN | |||
A6 | VK_UNKNOWN | |||
A7 | VK_UNKNOWN | |||
A8 | VK_UNKNOWN | |||
A9 | VK_UNKNOWN | |||
AA | Additional (E0 2A) | |||
AB | VK_UNKNOWN | |||
AC | VK_UNKNOWN | |||
AD | VK_UNKNOWN | |||
AE | VK_UNKNOWN | |||
AF | VK_UNKNOWN | |||
B0 | VK_UNKNOWN | |||
B1 | VK_UNKNOWN | |||
B2 | VK_UNKNOWN | |||
B3 | VK_UNKNOWN | |||
B4 | VK_UNKNOWN | |||
Num Divide | B5 | VK_DIVIDE | ||
B6 | VK_UNKNOWN | |||
Print Screen | B7 | VK_SNAPSHOT | ||
Alt Right | B8 | VK_MENU | RIGHT | |
B9 | VK_UNKNOWN | |||
BA | VK_UNKNOWN | |||
BB | VK_UNKNOWN | |||
BC | VK_UNKNOWN | |||
BD | VK_UNKNOWN | |||
BE | VK_UNKNOWN | |||
BF | VK_UNKNOWN | |||
C0 | VK_UNKNOWN | |||
C1 | VK_UNKNOWN | |||
C2 | VK_UNKNOWN | |||
C3 | VK_UNKNOWN | |||
C4 | VK_UNKNOWN | |||
Pause | C5 | VK_PAUSE | ||
C6 | VK_UNKNOWN | |||
Home | C7 | VK_HOME | ||
Arrow Up | C8 | VK_UP | ||
Page Up | C9 | VK_PRIOR | ||
CA | VK_UNKNOWN | |||
Arrow Left | CB | VK_LEFT | ||
CC | VK_UNKNOWN | |||
Arrow Right | CD | VK_RIGHT | ||
CE | VK_UNKNOWN | |||
End | CF | VK_END | ||
Arrow Down | D0 | VK_DOWN | ||
Page Down | D1 | VK_NEXT | ||
Insert | D2 | VK_INSERT | ||
Delete | D3 | VK_DELETE | ||
D4 | VK_UNKNOWN | |||
D5 | VK_UNKNOWN | |||
D6 | VK_UNKNOWN | |||
D7 | VK_UNKNOWN | |||
D8 | VK_UNKNOWN | |||
D9 | VK_UNKNOWN | |||
DA | VK_UNKNOWN | |||
Win Left | DB | VK_WIN | ||
Win Right | DC | VK_WIN | RIGHT | |
Applications | DD | VK_APPS | ||
Power | DE | VK_POWER | ||
Sleep | DF | VK_SLEEP | ||
E0 | VK_UNKNOWN | |||
E1 | VK_UNKNOWN | |||
E2 | VK_UNKNOWN | |||
Wake Up | E3 | VK_WAKEUP | ||
E4 | VK_UNKNOWN | |||
E5 | VK_UNKNOWN | |||
E6 | VK_UNKNOWN | |||
E7 | VK_UNKNOWN | |||
E8 | VK_UNKNOWN | |||
E9 | VK_UNKNOWN | |||
EA | VK_UNKNOWN | |||
EB | VK_UNKNOWN | |||
EC | VK_UNKNOWN | |||
ED | VK_UNKNOWN | |||
EE | VK_UNKNOWN | |||
EF | VK_UNKNOWN | |||
F0 | VK_UNKNOWN | |||
F1 | VK_UNKNOWN | |||
F2 | VK_UNKNOWN | |||
F3 | VK_UNKNOWN | |||
F4 | VK_UNKNOWN | |||
F5 | VK_UNKNOWN | |||
F6 | VK_UNKNOWN | |||
F7 | VK_UNKNOWN | |||
F8 | VK_UNKNOWN | |||
F9 | VK_UNKNOWN | |||
FA | VK_UNKNOWN | |||
FB | VK_UNKNOWN | |||
FC | VK_UNKNOWN | |||
FD | VK_UNKNOWN | |||
FE | VK_UNKNOWN | |||
FF | VK_UNKNOWN |
ПРЕДУПРЕЖДЕНИЕ По индексу 0x7A хранится нулевое значение для игнорирования ответа от клавиатуры при приёме команды, но это не единственный возможный ответ, и все их при помощи данной таблицы игнорировать не удастся. Но эта задача решается крайне просто, например, при посылке команды можно отключить прерывания вообще и работать по опросу, или завести переменную, указывающую на то, что была послана команда, и трансляцию скан-кодов использовать не нужно. |
С трансляцией мы полностью разобрались, теперь давайте задействуем ещё некоторые разряды байта атрибутов. Например, будем хранить в 0-м разряде признак отпускания клавиши – при отжатии он будет устанавливаться в единицу. Как я уже говорил, виртуальный код определяет именно функцию клавиши, а не её физическое расположение. Но представьте, что эта информация может понадобиться, 1-й разряд будет признаком того, что клавиша является правой.
В тестовом примере реализован обработчик клавиатурного прерывания (работы с командами нет), который при нажатии или отпускании клавиши выводит информацию о том, что и с какой клавишей произошло.
СОВЕТ Определения самих таблиц вынесены в отдельные файлы (TrnslTbl.inc, NamesTbl.inc) в которых присутствуют только сами объявления, вследствие чего упрощается их модификация, например, если нам понадобится изменить значение кода 0xFE, то мы просто перейдём на строку 255 и сделаем необходимые изменения. |
P. S. Конструктивная критика, исправления и дополнения крайне приветствуются.
Удаление приложения в параметрах системы
Первый метод реализуется через параметры системы.
- Нажимаем правой кнопкой мыши по значку меню Пуск (либо используем сочетание клавиш Win X) и выбираем пункт “Параметры”. Также можно воспользоваться горячими клавишами Win I.
- Откроется окно с параметрами, в котором кликаем по разделу “Приложения”.
- В новом окне в перечне слева щелкаем по подразделу “Приложения и возможности”, после чего в правой части окна отобразится список установленных на компьютере программ. Все, что остается сделать – это выбрать ненужную и нажать на кнопку “Удалить”.
- После подтверждения действия нажатием на еще одну появившуюся кнопку “Удалить”, приложение будет удалено из системы.
Однако, для многих встроенных в “десятку” приложений подобная кнопка будет неактивна, а это значит, что так просто их удалить нельзя.
В таких случаях придется воспользоваться другим способом.
Кстати, вероятно, для некоторых пользователей привычнее и удобнее будет удалять программы через Панель управления, в разделе “Программы и компоненты”.
Здесь все представлено в более привычном виде, к которому мы уже привыкли, работая в более ранних версиях ОС.