⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keybdmdd.cpp

📁 三星2410的BSP开发包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
   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
#define FIFTH_COLUMN    4
#define SIXTH_COLUMN    5
#define SAME_VALUE_COLUMN  16

const UINT8 VKeyToUnicodeSpecialMappingTable[8] =
// mapping table for VK_BACK , VK_TAB and VK_RETURN
{
  SAME_VALUE_COLUMN,  // only key
  SAME_VALUE_COLUMN,  // key + shift
  SAME_VALUE_COLUMN,  // key         + caps
  SAME_VALUE_COLUMN,  // key + shift + caps
  FIRST_COLUMN     ,  // key                + control
  NO_CHAR          ,  // key + shift        + control
  SECOND_COLUMN    ,  // key         + caps + control
  NO_CHAR             // key + shift + caps + control
  };

const UINT8 VKeyToUnicodeSpecialTable[6][2] =
{
  {
    127,      // back + Control
    8         // back + Control + Caps
    },
  {
    NO_CHAR,  // tab + Control
    NO_CHAR   // tab + Control + Caps
    },
  {
    NO_CHAR,  // unused VKey
    NO_CHAR   // unused VKey
    },
  {
    NO_CHAR,  // unused VKey
    NO_CHAR   // unused VKey
    },
  {
    NO_CHAR,  // unused VKey
    NO_CHAR   // unused VKey
    },
  {
    10,        // return + control
    10        // return + control + Caps
    }
};

const UINT8 VKeyToUnicodeEscapeMappingTable[8] =
// mapping table for VK_ESCAPE
{
  SAME_VALUE_COLUMN,  // only key
  SAME_VALUE_COLUMN,  // key + shift
  SAME_VALUE_COLUMN,  // key         + caps
  SAME_VALUE_COLUMN,  // key + shift + caps
  SAME_VALUE_COLUMN,  // key                + control
  SAME_VALUE_COLUMN,  // key + shift        + control
  NO_CHAR          ,  // key         + caps + control
  NO_CHAR             // key + shift + caps + control
  };

const UINT8 VKeyToUnicodeSpaceMappingTable[8] =
// mapping table for VK_SPACE
{
  SAME_VALUE_COLUMN,  // only key
  SAME_VALUE_COLUMN,  // key + shift
  SAME_VALUE_COLUMN,  // key         + caps
  SAME_VALUE_COLUMN,  // key + shift + caps
  SAME_VALUE_COLUMN,  // key                + control
  NO_CHAR          ,  // key + shift        + control
  SAME_VALUE_COLUMN,  // key         + caps + control
  NO_CHAR             // key + shift + caps + control
  };

const UINT8 VKeyToUnicodeNumbersMappingTable[8] =
{
  SAME_VALUE_COLUMN,  // only key
  FIRST_COLUMN     ,  // key + shift
  SAME_VALUE_COLUMN,  // key         + caps
  FIRST_COLUMN     ,  // key + shift + caps
  NO_CHAR          ,  // key                + control
  SECOND_COLUMN    ,  // key + shift        + control
  NO_CHAR          ,  // key         + caps + control
  SECOND_COLUMN       // key + shift + caps + control
  };

const UINT8 VKeyToUnicodeNumbersTable[10][2] =
{
  {
    ')'    ,  // SHIFT + 0
    NO_CHAR   // SHIFT + 0 +Control
    },
  {
    '!'    ,  // SHIFT + 1
    NO_CHAR   // SHIFT + 1 +Control
    },
  {
    '@'    ,  // SHIFT + 2
    0        // SHIFT + 2 +Control
    },
  {
    '#'    ,  // SHIFT + 3
    NO_CHAR   // SHIFT + 3 +Control
    },
  {
    '$'    ,  // SHIFT + 4
    NO_CHAR   // SHIFT + 4 +Control
    },
  {
    '%'    ,  // SHIFT + 5
    NO_CHAR   // SHIFT + 5 +Control
    },
  {
    '^'    ,  // SHIFT + 6
    30        // SHIFT + 6 +Control
    },
  {
    '&'    ,  // SHIFT + 7
    NO_CHAR   // SHIFT + 7 +Control
    },
  {
    '*'    ,  // SHIFT + 8
    NO_CHAR   // SHIFT + 8 +Control
    },
  {
    '('    ,  // SHIFT + 9
    NO_CHAR   // SHIFT + 9 +Control
    }

};


const UINT8 VKeyToUnicodeAlphabetsMappingTable[8] =
{
  FIRST_COLUMN,       // only key
  SAME_VALUE_COLUMN,  // key + shift
  SAME_VALUE_COLUMN,  // key         + caps
  FIRST_COLUMN,       // key + shift + caps
  SECOND_COLUMN    ,  // key                + control
  SECOND_COLUMN    ,  // key + shift        + control
  SECOND_COLUMN    ,  // key         + caps + control
  SECOND_COLUMN       // key + shift + caps + control
  };

const UINT8 VKeyToUnicodePunctuation1MappingTable[8] =
{
  FIRST_COLUMN  ,  // only key
  SECOND_COLUMN ,  // key + shift
  FIRST_COLUMN  ,  // key         + caps
  SECOND_COLUMN ,  // key + shift + caps
  NO_CHAR       ,  // key                + control
  THIRD_COLUMN  ,  // key + shift        + control
  NO_CHAR       ,  // key         + caps + control
  THIRD_COLUMN     // key + shift + caps + control
  };

const UINT8 VKeyToUnicodePunctuation1Table[7][3] =
{
  {
    ';'    ,  // semi colon
    ':'    ,  // semi colon +shift
    NO_CHAR   // semi colon +shift +control
    },
  {
    '='     ,  // equal
    '+'     ,  // equal +shift
    NO_CHAR   // equal +shift +control
    },
  {
    ',' ,     // comma
    '<' ,     // comma +shift
    NO_CHAR  // comma +shift +control
    },
  {
    '-' ,  // hyphen
    '_' ,  // hyphen +shift
    31    // hyphen +shift +control
    },
  {
    '.'     ,  // period
    '>'     ,  // period +shift
    NO_CHAR   // period +shift +control
    },
  {
    '/' ,    // slash
    '?' ,    // slash +shift
    NO_CHAR  // slash +shift +control
    },
  {
    '`' ,     // backquote
    '~' ,     // backquote +shift
    NO_CHAR   // backquote +shift +control
    }
};


const UINT8 VKeyToUnicodePunctuation2MappingTable[8] =
{
  FIRST_COLUMN  ,  // only key
  SECOND_COLUMN ,  // key + shift
  FIRST_COLUMN  ,  // key         + caps
  SECOND_COLUMN ,  // key + shift + caps
  THIRD_COLUMN  ,  // key                + control
  NO_CHAR       ,  // key + shift        + control
  THIRD_COLUMN  ,  // key         + caps + control
  NO_CHAR          // key + shift + caps + control
  };


const UINT8 VKeyToUnicodePunctuation2Table[4][3] =
{
  {
    '['    ,  // lsquarebracket
    '{'    ,  // lsquarebracket +shift
    27        // lsquarebracket +control
    },
  {
    '\\',     // backslash
    '|' ,     // backslash +shift
    28       // backslash +control
    },
  {
    ']'  ,    // rsquarebracket
    '}'  ,    // rsquarebracket +shift
    29       //  +control
    },
  {
    '\''   ,  // apostrophe
    '"'   ,  // apostrophe +shift
    NO_CHAR  // apostrophe +control no char
    }
};

#define ALT_INDEX      8
#define CONTROL_INDEX  4
#define CAPS_INDEX     2
#define SHIFT_INDEX    1




/*++

VKeyToUnicode:

Utility function that does the actual Unicode character lookup.  


Return Value:

The Unicode character.

--*/
UINT16
VKeyToUnicode(
	UINT32			VirtualKey,    //	Virtual Key causing the event.
	KEY_STATE_FLAGS	*ShiftFlags   //	State of Shift, control, caps and alt keys.
		    )
{
  UINT32   index=0;
  UINT8    column,return_value = NO_CHAR;


  if ( *ShiftFlags & KeyShiftAnyCtrlFlag)
    index += CONTROL_INDEX;
  if ( *ShiftFlags & KeyShiftCapitalFlag)
	{
    index += CAPS_INDEX;
	}
  if ( *ShiftFlags & KeyShiftAnyShiftFlag)
    index += SHIFT_INDEX;
  if (( *ShiftFlags & KeyShiftAnyAltFlag) &&
      ( *ShiftFlags & KeyShiftAnyCtrlFlag) )
    {
      *ShiftFlags |= KeyShiftNoCharacterFlag;
      return  NO_CHAR;
    }


  if ((VirtualKey >= VK_0) && (VirtualKey <= VK_9) )
    {
      column =  VKeyToUnicodeNumbersMappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	default:
	  return_value = VKeyToUnicodeNumbersTable[VirtualKey - VK_0][column];
	}
    }


  if ((VirtualKey >= 'A') && (VirtualKey <= 'Z') )
    {
      //    NKDbgPrintfW(1, (L"index %d\r\n",index ));
      column =  VKeyToUnicodeAlphabetsMappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	case FIRST_COLUMN:
	  return  VirtualKey + 'a' - 'A' ;
	case SECOND_COLUMN:
	  return  VirtualKey - 'A' + 1 ;
	}
    }
  if ((VirtualKey >= VK_SEMICOLON) && (VirtualKey <= VK_BACKQUOTE) )
    {
      column =  VKeyToUnicodePunctuation1MappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	default:
	  return_value = VKeyToUnicodePunctuation1Table
	    [VirtualKey - VK_SEMICOLON][column];
	}
    }
  if ((VirtualKey >= VK_LBRACKET) && (VirtualKey <= VK_APOSTROPHE) )
    {
      column =  VKeyToUnicodePunctuation2MappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	default:
	  return_value = VKeyToUnicodePunctuation2Table
	    [VirtualKey - VK_LBRACKET][column];
	}
    }
  if ((VirtualKey >= VK_BACK) && (VirtualKey <= VK_RETURN) )
    {
      column =  VKeyToUnicodeSpecialMappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	default:
	  return_value = VKeyToUnicodeSpecialTable
	    [VirtualKey - VK_BACK][column];
	}
    }
  if (VirtualKey == VK_ESCAPE )
    {
      column =  VKeyToUnicodeEscapeMappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	}
    }
  if (VirtualKey == VK_SPACE )
    {
      column =  VKeyToUnicodeSpaceMappingTable[index];
      switch (column)
	{
	case  SAME_VALUE_COLUMN:
	  return  VirtualKey;
	case  NO_CHAR:
	  *ShiftFlags |= KeyShiftNoCharacterFlag;
	  return  NO_CHAR;
	}
    }
  if (return_value == NO_CHAR) {
    *ShiftFlags |= KeyShiftNoCharacterFlag;
    return  NO_CHAR;
  } else {
    return return_value;
  }
}



extern "C"
//      @doc EXTERNAL DRIVERS
/*      @func
	
Generates the appropriate Unicode characters and shift state flags given a 
virtual key, key state array and driver state.  
	
@xref
	
	<tab><t KEY_STATE_FLAGS><nl>
	<tab><t KEY_STATE><nl>
	<tab><t TO_UNICODE_STATE><nl>
	<tab><f KeybdDriverGetInfo><nl>
	<tab><f KeybdDriverInitStates>
	
@comm If KeyState is NULL, the driver must fill in the character which 
corresponds to the unshifted state for the virtual key and return.  
	
@comm In all other cases, this function must at least update the key state 
array and fill in the shift state determined from the key state array and, 
if necessary, update the <t TO_UNICODE_STATE>.  This means that the count 
of characters generated will always be at least 1.  See <t 
KEY_STATE_FLAGS> in order to generate the shift state without a 
corresponding character.  
	
@comm Each character should have a corresponding shift state entered into 
the shift state buffer, even if it is the same as the preceding shift 
state.  
	
@comm Each entry in the character buffer is 32-bits whereas a Unicode 
character is 16 bits.  The driver should clear the high order 16-bits.  
	
	<tab>*((UINT16*)pCharacterBuffer) = Unicode character; // NO doesn't clear high bits.<nl>
	<nl>		
	<tab>*pCharacterBuffer = Unicode character; // YES<nl>

*/
UINT32 KeybdDriverVKeyToUnicode(
	UINT32			VirtualKey,						//	@parm   Virtual Key causing the event.
	KEY_STATE_FLAGS	KeyEvent,						//	@parm   KeyStateDownFlag set or cleared.
	KEY_STATE		KeyState,						//	@parm   Key State.
	void			*pKeybdDriverToUnicodeState,	//	@parm   Driver  specific <t TO_UNICODE_STATE>.
	UINT32			cBufferSize,		//	@parm	Count of 32-bit  entries in each buffer.
	UINT32			*pcCharacters,		//	@parm	Count of characters generated.
	KEY_STATE_FLAGS	*pShiftStateBuffer,	//	@parm	Location to put shift state info.
	UINT32			*pCharacterBuffer	//  @parm	Location to put characters.
	)
{
	KEY_STATE_FLAGS	ShiftFlags;
	UINT32			VKeyCommon;

	VirtualKey &= 0xff;

//	Do special case for MapVirtualKey here.
	if ( KeyState == NULL )
		{
		if ( pCharacterBuffer )
			*pCharacterBuffer = towlower(VirtualKey);
		return ERROR_SUCCESS;
		}

//	We have ToUnicodeState for demo, so check for it.
	if ( pKeybdDriverToUnicodeState == NULL )
		{
		SetLastError(ERROR_INVALID_PARAMETER);
		return ERROR_INVALID_PARAMETER;
		}

	if ( ( cBufferSize != MAX_TO_UNICODE_CHARACTERS ) ||
		 ( pShiftStateBuffer == NULL ) ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -