6096|9

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE键盘钩子问题 [复制链接]

.wince上面的,,,虚拟键盘是否模拟成..键盘?


因为我用键盘钩子////钩不到任何信息.


不知是怎么回事??
此帖出自WindowsCE论坛

最新回复

riccdw421....感谢!!! 先给50分.... 测试完再给50分  详情 回复 发表于 2010-1-8 14:42
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶下;

学习下、MARK.
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果是SendMessage发送WM_CHAR的话,你是没办法钩住的。
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
前段时间。我也正在做。网上说的用HOOK的代码。我试了可以。但窗体必须是当前活动窗体才效。
一旦隐藏,就获取不到消息。
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 riccdw421 的回复:
前段时间。我也正在做。网上说的用HOOK的代码。我试了可以。但窗体必须是当前活动窗体才效。
一旦隐藏,就获取不到消息。


我的问题不知道出在什么地方.

LS,能否提供个DEMO????
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
http://blog.eeworld.net/lovelynn/archive/2008/12/23/3589633.aspx
看看他的帖子。我也是拿他的修改的。
下面是我的代码:注意。我创建的是SMARKPHONE=>WIN32程序,对比加入你新建的工程。
/**************.h********************/
#include "resource.h"
#include

#define        DEBUG_CODE 1
#define        KEY_TEST
#define WH_KEYBOARD_LL 20
#define WH_KEYBOARD 13
// KEY Begin
//第二步:创建结构体,这个结构体是这API中的定义,我们只能照搬和使用它。
typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
// KEY End
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
/*********************.cpp***************/
#include "stdafx.h"
#include
#include
#include

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE                        g_hInst;                        // current instance
HWND                                g_hWndCommandBar;        // command bar handle

// Forward declarations of functions included in this code module:
ATOM                        MyRegisterClass(HINSTANCE, LPTSTR);
BOOL                        InitInstance(HINSTANCE, int);

INT_PTR CALLBACK        TESTKEY(HWND, UINT, WPARAM, LPARAM);


// KEY Begin
/*
通常我们捕获键盘消息会在WindowProc函数种用一个switch来监听WM_KEYUP和WM_KEYDOWN消息,当按下键盘时程序就会收到这个消息。但是,有一个前提是当焦点是在当前窗口时,这个WM_KEYUP和WM_KEYDOWN消息才会被捕获到。如果我们需要在任何情况下使用这个应用程序捕获到键盘的动作就需要使用钩子。

Hook(钩子)是一种在消息到达目标窗口前进行截获的技术。使用钩子主要使用以下三个函数:

SetWindowsHookEx:创建钩子
CallNextHookEx:将消息传给钩子链中的下一个钩子
UnhookWindowsHookEx:释放钩子

   这些函数在windows上面使用没有问题,但是函数说明中可以看到以下文字:Windows CE: Unsupported。也就是说,wince并不支持钩子。
   是不是真的不支持呢?只能说不直接支持钩子,我们可以使用直接获取钩子函数地址,然后调用的方法,来使用钩子。

   具体过程如下:

   第一步:定义以上三个函数的指针
*/
BOOL LoopFlag = FALSE;
UINT32 LoopCount = 0, ErrorCout = 0;
#ifdef KEY_TEST
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK   (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
static _CallNextHookEx          CallNextHookEx;
static _SetWindowsHookExW       SetWindowsHookEx;
static _UnhookWindowsHookEx     UnhookWindowsHookEx;

// 第三步:创建钩子回调函数,我们将在这个函数里处理捕获到的键盘动作。代码如下。
LRESULT __declspec(dllexport)__stdcall  CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam,
                                                              LPARAM lParam)     
{
    //   char ch;      
        RETAILMSG(DEBUG_CODE,(L"KeyboardProc "));
        KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
                SHORT Ctrl_Stats = 0, Shift_Stats = 0;
                Ctrl_Stats = GetKeyState(VK_CONTROL);
                Shift_Stats = GetKeyState(VK_SHIFT);
        if(wParam == WM_KEYUP)
        {
            RETAILMSG(DEBUG_CODE,(L"key up\n"));
                        /*
            switch(pkbhs->vkCode)
            {
            case 0x31:
                RETAILMSG(DEBUG_CODE,(L"1 up \n"));
                break;
            case VK_F15:
                RETAILMSG(DEBUG_CODE,(L"pTT up \n"));
                break;
            }
                        */
                        RETAILMSG(DEBUG_CODE, (L"0x%x 0x%x 0x%x 0x%x 0x%x Ctrl_Up %x Shift_Up %x\n", pkbhs->vkCode, pkbhs->scanCode, pkbhs->flags, pkbhs->time, pkbhs->dwExtraInfo, Ctrl_Stats, Shift_Stats));
        }
        if(wParam == WM_KEYDOWN)
        {
            RETAILMSG(DEBUG_CODE,(L"key down\n"));
                        /*
            switch(pkbhs->vkCode)
            {
            case 0x31:
                RETAILMSG(DEBUG_CODE,(L"1 down \n"));
                break;
            case VK_F15:
                RETAILMSG(DEBUG_CODE,(L"pTT down \n"));
                break;
            }
                        */
                        RETAILMSG(DEBUG_CODE, (L"0x%x 0x%x 0x%x 0x%x 0x%x Ctrl_Press %x Shift_Press %x\n", pkbhs->vkCode, pkbhs->scanCode, pkbhs->flags, pkbhs->time, pkbhs->dwExtraInfo, Ctrl_Stats, Shift_Stats));
        }
    // LRESULT RetVal = CallNextHookEx( NULL, nCode, wParam, lParam );
    return CallNextHookEx(NULL,nCode,wParam,lParam);
}

// 第四步:创建一个函数ActivateKBHook在这个函数中来使用钩子,当然也可以不在这个函数中使用,创建函数只是为了使代码可读性好一些。具体代码如下:
HINSTANCE                       g_hHookApiDLL   = NULL;
HHOOK                           g_hInstalledLLKBDhook = NULL;
BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
{
    RETAILMSG(DEBUG_CODE,(L"ActivateKBHook\r\n"));
    //we need to manually load these standard Win32 API calls
    //MSDN states that these aren't supported in WinCE
    SetWindowsHookEx        = NULL;
    CallNextHookEx          = NULL;
    UnhookWindowsHookEx     = NULL;
   
    //now load the coredll.dll
    g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
    if(g_hHookApiDLL == NULL)
    {
        //something is awfully wrong
        //the dll has to be present
        RETAILMSG(DEBUG_CODE,(L"coredll.dll failure\r\n"));
        return false;
    }
    else
    {
        //load the SetWindowsHookEx API call
        //the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain.  
        //You would install a hook procedure to monitor the system for certain types of events.
        //here we use use the hook to monitor kyeboard events
        SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
        if(SetWindowsHookEx == NULL)
        {
            //this means that MS has really stopped supporting this API in WinCE
            RETAILMSG(DEBUG_CODE,(L"SetWindowsHookExW failure\r\n"));
            return false;
        }
        else
        {
            //install the KB hook
            //the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
            g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, g_hHookApiDLL, 0); // ZSC 091218 Modify WH_KEYBOARD_LL => WH_KEYBOARD
            if(g_hInstalledLLKBDhook == NULL)
            {
                int re;
                re=GetLastError();
                RETAILMSG(DEBUG_CODE,(L"SetWindowsHookEx failure %d \r\n",re));
                return false;
            }
        }
        
        //load CallNextHookEx() API call
        //the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain.  
        //we use this call for default processing of events.
        CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
        if(CallNextHookEx == NULL)
        {
            RETAILMSG(DEBUG_CODE,(L" _CallNextHookEx failure \r\n"));
            return false;
        }
        
        //load UnhookWindowsHookEx() API
        //the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
        //we use this call to unistall the hook.
        UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
        if(UnhookWindowsHookEx == NULL)
        {
            RETAILMSG(DEBUG_CODE,(L"_UnhookWindowsHookEx failure\r\n"));
            return false;
        }
    }
   
    //all the APIs are loaded and the application is hooked
    return true;
   
}
/*
几点说明:

        1、CALLBACK KeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)中,wParam得到的是按下的状态,例如是按下还是抬起,因此wParam会得到WM_KEYUP和WM_KEYDOWN消息。lParam得到的是具体按键的VK值,用来表明是哪个按键被按下。

        2、这里使用的是全局钩子,如果有两个程序使用同样的方式创建钩子,那么只能有一个正常工作。这个问题将在后续的实验中说明。
*/
#endif
// KEY End
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

       
    switch (message)
    {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
                case IDM_HELP_ABOUT:
                    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                    break;
                case IDM_FILE_EXIT:
                    DestroyWindow(hWnd);
                    break;

                                case ID_FILE_KEY:
                                        DialogBox(g_hInst, (LPCTSTR)IDD_DLG_KEY, hWnd, TESTKEY);                                        break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_CREATE:
            g_hWndCommandBar = CommandBar_Create(g_hInst, hWnd, 1);
            CommandBar_InsertMenubar(g_hWndCommandBar, g_hInst, IDR_MENU, 0);
            CommandBar_AddAdornments(g_hWndCommandBar, 0, 0);
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            
            // TODO: Add any drawing code here...
            
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            CommandBar_Destroy(g_hWndCommandBar);
            PostQuitMessage(0);
            break;


        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

INT_PTR CALLBACK TESTKEY(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_INITDIALOG:
            RECT rectChild, rectParent;
            int DlgWidth, DlgHeight;        // dialog width and height in pixel units
            int NewPosX, NewPosY;

            // trying to center the About dialog
            if (GetWindowRect(hDlg, &rectChild))
            {
                GetClientRect(GetParent(hDlg), &rectParent);
                DlgWidth        = rectChild.right - rectChild.left;
                DlgHeight        = rectChild.bottom - rectChild.top ;
                NewPosX                = (rectParent.right - rectParent.left - DlgWidth) / 2;
                NewPosY                = (rectParent.bottom - rectParent.top - DlgHeight) / 2;
                               
                // if the About box is larger than the physical screen
                if (NewPosX < 0) NewPosX = 0;
                if (NewPosY < 0) NewPosY = 0;
                SetWindowPos(hDlg, 0, NewPosX, NewPosY,
                    0, 0, SWP_NOZORDER | SWP_NOSIZE);
            }
            return (INT_PTR)TRUE;

        case WM_COMMAND:
                        {
                                // 调用程序
                                switch(LOWORD(wParam))
                                {
                                        case IDOK:
                                        {
                                                BOOL bRet = FALSE;
                                                bRet = ActivateKBHook(g_hInst, LowLevelKeyboardProc);                                                RETAILMSG(1, (TEXT("[TESTKEY] GET ActivateKBHook %d\r\n"), bRet));                               
                                                break;
                                        }

                                        case IDCANCEL:
                            {
                                //EndDialog(hDlg, LOWORD(wParam));
                                return TRUE;
                            }
                        }
                    break;
                }
        case WM_CLOSE:
            EndDialog(hDlg, message);
            return TRUE;

    }
    return (INT_PTR)FALSE;
}
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
mark 下
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
riccdw421....感谢!!!

先给50分....

测试完再给50分
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表