5376|12

51

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在mobile下怎麽用hook编程 [复制链接]

我想请问一下,在mobile下编程可以用hook钩子函数吗?和在windows下用是一样的吗?我最近在编写一个在mobile下测试Pocket PC Device上的键盘,有的键截获不到,所以想试试用钩子函数,来截获键盘消息,各位高手在mobile下用过钩子函数吗?有的话,指点一下吧,最好是能给我一些例子借鉴一下啊

最新回复

非常感谢大家的帮助,我已经解决这个问题啦!  详情 回复 发表于 2008-2-11 08:37
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
up
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不支持鼠标hook,键盘hook跟windows有些不一样。
请参考 http://blog.eeworld.net/jkflyfox/archive/2007/02/07/1504176.aspx
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
一个键盘钩子只能截获一个键吗?我这里有好几个都要用键盘钩子阿,http://blog.eeworld.net/jkflyfox/archive/2007/02/07/1504176.aspx上面说用两个键盘钩子就会出错,那我不是不能用拉,不知道还有没有其他办法啊
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
一个键盘钩子只能截获一个键吗?不对啊,我用一个键盘钩子,截获了键盘上所有按键的!
LZ可以去我的BLOG看看:http://blog.eeworld.net/91program/archive/2007/12/23/1961570.aspx
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢指点,想问一下91program,Pwinuser.h这个头文件在哪里啊,编译时找不到阿
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
91program,你那个程序是在wince4.2下写的吧,我现在要在wince5.0下写,Pwinuser.h和BasalMessage.h头文件都没有,在wince5.0下要用哪些头文件阿
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
在wince下是不是还可以用hotkey来截获键盘消息阿,RegisterHotKey函数好像一次只能设置一个键吗?那样的话不是好麻烦,请高手指点一下在wince下怎麽截获所有的键盘消息阿
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
高手们,帮帮我啊
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
我是在CE5.0下完成的,在标准的SDK中,是没有Pwinuser.h的,但它是系统文件。可以在PB的目录下,找到它。
BasalMessage.h是自定义的,不一定需要的。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

11
 
91program:你好,你的那个写的dll的那个程序还是不太懂啊,能不能把你截获所有键盘消息的例子完整的发给我看看阿?我的邮件是Ma.Li-Yan@iac.com.tw,我会非常感谢的,拜托拉!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个就是给 Mobile 5.0下可以运行的代码.你可以看一下

#include "stdafx.h"
#include "winceKBhook.h"

//globals
HINSTANCE  g_hHookApiDLL        = NULL;                        //handle to coredll.dll, where all the hook related APIs are present
HHOOK g_hInstalledLLKBDhook = NULL;                        //g_hInstalledLLKBDhook represents handle to the installed KB hook
HINSTANCE hInst=NULL;                                        //引用实例的名柄

BOOL TimeInterval(LPSYSTEMTIME OldTime,LPSYSTEMTIME NowTime,int Interval);
/**
*        Function Name:ActivateKBHook
*       
*        Function Desc:Initializes the proc. adress of various hook related APIs.
*                                  Loads the keyboard hook.
*
*        Parameters:
*                                 HINSTANCE hInstance : handle to the application to be hooked
*                                 HOOKPROC LLKeyboardHookCallbackFunction : procedure where the control will come to after any KB event.
*        Returns:       
*                                 true if we get all the proc addresses of hook related APIs and load the hook succesfully
*                                 false if any of the above fails
*
*        Author:                 Prathamesh Kulkarni
**/
BOOL ActivateKBHook(HINSTANCE hInstance)
{
        //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;
        hInst=hInstance;
        //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
                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
                        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, KeyboardProc, hInstance, 0);
                        if(g_hInstalledLLKBDhook == NULL)
                        {
                                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)
                {
                        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)
                {
                        return false;
                }
        }

        //all the APIs are loaded and the application is hooked
        return true;
}

BOOL DeactivateKBHook()
{
        //unload the hook
        if(g_hInstalledLLKBDhook != NULL)
        {
                UnhookWindowsHookEx(g_hInstalledLLKBDhook);
                g_hInstalledLLKBDhook = NULL;
        }

        //unload the coredll.dll
        if(g_hHookApiDLL != NULL)
        {
                FreeLibrary(g_hHookApiDLL);
                g_hHookApiDLL = NULL;
        }       
        //we have terminated gracefully
        return true;
}

//----------------------------------------------------------------------
// SetVideoPower - Turns on or off the display
//设定显示屏开关
int SetVideoPower (BOOL fOn) {
        VIDEO_POWER_MANAGEMENT vpm;
        int rc, fQueryEsc;
        HDC hdc;
        // Get the display dc.
        hdc = GetDC (NULL);
        // See if supported.
        fQueryEsc = SETPOWERMANAGEMENT;
        rc = ExtEscape (hdc, QUERYESCSUPPORT, sizeof (fQueryEsc),
                (LPSTR)&fQueryEsc, 0, 0);   //查询系统是否支持关闭屏幕
        if (rc == 0) {
                // No support, fail.
                ReleaseDC (NULL, hdc);
                return -1;
        }
        // Fill in the power management structure.
        vpm.Length = sizeof (vpm);
        vpm.DPMSVersion = 1;
        if (fOn==false)
                vpm.PowerState = VideoPowerOn;
        else
                vpm.PowerState = VideoPowerOff;
        // Tell the driver to turn on or off the display.
        rc = ExtEscape (hdc, SETPOWERMANAGEMENT, sizeof (vpm),
                (LPSTR)&vpm, 0, 0);   
        // Always release what you get.
        ReleaseDC (NULL, hdc);
        return 0;
}


LRESULT   CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
        static        DWORD KeyValues=0;//报警键的键值
        static        bool        FirstValue=true;//0为假,非0为真
        static BOOL Lock=false;//true锁屏,False打开
        static LPSYSTEMTIME  timeDown=new SYSTEMTIME();;//键按下时间
        static LPSYSTEMTIME  timeUp=new SYSTEMTIME();//键抬起时间

        if(((KBDLLHOOKSTRUCT*)lParam)->vkCode ==134)
        {
                //Generate the keyboard press event of the mapped key
                if(wParam==256&&true==FirstValue)
                {
                        GetSystemTime(timeDown);
                        FirstValue=false;
                }
                if(wParam==257)
                {
                        GetSystemTime(timeUp);
                        FirstValue=true;
                        if(TimeInterval(timeDown,timeUp,2))
                        {
                                Lock=!Lock;
                                if(Lock==true)//启动应用程序
                                {
                                BOOL result1=CreateProcess(TEXT("\\Program Files\\SmartWin32_Alarm\\SmartWin32_Hook.exe"),TEXT(""), NULL, NULL,FALSE, 0, NULL, NULL, NULL, NULL);                        
                                }
                        }
                }
        }
        if(Lock==false)
        {
                SetVideoPower (Lock);
                return CallNextHookEx(g_hInstalledLLKBDhook, nCode,wParam, lParam);
        }
        else
        {
                SetVideoPower (Lock);
                //GPRSConnect *conn=new GPRSConnect();
                //conn->Connnection();
                //conn->StartThread();
                return 10;
        }
        return 10;
}



BOOL TimeInterval(LPSYSTEMTIME OldTime,LPSYSTEMTIME NowTime,int Interval)
{
        if(NowTime->wHour==OldTime->wHour)
        {
                if(NowTime->wMinute==OldTime->wMinute)//分钟相同
                {
                        if(NowTime->wSecond-OldTime->wSecond>Interval)
                        {
                                return true;
                        }
                }
                else
                {
                        return true;
                }
        }
        return false;
}
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
非常感谢大家的帮助,我已经解决这个问题啦!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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