2008.10.15

说明：



一、接收camera按键消息：

消息类型：
	WM_KEYDOWN:     WM_KEYUP:
消息数据：
	 wParam: 它的值等于VK_F1

应用举例：

    switch (message) 
    {
	case WM_KEYDOWN:
		switch(wParam)
		{
			case VK_F1：
				MessageBox (NULL, TEXT VK_F1 camera_key is DOWN!"), TEXT ("kbdtest"), 0);
			break;  
		}
	case WM_KEYUP:
		switch(wParam)
		{
			case VK_F1：
				MessageBox (NULL, TEXT VK_F1 camera_key is UP!"), TEXT ("kbdtest"), 0);
			break;  
		}

}	



六、接收hold键消息
    在900的定义中，需要一个hold键来实现锁屏的接口；在wince中，不是焦点的窗口无法获得按键信息，所以特意增加一个新的
接口，保证不是当前的焦点，也能获得，hold键按下/弹上的状态。该接口与耳机接口类似，先由MMI通过RegisterWindowMessage()
获得一个窗口的消息id，然后再通过DeviceIoControl()来将该id传递给驱动，当hold键按下时候，键盘驱动除了发送wm_keydown/
wm_keyup、wm_char等消息外，还将广播一个消息给所有的窗口，该消息就是之前MMI传递下来的消息，

消息类型：
    应用程序需要使用RegisterWindowsMessage()来获得消息的ID，消息名称可以起类似"MMI/HoldKeyNotifyMsgId/Message"，通过
DeviceIoControl()将该ID传递给系统检测驱动(PSM1:)；

在应用程序的消息处理队列里，可以如下处理：

switch(Msg)
{
... ...
case WM_CREATE:
    // get msg id
    g_dwHoldKeyNotifyMsgId = RegisterWindowMessage(TEXT("MMI/HoldKeyNotifyMsgId/Message"))

    // set msg id
    ... ...
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    if(message == g_dwHoldKeyNotifyMsgId)
    {
	// hold key message comes in.
	break;
    }else{
	 return DefWindowProc(hWnd, message, wParam, lParam);
    }			
}

消息数据：

    lParam: 表明当前hold键是被按下还是释放，1--hold键被按下，0--hold键被释放



将消息ID传递给驱动的接口：
dwIoControlCode：((DWORD)((0x101<<16) | ((6000+3)<<2)))
输入/输出参数：输入参数为通过RegisterWindowMessage()获得的消息ID
               没有输出参数


参考代码如下：
{
	HANDLE hHandle = NULL;

	hHandle = CreateFile(TEXT("PSM1:"), GENERIC_READ | GENERIC_WRITE, 0,NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL );

	if(hHandle != INVALID_HANDLE_VALUE)
	{
		DeviceIoControl(hHandle, ((DWORD)((0x101<<16) | ((6000+3)<<2))), &g_dwHoldKeyNotifyMsgId, sizeof(DWORD), NULL, 0,
			NULL, NULL);
		CloseHandle(hHandle);
	}
}




七、关机消息
    在旧的版本中，长按power键关机实现是由键盘驱动完成的，在新版本中，将这个实现转移到shell中完成，当power键按下超过3秒，键盘驱动将
广播一个消息给上层窗口，而不是调用关机接口。先由MMI通过RegisterWindowMessage()获得一个窗口的消息id，然后再通过DeviceIoControl()来，
将该id传递给驱动。需要注意的是，假设在MMI没来得及将消息id传送给驱动时候，用户就按下了power键并超过3秒，这时候，键盘驱动将主动将系统
光比。

消息类型：
    应用程序需要使用RegisterWindowsMessage()来获得消息的ID，消息名称可以起类似"MMI/PowerOffNotifyMsgId/Message"，通过
DeviceIoControl()将该ID传递给系统检测驱动(PSM1:)；

在应用程序的消息处理队列里，可以如下处理：

switch(Msg)
{
... ...
case WM_CREATE:
    // get msg id
    g_dwNotifyMsgId = RegisterWindowMessage(TEXT("MMI/PowerOffNotifyMsgId/Message"))

    // set msg id
    ... ...
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:			
    if(message == g_dwNotifyMsgId)
    {
	// hold key message comes in.
	break;
    }else{
	 return DefWindowProc(hWnd, message, wParam, lParam);
    }			
}

消息数据：
    wParam: 保留
    lParam: 保留



将消息ID传递给驱动的接口：
dwIoControlCode：((DWORD)((0x101<<16) | ((6000+6)<<2)))
输入/输出参数：输入参数为通过RegisterWindowMessage()获得的消息ID
               没有输出参数


参考代码如下：
{
	HANDLE hHandle = NULL;

	hHandle = CreateFile(TEXT("PSM1:"), GENERIC_READ | GENERIC_WRITE, 0,NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL );

	if(hHandle != INVALID_HANDLE_VALUE)
	{
		DeviceIoControl(hHandle, ((DWORD)((0x101<<16) | ((6000+6)<<2))), &g_dwHoldKeyNotifyMsgId, sizeof(DWORD), NULL, 0,
			NULL, NULL);
		CloseHandle(hHandle);
	}
}
