怎么做用户按键啊?想实现(上、下、左、右、确定、返回)功能,MINI2440本身正好有6个键。

weishuai2512 2011-01-14 09:57:51
我用的是WINCE 6.0操作系统,在VS2008下开发程序,现在要做6个按键,怎么实现啊?提供个思路也行啊,最好能给点代码啊
...全文
222 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony0121 2011-03-08
  • 打赏
  • 举报
回复
用驱动的方法比较麻烦,我用的是监听按键的方法类似于消息钩子,把wince传上的key值与我预先设置的key值做匹配
zwl2012 2011-01-26
  • 打赏
  • 举报
回复
createfile打开按键驱动,readfile读取按键值,在自己的应用程序里面判断是否按下或者松手,进而调用这个函数key event发送up或者down或者tab等等消息就可以了。
韩明君 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 joyanhui 的回复:]
应该是修改 按键驱动的 中断部分
[/Quote]
个人认为建议比较好
qianjun1978 2011-01-19
  • 打赏
  • 举报
回复
正如6楼给你的代码一样,在驱动中再自行添加增加的键的IO设定。
并在新增加的键中增加打印信息->编译生成NK文件->下载到目标板中->测试按键,如果增加的按键驱动成功,就可以在串口中发现你所设定的打印信息。
这是一半的工作量,然后需要在应用程序中设定键盘消息的映射,捕捉它。
  • 打赏
  • 举报
回复
你贴的是驱动,你修改下按键驱动生成的事件返回值,应用程序捕捉一下按键事件就可以了。
copyman39339005 2011-01-17
  • 打赏
  • 举报
回复
是的 驱动里面硬件中断对应上系统按键信息就行
weishuai2512 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ele01 的回复:]
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}

//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);
……
[/Quote] 是不是这样啊,修改好驱动后,需要重新生成内核,然后重新装系统就行了,是这样吧???
UN_ChairMan 2011-01-15
  • 打赏
  • 举报
回复
你按键驱动要发送键盘码吧
xilidecai 2011-01-15
  • 打赏
  • 举报
回复
VS2008是只能做应用开发而不能开发驱动的吧?开发应用程序你先看驱动提供的接口撒,我这里有按键测试的源码,需要联系我:caichang714@126.com
ele01 2011-01-15
  • 打赏
  • 举报
回复
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}

//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);

}

//EINT13 - K3
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<13))
{
InterruptDone(g_KeySysIntr[2]);

}

//EINT14 - K4
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<14))
{
InterruptDone(g_KeySysIntr[3]);

}

//EINT15 - K5
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<15))
{
InterruptDone(g_KeySysIntr[4]);

}

//EINT19 - K6
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<19))
{
InterruptDone(g_KeySysIntr[5]);
}


这里面加入 keybd_event函数 想要什么键就设置什么键 比如
keybd_event(VK_UP,0,0,0);
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
就是“上”
91program 2011-01-14
  • 打赏
  • 举报
回复
Keyboard HOOK
lan120576664 2011-01-14
  • 打赏
  • 举报
回复
操作系统有个keybd_event 的API
参考代码

#include <windows.h>

void SetNumLock( BOOL bState )
{
BYTE keyState[256];

GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );

// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
}

void main()
{
SetNumLock( TRUE );
}
lan120576664 2011-01-14
  • 打赏
  • 举报
回复
ce6.0要做流驱动
因为不能够直接访问底层
joyanhui 2011-01-14
  • 打赏
  • 举报
回复
应该是修改 按键驱动的 中断部分
weishuai2512 2011-01-14
  • 打赏
  • 举报
回复
以上两位,能不能具体点啊。是不是要修改驱动啊?一下是MINI2440板子上按键的源码
#include <windows.h>
//#include <ceddk.h>
#include <nkintr.h>
//#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"


volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
volatile INTreg *s2440INT = (INTreg *)INT_BASE;
UINT32 g_KeySysIntr[6];
HANDLE KeyThread;
HANDLE KeyEvent;

HANDLE APIEvent;

BYTE KeyValues[6] = { 0, 0, 0, 0, 0, 0};

void Virtual_Alloc(); // Virtual allocation
DWORD UserKeyProcessThread(void);

const TCHAR szevtUserInput[] = L"FriendlyARM/ButtonEvent";


DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;

HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);


IRQ = 36; //IRQ_EINT8;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[0], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 39; //IRQ_EINT11;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[1], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 41; //IRQ_EINT13;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[2], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 42; //IRQ_EINT14;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[3], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 43; //IRQ_EINT15;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[4], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}


IRQ = 47; //IRQ_EINT19;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[5], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}





if (!InterruptInitialize(g_KeySysIntr[0], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}

if (!InterruptInitialize(g_KeySysIntr[1], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[2], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[3], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[4], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[5], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}





while(1)
{
WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
SetEvent(APIEvent);
RETAILMSG(0,(L"EINTMASK=%X, rGPGCON=%X rGPGDAT=%X\r\n", s2440IOP->rEINTMASK, s2440IOP->rGPGCON, s2440IOP->rGPGDAT));

const char Index[] = { 0, 3, 5, 6, 7, 11, };
for (int i = 0; i < 6; i++) {
int bit_index = Index[i];
bool down = !(s2440IOP->rGPGDAT & (1 << bit_index));
KeyValues[i] = down;
RETAILMSG(0, (L"%s", down ? L"1" : L"0"));
}
RETAILMSG(0, (L"\r\n"));


//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}

//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);

}

//EINT13 - K3
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<13))
{
InterruptDone(g_KeySysIntr[2]);

}

//EINT14 - K4
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<14))
{
InterruptDone(g_KeySysIntr[3]);

}

//EINT15 - K5
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<15))
{
InterruptDone(g_KeySysIntr[4]);

}

//EINT19 - K6
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<19))
{
InterruptDone(g_KeySysIntr[5]);
}
}
}



void Virtual_Alloc()
{

// GPIO Virtual alloc
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy failed!\r\n")));
}
}


// Interrupt Virtual alloc
s2440INT = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INT == NULL) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INT,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualCopy failed!\r\n")));
}
}

}


BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID Reserved/* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}

return TRUE;
}


BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("USERKEY: KEY_Deinit\r\n")));

for (int i=0; i<6; i++)
InterruptDisable(g_KeySysIntr[i]);


CloseHandle(KeyThread);
CloseHandle(KeyEvent);
CloseHandle(APIEvent);
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);

return TRUE;
}






BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
//s2440IOP->rGPGUP = 0xffff;
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x6 << 0);

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x2 << 6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x6 << 12);

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x6 << 20);

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x2 << 12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x6 << 24);

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 14)) | (0x2 << 14); // GPG7 == EINT15
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1

19,524

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧