Низкоуровневые манипуляторы клавиатуры / мыши, предоставленные SetWindowsHookEx()
, сообщают, если вход был сгенерирован реальными устройствами или введен в код приложения.
Для параметра low -level hook , хук обеспечивает указатель на структуру KBDLLHOOKSTRUCT
, которая имеет член flags
, который содержит флагов LLKHF_INJECTED
для поддельного ввода.
Для низкоуровневого мышиного крюка , крючок предоставляет указатель на структуру MSLLHOOKSTRUCT
, которая имеет член flags
, который содержит либо LLMHF_INJECTED
] или LLMHF_LOWER_IL_INJECTED
для фальшивого ввода.
Любой крючок может вернуть ненулевое значение, чтобы заблокировать ввод от остальных цепочек крюка и, следовательно, к целевому окну.
Что касается API исходного входа, в соответствии с ( более старая версия 1) документация для функции GetRawInputDeviceInfo()
:
hDevice [in, optional] Тип: HANDLE
Ручка для исходного устройства ввода. Это происходит из lParam сообщения WM_INPUT, из члена hDevice из RAWINPUTHEADER или из GetRawInputDeviceList. Он также может быть NULL, если приложение вставляет входные данные, например, с помощью SendInput.
blockquote>1: выделенная заметка была удалена в текущей версии документации, я не знаю почему.
Таким образом,
hDevice
, который сообщается сообщениемWM_INPUT
, будет NULL для поддельного ввода.однако, это не возможно заблокировать ввод с помощью API Raw Input. Для этого вам нужен хук низкого уровня.
For radices above 10, the letters of the alphabet indicate numerals greater than 9. For example, for hexadecimal numbers (base 16), A through F are used.
В вашей строке dsff66
d
- это шестнадцатеричный символ (даже если строка не шестнадцатеричная), которая соответствует типу radix и эквивалентна числу 13
. После этого он прекращает синтаксический анализ, поскольку следующий символ не является шестнадцатеричным, а следовательно, и результатом.
parseInt
считывает ввод, пока не встретит недопустимый символ, а затем использует любой действительный ввод, прочитанный до этого недопустимого символа. Рассмотрим:
parseInt("17days", 10);
Это будет использовать вход 17
и пропустить все после недействительного d
.
Из спецификации ECMAScript :
Если [входная строка] S содержит какой-либо символ, который не является цифрой радикс-R, то пусть Z [строка будет целым числом -ified] - подстрока в S, состоящая из всех символов перед первым таким символом ; в противном случае пусть Z будет S.
В вашем примере s
является недопустимым символом base-16, поэтому parseInt
использует только начальный d
.
Что касается , почему это поведение было включено: нет способа узнать наверняка, но вполне вероятно, что это попытка воспроизвести поведение strtol
(от строки к длинной ) из стандартной библиотеки C. Со страницы руководства strtol(3)
:
... строка преобразуется в длинное значение int очевидным образом, останавливаясь на первом символе, который является недопустимая цифра в данной базе .
Эта связь далее поддерживается (до некоторой степени) тем фактом, что оба parseInt
и strtol
определены, чтобы игнорировать начальные пробелы, и они оба могут принять ведущий 0x
для шестнадцатеричных значений.