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

📄 keydrv.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:键盘事件管理
版本号:3.0.0
开发时期:1999
作者:李林
修改记录:
    2003-04-14:增加冲突段检查
    2003-04-11:键盘对列满但窗口却得不到
******************************************************/

#include <eframe.h>
#include "ekeydrv.h"

#include <eevent.h>
//#include <epalloc.h>
#include <epwin.h>

#undef  MAX_QUEUE
#define MAX_QUEUE 32
#define KEY_CAPITAL 0x00000001
#define KEY_SHIFT   0x00000002
#define KEY_CTRL    0x00000004
#define KEY_ALT     0x00000008

static WORD wQueueHead = 0;
static WORD wQueueTail = 0;
static WORD wQueueCount = 0;
static KEYRECORD keyQueue[MAX_QUEUE];
static LPKEYRECORD lpPrev;
static DWORD dwKeyboardState = 0;
static CRITICAL_SECTION csKeyQueue;

static int _KeyInstall( void );
static int _KeyRelease( void );
static int _KeyWho( void );
static int _KeyPeek( LPMSG lpMsg, UINT fRemove );
static int _KeyPut( LPMSG lpUnused );
static int _KeyRemove( void );
static UINT _KeyCount( void );

//用户界面设备事件接口
_EVENTDRV _keyEvent = {
    _KeyInstall,
    _KeyRelease,
    _KeyWho,
    _KeyPeek,
    _KeyPut,
    _KeyRemove,
    _KeyCount
};

// **************************************************
// 声明:void CALLBACK __PutKeybrdEvent( LPKEYRECORD lpRecord )
// 参数:
// 	IN lpRecord - KEYRECORD结构指针,包含键盘数据
// 返回值:
//	无
// 功能描述:
//	提供给键盘设备的回调接口
//	当键盘设备驱动程序产生键盘事件后,将其得到的键盘数据通过该
//	函数传给 GWME 系统
// 引用: 
//	被键盘设备驱动程序调用
// ************************************************

// define key/button device driver, call by interrupt server subroution
#define DEBUG_PUT_KEYBRD_EVENT 0
void CALLBACK __PutKeybrdEvent( LPKEYRECORD lpRecord )
{
	EnterCriticalSection( &csKeyQueue );
	//队列满吗?	
    if( wQueueCount < MAX_QUEUE )
    {	//没有,加入队列尾
		keyQueue[wQueueTail] = *lpRecord;
		lpPrev = (keyQueue + wQueueTail);
		if( ++wQueueTail >= MAX_QUEUE )
			wQueueTail = 0;
		wQueueCount++;
    }
	else
	{
		ERRORMSG( DEBUG_PUT_KEYBRD_EVENT, ( "key queue is full, wQueueCount=%d.\r\n", wQueueCount ) );
	}

	LeaveCriticalSection( &csKeyQueue ); 
	//设置系统有事件状态
	SetSYSQueueState( ES_KEY, TRUE );
}

// **************************************************
// 声明:static BOOL __GetKeybrdEvent( LPKEYRECORD lpRecord, BOOL fRemove )
// 参数:
// 	OUT lpRecord - 用于接受键盘数据
//	IN fRemove - 是否将该键盘数据从队列中移出
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	从键盘事件队列中得到键盘数据
// 引用: 
//	
// ************************************************

static BOOL __GetKeybrdEvent( LPKEYRECORD lpRecord, BOOL fRemove )
{
#ifdef EML_DOS
     static DWORD dwKey = -1;
     if( dwKey == -1 )
     {
        if( bioskey( 1 ) )
        {
            lpRecord->wState = WM_KEYDOWN;
            dwKey = lpRecord->dwKeyValue = bioskey( 0 );
            if( fRemove )
                dwKey = -1;
            return TRUE;
        }
     }
     else
     {
            lpRecord->wState = WM_KEYDOWN;
            lpRecord->dwKeyValue = dwKey;
            if( fRemove )
                dwKey = -1;
            return TRUE;
     }
     return FALSE;
#else

	BOOL bRetv = FALSE;

    EnterCriticalSection( &csKeyQueue );

    if( wQueueCount )
    {	//有数据
        *lpRecord = keyQueue[wQueueHead];
        if( fRemove )
        {	//移出
            if( ++wQueueHead >= MAX_QUEUE )
                wQueueHead = 0;
            wQueueCount--;
        }
        bRetv = TRUE;
    }

	LeaveCriticalSection( &csKeyQueue );

	return bRetv;
#endif
}

// **************************************************
// 声明:static UINT _KeyCount( void )
// 参数:
// 	无
// 返回值:
//	返回当前键盘队列的有多少键盘数据
// 功能描述:
//	得到当前键盘队列的键盘数据个数
// 引用: 
//	接口函数
// ************************************************

static UINT _KeyCount( void )
{
    return wQueueCount;
}

// **************************************************
// 声明:static int _KeyInstall()
// 参数:
// 	无
// 返回值:
//	假如成功,返回1;否则,返回0
// 功能描述:
//	安装并初始化键盘
// 引用: 
//	接口函数
// ************************************************

static int _KeyInstall()
{
	InitializeCriticalSection( &csKeyQueue );
    return 1;
}

// **************************************************
// 声明:static int _KeyRelease()
// 参数:
// 	无
// 返回值:
//	成功,返回0
// 功能描述:
//	释放/卸载键盘
// 引用: 
//	接口函数
// ************************************************

static int _KeyRelease()
{
	DeleteCriticalSection( &csKeyQueue );
    return 0;
}

// **************************************************
// 声明:static int _KeyWho()
// 参数:
// 	无
// 返回值:
//	返回该接口的识别码(ID)
// 功能描述:
//	得到键盘事件接口的ID
// 引用: 
//	接口函数
// ************************************************

static int _KeyWho()
{
    return ID_KEY;
}

// **************************************************
// 声明:static int _KeyPeek( LPMSG lpMsg, UINT fRemove )
// 参数:
// 	OUT lpMsg -  用于接受键盘消息
//	IN fRemove - 是否移出队列的键盘消息
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	从键盘队列得到键盘事件
// 引用: 
//	接口函数
// ************************************************

static int _KeyPeek( LPMSG lpMsg, UINT fRemove )
{
    KEYRECORD  keyRecord;
	//从队列中得到数据 
    if( __GetKeybrdEvent( &keyRecord, fRemove ) )
    {	//得到
		if( keyRecord.wState & KEYEVENTF_CHAR )
			lpMsg->message = WM_CHAR;
        else if( keyRecord.wState & KEYEVENTF_KEYUP )
			lpMsg->message = WM_KEYUP;
		else
            lpMsg->message = WM_KEYDOWN;
		lpMsg->wParam = keyRecord.dwKeyValue;
		lpMsg->lParam = keyRecord.lParam;
		
        return TRUE;
    }
    return FALSE;
}

// **************************************************
// 声明:static int _KeyPut( LPMSG lpUnused )
// 参数:
// 	IN lpUnused - 由用户加入的键盘事件
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	用于让用户回放键盘事件(消息)。
// 引用: 
//	接口函数
// ************************************************

static int _KeyPut( LPMSG lpUnused )
{
     return FALSE;
}

// **************************************************
// 声明:static int _KeyRemove()
// 参数:
// 	无
// 返回值:
//	返回当前队列的键盘事件数
// 功能描述:
//	移出一个最先的键盘事件
// 引用: 
//	接口函数
// ************************************************

static int _KeyRemove()
{
    if( wQueueCount )
    {
        if( ++wQueueHead >= MAX_QUEUE )
            wQueueHead = 0;
        wQueueCount--;
    }
    return wQueueCount;
}


// **************************************************
// 声明:VOID WINAPI WinEvent_KeybdEvent( 
//				 BYTE bVk, 
//				 BYTE bScan, 
//				 DWORD dwFlags, 
//				 DWORD dwExtraInfo )
// 参数:
//	IN bVk – 虚键代码
//	IN bScan – 不支持
//	IN dwFlags – 可以为以下值:
//		KEYEVENTF_KEYUP – 说明键盘被释放,否则键盘被按下
//	IN dwExtraInfo – 不支持(为0)
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	向系统输入队列投递一个键盘事件
// 引用: 
//	系统API
// ************************************************

VOID WINAPI WinEvent_KeybdEvent( 
				 BYTE bVk, 
				 BYTE bScan, 
				 DWORD dwFlags, 
				 DWORD dwExtraInfo )
{
	KEYRECORD kc;

	kc.dwKeyValue = bVk;
	kc.wState = (WORD)dwFlags;
	kc.wCount = 1;
	kc.lParam = dwExtraInfo;

	__PutKeybrdEvent( &kc );
}

// **************************************************
// 声明:SHORT WINAPI WinMsg_GetKeyState( int nVirtKey )
// 参数:
// 	IN nVirtKey - 虚健值
// 返回值:
//	返回 nVirtKey的键盘状态
// 功能描述:
//	得到nVirtKey的键盘状态
// 引用: 
//	系统API
// ************************************************

SHORT WINAPI WinMsg_GetKeyState( int nVirtKey )
{
	return 0;
}

⌨️ 快捷键说明

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