2010-03-26 7 views
0

Я работаю с приложением WPF, отправляющим ключи к игре. Я открыл spy ++ для наблюдателей как ключевое нажатие на клавиатуре. Затем я нажимаю свою кнопку на приложении, и я заметил другой код сканирования в сообщениях spy ++. Может ли это быть чем-то связанным с Windows 7 64bit? Частичный список:Код сканирования SendInput в Windows 7 x64

var down = new INPUT(); 
down.Type = (UInt32)InputType.KEYBOARD; 
down.Data.Keyboard = new KEYBDINPUT(); 
down.Data.Keyboard.Vk = (UInt16)keyCode; 
down.Data.Keyboard.Scan = 0; 
down.Data.Keyboard.Flags = 0; 
down.Data.Keyboard.Time = 0; 
down.Data.Keyboard.ExtraInfo = IntPtr.Zero; 
//down.Data.Keyboard.ExtraInfo = GetMessageExtraInfo(); 

var up = new INPUT(); 
up.Type = (UInt32)InputType.KEYBOARD; 
up.Data.Keyboard = new KEYBDINPUT(); 
up.Data.Keyboard.Vk = (UInt16)keyCode; 
up.Data.Keyboard.Scan = 0; 
up.Data.Keyboard.Flags = (UInt32)KeyboardFlag.KEYUP; 
up.Data.Keyboard.Time = 0; 
up.Data.Keyboard.ExtraInfo = IntPtr.Zero; 
//up.Data.Keyboard.ExtraInfo = GetMessageExtraInfo(); 

INPUT[] inputList = new INPUT[2]; 
inputList[0] = down; 
inputList[1] = up; 

var numberOfSuccessfulSimulatedInputs = SendInput(2, inputList, Marshal.SizeOf(typeof(INPUT))); 

Изображение показывает, когда я использую мой код, чтобы отправить ключ я получаю Scancode: 00fExtended от выхода Шпион ++ сообщений. Когда я на самом деле нажимаю ту же клавишу, я получаю ScanCode: 1FfExtended. Все остальное идентично.

http://spilmansoftware.com/images/scancode.gif http://spilmansoftware.com/images/scancode.gif

ответ

0

Согласно документации MSDN для WM_KEYDOWN, скан значение кода зависит от OEM.

В частности, возможно, что ваша клавиатура не является английской/американской американской клавиатурой. Или вы можете включить любые нестандартные ключи переключения (например, F Lock). Играйте с ними и посмотрите, не изменится ли их изменение на код сканирования.

1

Вам нужно мысленно поставить пробел между 00 и fExtended, фактическая фраза «скан: 00», а затем «fExtended: 0»

Это скан-код является 0 неудивителен, вы установите его до 0 в коде:

down.Data.Keyboard.Scan = 0; 

Это не должно вызывать тревогу, скан-код используется только тогда, когда виртуальная клавиша неоднозначна. Например, левый и правый клавиши Shift. Вы можете использовать MapVirtualKey(), если хотите.

+0

Хороший улов! Спасибо. – Stanomatic