亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vktochar.cpp

?? EP9315 BSP for WinCE 源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

	@doc	EXTERNAL DRIVERS

	@module	vkremap.cpp |

This file implements the character generation part of the platform
independent code of the keyboard driver.  This is provided as a sample to
platform driver writers.  Note that most of the tables are UINT8 in order to
save space.  Returning Unicode characters > 255 will require UINT16 tables.

*/

#include <windows.h>
#include <memory.h>
#include <nkintr.h>
#include <keybddr.h>
#include <keybdpdd.h>


#define C_VIRTUAL_KEYS     			256

//	Languages besides English may return more than one character.
//	It is usually a dead char and another character.
#define MAX_TO_UNICODE_CHARACTERS	2

#define VK_0	0x30
#define VK_9	0x39

#define VK_A	0x41
#define VK_F	0x46

#define VK_X	0x58




//      @doc    EXTERNAL DRIVERS
/*      @struct TO_UNICODE_STATE |

State info needed by the driver to convert virtual keys to Unicode.

@xref
	<tab><f KeybdDriverGetDeviceInfo><nl>
	<tab><f KeybdDriverInitStates><nl>
	<tab><f KeybdDriverVKeyToUnicode><nl>


@comm This struct would be used by the driver to maintain any state
information needed between key events in order to generate Unicode
characters from virtual keys.

@comm This structure is not visible outside of the driver.  The driver
provides information on its size via the <f KeybdDriverGetDeviceInfo>
function.  The input system allocates a buffer for the structure and
passes it in when it calls <f KeybdDriverVKeyToUnicode>.

@comm In the sample driver code, it is used to convert Alt+Num keys to a
unicode character.

*/

#define C_ALT_NUM_VK	5

struct TO_UNICODE_STATE
	{
	BOOL			bAltNumAltDownTransition;
	BOOL			bAltNumInProgress;
	BOOL			bAltNumHex;
	int				cAltNumVk;
	unsigned int	vkAltNum[C_ALT_NUM_VK];
	};



void
VKeyToUnicodeInfo(
	KBDI_VKEY_TO_UNICODE_INFO *pInfo
	)
{
	pInfo -> cbToUnicodeState = sizeof(TO_UNICODE_STATE);
	pInfo -> cMaxToUnicodeCharacters = MAX_TO_UNICODE_CHARACTERS;
	return;
}



BOOL
AltNumOkToStart(
	KEY_STATE_FLAGS	ShiftFlags
	)
{
	if ( ShiftFlags & ( KeyShiftAnyCtrlFlag		|
						KeyShiftLeftWinFlag		|
						KeyShiftRightWinFlag	|
						KeyShiftAnyShiftFlag ) )
		return FALSE;
	return TRUE;
}





BOOL
AltNumKeyEvent(
	UINT32				VirtualKey,
	KEY_STATE_FLAGS		KeyEvent,
	TO_UNICODE_STATE    *pToUnicodeState,
	KEY_STATE_FLAGS		*pShiftFlags,
	UINT32				*pCharacterBuffer
	)
{
	KEY_STATE_FLAGS	ShiftFlags = *pShiftFlags;
	BOOL			bGeneratedCharacter = FALSE;
	UINT32			chGenerated;
	unsigned int	uiBase;
	int				i;
	UINT32			vk;



	if ( VirtualKey == VK_MENU )
		{
		if ( KeyEvent & KeyStateDownFlag )
			{
			//	Down transition with no other keys?
			if ( !( KeyEvent & KeyStatePrevDownFlag ) &&
				  ( AltNumOkToStart(ShiftFlags) ) )
				{
				//	Now armed to looked for number keys.
				pToUnicodeState -> bAltNumAltDownTransition = TRUE;
				pToUnicodeState -> bAltNumInProgress = FALSE;
				pToUnicodeState -> bAltNumHex = FALSE;
				pToUnicodeState -> cAltNumVk = 0;
				}
			}
		else	//	Alt key up
			{
			pToUnicodeState -> bAltNumAltDownTransition = FALSE;
			if ( pToUnicodeState -> bAltNumInProgress )
				{
				pToUnicodeState -> bAltNumInProgress = FALSE;
				if ( pToUnicodeState -> cAltNumVk > 1 )
					{
					chGenerated = 0;
					if ( pToUnicodeState -> bAltNumHex )
						{
						uiBase = 16;
						}
					else
						{
						uiBase = 10;
						}

					for ( i = 0;
							i < pToUnicodeState -> cAltNumVk;
								i++ )
						{
						vk = pToUnicodeState -> vkAltNum[i];
						if ( ( vk >= VK_0 ) && ( vk <= VK_9 ) )
							{
							vk -= VK_0;
							}
						else if ( pToUnicodeState -> bAltNumHex &&
								  ( ( vk >= VK_A ) && ( vk <= VK_F ) ) )
							{
							vk -= VK_A;
							vk += 10;
							}
						else
							{
							break;	//	bad character
							}
						chGenerated *= uiBase;
						chGenerated += vk;
						}
					bGeneratedCharacter = TRUE;
					*pCharacterBuffer = chGenerated;
					}
				else
					{
					//	Alt+N app startup here.
					}
				}
			}
		}
	else if ( ( pToUnicodeState -> bAltNumAltDownTransition ) &&
			  ( KeyEvent & KeyStateDownFlag ) )
		{
		if ( ( VirtualKey >= VK_0 ) && ( VirtualKey <= VK_9 ) )
			{
			//	We were armed to look for number keys and we found one, so now we
			//	are actually in progress.
			pToUnicodeState -> bAltNumInProgress = TRUE;
			if ( pToUnicodeState -> cAltNumVk < C_ALT_NUM_VK )
				{
				pToUnicodeState -> vkAltNum[pToUnicodeState -> cAltNumVk++] = VirtualKey;
				}
			}
		else if ( ( pToUnicodeState -> bAltNumHex ) &&
				  ( ( VirtualKey >= VK_A ) && ( VirtualKey <= VK_F ) ) )
			{
			//	Hex characters are split out separately for convenience in case the design changes.
			pToUnicodeState -> bAltNumInProgress = TRUE;
			if ( pToUnicodeState -> cAltNumVk < C_ALT_NUM_VK )
				{
				pToUnicodeState -> vkAltNum[pToUnicodeState -> cAltNumVk++] = VirtualKey;
				}
			}
		else if ( ( pToUnicodeState -> bAltNumInProgress ) &&
				  ( VirtualKey == VK_X ) )
			{
			pToUnicodeState -> bAltNumHex = TRUE;
			}
		else if ( pToUnicodeState -> bAltNumInProgress )
			{
			//	If we are in progress, ignore unknown keys.
			}
		else
			{
			//	If we see a key we can't handle when not in progress, disarm
			pToUnicodeState -> bAltNumAltDownTransition = FALSE;
			}
		}


	if ( pToUnicodeState -> bAltNumInProgress )
		{
		ShiftFlags |= KeyShiftUseVKNullFlag | KeyShiftNoCharacterFlag;
		}

	*pShiftFlags = ShiftFlags;
	return pToUnicodeState -> bAltNumInProgress || bGeneratedCharacter;

}



extern "C"
//      @doc EXTERNAL DRIVERS
/*      @func

Initializes the virtual key state and driver specific state.

@xref

	<tab><t KEY_STATE><nl>
	<tab><t TO_UNICODE_STATE><nl>
	<tab><f KeybdDriverGetInfo><nl>
	<tab><c KBDI_VKEY_TO_UNICODE_INFO_ID><nl>
	<tab><t KBDI_VKEY_TO_UNICODE_INFO><nl>

@comm After calling <f KeybdDriverGetInfo> and allocating its required
memory, the input system calls this function to allow the driver to
initialize the memory.

@comm The pKeybdDriverToUnicodeState is a pointer to a piece of memory of
at least cbToUnicodeState bytes as reported by the <f KeybdDriverGetInfo>
function in the <t KBDI_VKEY_TO_UNICODE_INFO> structure.  If
cbToUnicodeState was reported as 0, this parameter may be NULL.

@comm This function must be re-entrant since it is exposed by the input
system via the <f KeybdInitStates> function and may be called by multiple
threads.

*/
BOOL KeybdDriverInitStates(
	INT			iKeybdId,						// @parm Id of the keyboard to initialize keystate data for.
	KEY_STATE   KeyState,                       // @parm Key state to initialize.
	void        *pKeybdDeviceToUnicodeState     // @parm Keyboard specific state to initialize.
	)
{
	TO_UNICODE_STATE	*pDemoState = (TO_UNICODE_STATE*)pKeybdDeviceToUnicodeState;
	int	i;

	//	We have some state, so check for it.
	if ( pDemoState == NULL )
		{
		SetLastError(ERROR_INVALID_PARAMETER);
		return FALSE;
		}

	for ( i = 0; i < COUNT_VKEYS; i++ )
		{
		KeyState[i] = 0;
		}

	return TRUE;
}
#ifdef DEBUG
PFN_KEYBD_DRIVER_INIT_STATES v_pfnInitStatesTest = KeybdDriverInitStates;
#endif




/*++

MapLRVKeys:

Map left and right virtual keys to their common vkey.


Return Value:

The common vkey.

--*/
UINT32
MapLRVKeys(
	UINT32	vkey
	)
{
	if ( ( vkey == VK_LCONTROL ) ||
		 ( vkey == VK_RCONTROL ) )
		return VK_CONTROL;

	if ( ( vkey == VK_LMENU ) ||
		 ( vkey == VK_RMENU ) )
		return VK_MENU;

	if ( ( vkey == VK_LSHIFT ) ||
		 ( vkey == VK_RSHIFT ) )
		return VK_SHIFT;

//	VK_LWIN and VK_RWIN do not have a merged key.

	return vkey;
}





/*++

NewKeyStateFlags:

Figure out the new key state flags based on the current state and the
event.


Return Value:

The new flag settings.

--*/
UINT32
NewKeyStateFlags(
	KEY_STATE_FLAGS CurrentState,
	KEY_STATE_FLAGS KeyEventFlags
	)
{
//	Just interested in down/up flag.
	KeyEventFlags &= KeyStateDownFlag;

//	First update the key state for the specific key.
//	Remember the previous state.
	if ( KeyStateIsDown(CurrentState) )
		CurrentState |= KeyStatePrevDownFlag;
	else
		CurrentState &= ~KeyStatePrevDownFlag;

//	Set the new state.
	if ( KeyEventFlags )
		CurrentState |= KeyStateDownFlag | KeyStateGetAsyncDownFlag;
	else
		CurrentState &= ~KeyStateDownFlag;

//	Toggle flag only changes on down transition, not auto repeat.
	if ( KeyStateIsDownTransition(CurrentState) )
		CurrentState ^= KeyStateToggledFlag;

	return CurrentState;
}


/*++

KeybdDriverKeyStateToShiftFlags:

Collapse the shift state from a given key state array into a single
element.


Notes:

For the given virtual key, the current flags from the key state array are
put into the low bits of the output flags.


--*/
void
KeybdDriverKeyStateToShiftFlags(
	KEY_STATE       KeyState,           // Key state array.
	UINT32          VKey,               // Virtual key.
	KEY_STATE_FLAGS *pShiftStateFlags   // Location to put collapsed shift state.
	)
{
	KEY_STATE_FLAGS ShiftFlags = 0;

//  Add the standard keys.
	if ( KeyStateIsDown(KeyState[VK_CONTROL]) )
		{
		ShiftFlags |= KeyShiftAnyCtrlFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_LCONTROL]) )
		{
		ShiftFlags |= KeyShiftLeftCtrlFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_RCONTROL]) )
		{
		ShiftFlags |= KeyShiftRightCtrlFlag;
		}


	if ( KeyStateIsDown(KeyState[VK_SHIFT]) )
		{
		ShiftFlags |= KeyShiftAnyShiftFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_LSHIFT]) )
		{
		ShiftFlags |= KeyShiftLeftShiftFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_RSHIFT]) )
		{
		ShiftFlags |= KeyShiftRightShiftFlag;
		}


	if ( KeyStateIsDown(KeyState[VK_MENU]) )
		{
		ShiftFlags |= KeyShiftAnyAltFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_LMENU]) )
		{
		ShiftFlags |= KeyShiftLeftAltFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_RMENU]) )
		{
		ShiftFlags |= KeyShiftRightAltFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_LWIN]) )
		{
		ShiftFlags |= KeyShiftLeftWinFlag;
		}

	if ( KeyStateIsDown(KeyState[VK_RWIN]) )
		{
		ShiftFlags |= KeyShiftRightWinFlag;
		}

	if ( KeyStateIsToggled(KeyState[VK_CAPITAL]) )
		ShiftFlags |= KeyShiftCapitalFlag;

//  Set the low order bits to reflect the current key.
	*pShiftStateFlags = ShiftFlags | KeyState[VKey];
	return;
}






/*
   The following defines will be used for converting the key pressed
   into a Unicode character using the context information (the state
   of other keys). We are assuming here that the count of bytes required
   for state info for Unicode character generation (cbToUnicodeState
   field in KEYBD_DRIVER_INFO structure) is zero, ie the driver does
   not maintain any state information (besides CAPS, SHIFT, ALT and
   CONTROL state) for Unicode character generation.
   The Unicode character generated depends on the key pressed and
   the state of the following keys: CAPS, SHIFT, ALT and CONTROL. Hence
   for every Virtual key generated by  the PDD, there can be a total of
   16 different Unicode Characters  in the worst case. Since there are
   a total of 256 different virtual keys  possible, storing all possible
   states would require a lot of memory. Hence rows which are together
   have been grouped and columns which have the same corresponding values
   in every row of the group have been merged together to minimise storage.
   */

#define NO_CHAR         255
#define FIRST_COLUMN    0
#define SECOND_COLUMN   1
#define THIRD_COLUMN    2
#define FOURTH_COLUMN   3

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品bt天堂精选| 99国产精品久久| 3d成人h动漫网站入口| 午夜免费久久看| 欧美一区午夜精品| 青草国产精品久久久久久| 日韩欧美第一区| 国产在线看一区| 一区二区在线观看视频| 在线观看www91| 婷婷夜色潮精品综合在线| 日韩午夜激情av| 国产精品一区二区果冻传媒| 国产精品全国免费观看高清| 91极品视觉盛宴| 蜜臀av一区二区| 中文字幕高清一区| 欧美色图激情小说| 麻豆91在线观看| 国产精品高潮呻吟| 6080日韩午夜伦伦午夜伦| 狠狠色综合日日| 国产精品久久久久久久岛一牛影视| 在线亚洲高清视频| 日韩av在线发布| 国产欧美日产一区| 欧美日韩免费观看一区二区三区| 日韩精品中文字幕在线不卡尤物 | 精品一区二区在线看| 日韩欧美一二区| 不卡影院免费观看| 青青草国产成人av片免费| 国产精品乱码妇女bbbb| 欧美猛男gaygay网站| 国产精品77777| 婷婷丁香久久五月婷婷| 国产精品美女久久久久久久久 | 亚洲激情五月婷婷| 精品精品国产高清a毛片牛牛| 亚洲午夜在线视频| 中文字幕精品—区二区四季| 欧美二区三区91| av电影在线观看不卡| 久久国产精品99精品国产| 亚洲美女区一区| 日本一区二区三区dvd视频在线| 久久99这里只有精品| 夜夜亚洲天天久久| 欧美国产精品中文字幕| 日韩一级二级三级精品视频| 欧洲av一区二区嗯嗯嗯啊| 国产不卡高清在线观看视频| 蜜桃视频一区二区三区在线观看| 日韩欧美专区在线| 91视视频在线观看入口直接观看www | 欧美va亚洲va在线观看蝴蝶网| 欧美aaaaaa午夜精品| 亚洲一区免费视频| 亚洲精品第1页| 中文字幕一区二区三区蜜月| 欧美电影免费观看高清完整版 | 成人av影视在线观看| 国产精一品亚洲二区在线视频| 久久精品视频一区| 精品精品国产高清一毛片一天堂| 国产高清亚洲一区| 国模一区二区三区白浆| 奇米色777欧美一区二区| 亚洲成人av中文| 亚洲一区二区三区美女| 亚洲黄色小说网站| 一区二区三区在线看| 中文字幕色av一区二区三区| 国产精品美女一区二区在线观看| 欧美日韩国产精品成人| 欧美日韩亚洲综合| 在线国产亚洲欧美| 欧美日韩另类一区| 欧美日本一区二区三区| 欧美精品国产精品| 日韩亚洲欧美成人一区| 日韩久久久精品| 久久嫩草精品久久久久| 久久综合色婷婷| 国产精品色哟哟网站| 亚洲欧美日本韩国| 亚洲一区二区av在线| 日本va欧美va精品| 国产精品一区二区久久不卡 | 91美女福利视频| 色婷婷av一区二区三区大白胸| 久久99热国产| 国产一区二区三区| 成人妖精视频yjsp地址| 91在线porny国产在线看| 欧美日韩精品福利| 精品福利一二区| 中文字幕的久久| 亚洲电影欧美电影有声小说| 久久精品免费观看| youjizz久久| 欧美日韩国产一区二区三区地区| 国产不卡在线一区| 在线看一区二区| 精品国产三级a在线观看| 日本一区二区视频在线| 尤物视频一区二区| 日本不卡视频在线| 久久se这里有精品| 99久久精品国产麻豆演员表| 欧美精选午夜久久久乱码6080| 91在线观看免费视频| 制服.丝袜.亚洲.另类.中文| 国产亚洲精品福利| 午夜一区二区三区在线观看| 久久精品久久综合| 91网站视频在线观看| 欧美一区二区三区在线观看视频| 欧美色爱综合网| 国产校园另类小说区| 日韩经典中文字幕一区| 国产一区二区三区电影在线观看 | 国产成+人+日韩+欧美+亚洲| 欧美日韩国产免费一区二区 | 欧美乱熟臀69xxxxxx| 国产情人综合久久777777| 亚洲图片欧美综合| 国产.欧美.日韩| 91精品婷婷国产综合久久性色 | 日韩欧美电影一二三| 亚洲欧美一区二区三区极速播放| 国产精品区一区二区三区| 蜜臀av一级做a爰片久久| 成人app下载| 精品成人佐山爱一区二区| 亚洲v精品v日韩v欧美v专区| 成人精品小蝌蚪| 久久精品日韩一区二区三区| 男人的天堂久久精品| 欧美日韩美少妇| 亚洲精品欧美综合四区| 懂色中文一区二区在线播放| 精品区一区二区| 日本中文字幕一区二区视频| 色狠狠色噜噜噜综合网| 国产精品情趣视频| 国产99久久久国产精品免费看| 波多野结衣亚洲一区| 久久久精品国产免大香伊| 五月天亚洲精品| 欧美三区在线视频| 一区二区激情视频| 色94色欧美sute亚洲线路二| 中文字幕一区免费在线观看| 成人免费视频视频| 国产日韩欧美麻豆| 国产成人精品免费一区二区| 精品福利在线导航| 国产真实精品久久二三区| 欧美变态tickle挠乳网站| 国产aⅴ综合色| 国产女人水真多18毛片18精品视频| 亚洲少妇屁股交4| av电影天堂一区二区在线观看| 色欧美乱欧美15图片| 中文字幕 久热精品 视频在线| 欧美美女黄视频| 亚洲综合男人的天堂| 97久久超碰精品国产| 亚洲欧美一区二区三区国产精品| 日韩精彩视频在线观看| 91精品婷婷国产综合久久性色| 国产欧美日韩在线| 成人激情开心网| 亚洲欧美另类久久久精品| 在线观看免费一区| 香蕉av福利精品导航| 日韩欧美亚洲国产另类| 免费成人在线网站| 精品福利一区二区三区免费视频| 一区二区三区高清不卡| 欧美中文字幕一区二区三区亚洲 | 欧美在线影院一区二区| 亚洲男女一区二区三区| 色婷婷久久综合| 亚洲国产精品久久人人爱蜜臀| 韩国av一区二区三区四区| 久久综合九色综合欧美98| 成人自拍视频在线观看| 中文字幕字幕中文在线中不卡视频| 奇米色一区二区| 欧美国产乱子伦| 色婷婷亚洲一区二区三区| 日韩中文字幕麻豆| 国产欧美综合色| 精品视频一区二区不卡| 经典三级一区二区| 亚洲人成影院在线观看| 欧美一区二区在线免费播放| 国产夫妻精品视频|