5176|9

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教wince键盘钩子的问题 [复制链接]

系统平台:wince
开发语言:evc4.0
程序功能:编写键盘钩子,截取VK_UP消息,运行程序FDS.exe

问题:
点击键盘的向上按钮,可以运行FDS。exe程序,但是是弹出两个FDS.exe,比较头疼,没有找到解决的办法,过来请教一下。


键盘钩子的回调函数为:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
        if (nCode == HC_ACTION)
        {
                if (((KBDLLHOOKSTRUCT*)lParam)->vkCode == VK_UP )
                {
                        SHELLEXECUTEINFO ShExecInfo = {0};
                ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
                        ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
                        ShExecInfo.hwnd = NULL;
                        ShExecInfo.lpVerb = NULL;
                        ShExecInfo.lpFile = TEXT("\\SDMEM\\FDS.exe");
                        ShExecInfo.lpParameters = NULL;       
                        ShExecInfo.lpDirectory = 0;
                        ShExecInfo.nShow = SW_SHOW;
                        ShExecInfo.hInstApp = NULL;       
                        ShellExecuteEx(&ShExecInfo);
                }
        }
        return 1;
}



大家看看是什么问题?

最新回复

问题已经解决 思路: 采用共享变量(dll中)m_hinstance=0; 打开FDS.exe,在初始化中,m_hinstance=1; 关闭的时候 m_hinstance=0; dll键盘钩子程序,添加一个判断m_hinstance值的语句 如果为0 弹出FDS.exe 如果为1 不弹出 说明FDS.exe已经由一个在运行了 谢谢各位~ 结贴给分  详情 回复 发表于 2010-5-20 10:28
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
键盘钩子必须是全局的,即必须以DLL方式存在
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 91program 的回复:
键盘钩子必须是全局的,即必须以DLL方式存在


对  是采用了dll方式写的 也是全局的
问题出在了
点击键盘上的按钮  dll里面的回调函数如上所示
相应了两次
也就是弹出了两个FDS.exe程序
按道理来讲,应该是点击按钮 直接弹出一个FDS.exe程序

您知道什么问题不?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
加个约束条件
if(wParam == WM_SYSKEYUP)
{
//ShellExecuteEx(&ShExecInfo);
}

键盘抬起时,会触发两次,wParam可能为WM_SYSKEYUP也可能WM_KEYUP
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 crystal28 的回复:
加个约束条件
if(wParam == WM_SYSKEYUP)
{
//ShellExecuteEx(&ShExecInfo);
}

键盘抬起时,会触发两次,wParam可能为WM_SYSKEYUP也可能WM_KEYUP


恩  采用了判断
if(wParam == WM_KEYUP)
{
}
不再弹出两个应用程序  
呵呵
问题解决~~
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 crystal28 的回复:
加个约束条件
if(wParam == WM_SYSKEYUP)
{
//ShellExecuteEx(&ShExecInfo);
}

键盘抬起时,会触发两次,wParam可能为WM_SYSKEYUP也可能WM_KEYUP


解决的弹出两个程序的问题
目前还有一个问题:
由于使用了全局钩子,点击一次向上键(VK_UP )弹出一个FDS.exe.
怎样判断在没有关闭FDS.exe时,点击向上键不再弹出FDS.exe呢?
谢谢~~~~
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习了,各位大虾
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
保证FDS.exe只有一个实例就行了。具体实现方法google一下有很多
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
MARK
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题已经解决
思路:
采用共享变量(dll中)m_hinstance=0;
打开FDS.exe,在初始化中,m_hinstance=1;
关闭的时候
m_hinstance=0;


dll键盘钩子程序,添加一个判断m_hinstance值的语句
如果为0 弹出FDS.exe
如果为1 不弹出 说明FDS.exe已经由一个在运行了


谢谢各位~
结贴给分
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表