CallNextHookEx()中的wParam和lParam能传传中是什么意思值?传数字或者字符串行不行?

关于wParam和lParam的问题_百度知道
关于wParam和lParam的问题
wParam和lParam有什么不同。如过在接受鼠标和键盘消息是这两个参数有什么不同之处。
我有更好的答案
WPARAM 和 LPARAM,消息响应机制wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数: 一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。 到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。 在Win32API的早期,为了保证和Win16API的代码可移植性MS定义了WPARAM和LPARAM两个宏。 当时保留了w前缀的原因一方面是由于WPARAM宏也已W开头,还有也因为要提醒程序员注意到可移植性,当然到了现在Win16早已退出历史舞台,这个前缀也就约定俗成的沿用下来了。例如:主程序MyDlg.cpp 1.自定义消息:#define WM_TRAY WM_USER 100 2.函数原形:afx_msg LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam); 3.消息映射:ON_MESSAGE(WM_TRAY,OnTrayNotify) 4.原函数: LRESULT CMyDlg::OnTrayNotify(WPARAM wParam,LPARAM lParam) { return m_tray.OnTrayNotify(wParam,lParam); } 托盘类的实现程序Tray.cpp 成员函数: int OnTrayNotify(WPARAM wID,LPARAM lEvent) { if(wID == TRAYNOTIFYDATA.uID) return 0; if(lEvent == WM_LBUTTONDOWN){ 处理代码 } else if(lEvent == WM_RBUTTONDOWN){ 处理代码 } return 0; } WPARAM 和 LPARAM 本质上没有什么区别:都是32位数,但是区别也还是有的:除了上面几位若仁兄说的关于16位的的历史问题外,MICROSOFT在使用时两种参数分别代表不同的含义和内容,WPARAM常常代表一些控件的ID或者高位底位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递,可以参考各种控件的通知消息:可以查看:EN_CHANGE (EDIT控件的一个通知消息),CBEM_INSERTITEM(可扩展组合框的可接受消息)等等来加以领会。理论上在使用自定义消息时,WPARAM LPARAM的含义可以程序员任意指定的,但是最好遵从MFC中的习惯。在调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须按照SendMessage调用中的意义来进行。消息响应机制1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。 5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM){ switch(uMessageType) {//使用SWITCH语句将各种消息分开
case(WM_PAINT):
doYourWindow(...);//在窗口需要重新绘制时进行输出
case(WM_LBUTTONDOWN):
doYourWork(...);//在鼠标左键被按下时进行处理
callDefaultWndProc(...);//对于其它情况就让系统自己处理 }}接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法: while(1){ id=getMessage(...); if(id == quit) translateMessage(...);}当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。
采纳率:29%
看定义就一幕了然了啊:typedef UINT WPARAM;typedef LONG LPARAM;WPARAM是无符号整形,LPARAM是long型。
为您推荐:
其他类似问题
wparam的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Win32 API SendMessage 消息发送参数大全 | 大师兄选股
& Win32 API SendMessage 消息发送参数大全
最热文章分类目录
2018年七月
9101112131415
16171819202122
23242526272829C#全局键盘监听(Hook)
一.为什么需要全局键盘监听?
在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下快捷键使用此功能...
这个时候在程序中添加键盘监听肯定不能满足需求了,当用户焦点不在App上时(如最小化,或者用户在处理其它事物等等)键盘监听就失效了
二.怎样才能实现全局键盘监听?
这里需要用到Windows API,如下:(可以作为一个工具类[KeyboardHook.cs]收藏起来)
[特别说明:下面的源码来自某网友,很久以前收集的,也找不到出处了,如有版权问题请联系我]
using System.Collections.G
using System.T
using System.Runtime.InteropS
using System.Windows.F
using System.R
namespace 壁纸管家
& & /// &summary&
& & /// 键盘钩子
& & /// [以下代码来自某网友,并非本人原创]
& & /// &/summary&
& & class KeyboardHook
& & & & public event KeyEventHandler KeyDownE
& & & & public event KeyPressEventHandler KeyPressE
& & & & public event KeyEventHandler KeyUpE
& & & & public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
& & & & static int hKeyboardHook = 0; //声明键盘钩子处理的初始值
& & & & //值在Microsoft SDK的Winuser.h里查询
& & & & public const int WH_KEYBOARD_LL = 13; & //线程键盘钩子监听鼠标消息设为2,全局键盘监听鼠标消息设为13
& & & & HookProc KeyboardHookP //声明KeyboardHookProcedure作为HookProc类型
& & & & //键盘结构&
& & & & [StructLayout(LayoutKind.Sequential)]
& & & & public class KeyboardHookStruct
& & & & & & public int vkC &//定一个虚拟键码。该代码必须有一个价值的范围1至254
& & & & & & public int scanC // 指定的硬件扫描码的关键
& & & & & & &// 键标志
& & & & & & // 指定的时间戳记的这个讯息
& & & & & & public int dwExtraI // 指定额外信息相关的信息
& & & & //使用此功能,安装了一个钩子
& & & & [DllImport(&user32.dll&, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
& & & & public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
& & & & //调用此函数卸载钩子
& & & & [DllImport(&user32.dll&, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
& & & & public static extern bool UnhookWindowsHookEx(int idHook);
& & & & //使用此功能,通过信息钩子继续下一个钩子
& & & & [DllImport(&user32.dll&, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
& & & & public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
& & & & // 取得当前线程编号(线程钩子需要用到)&
& & & & [DllImport(&kernel32.dll&)]
& & & & static extern int GetCurrentThreadId();
& & & & //使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效
& & & & [DllImport(&kernel32.dll&)]
& & & & public static extern IntPtr GetModuleHandle(string name);
& & & & public void Start()
& & & & & & // 安装键盘钩子
& & & & & & if (hKeyboardHook == 0)
& & & & & & {
& & & & & & & & KeyboardHookProcedure = new HookProc(KeyboardHookProc);
& & & & & & & & hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
& & & & & & & & //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
& & & & & & & & //************************************&
& & & & & & & & //键盘线程钩子&
& & & & & & & & //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId());//指定要监听的线程idGetCurrentThreadId(),
& & & & & & & & //键盘全局钩子,需要引用空间(using System.R)&
& & & & & & & & //SetWindowsHookEx( 13,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);&
& & & & & & & & //&
& & & & & & & & //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数:&
& & & & & & & & //idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,&
& & & & & & & & //线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的&
& & & & & & & & //线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何&
& & & & & & & & //消息后便调用这个函数。hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子&
& & & & & & & & //程代码位于当前进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。threaded 与安装的钩子子程相关联的线程的标识符
& & & & & & & & //如果为0,钩子子程与所有的线程关联,即为全局钩子
& & & & & & & & //************************************&
& & & & & & & & //如果SetWindowsHookEx失败
& & & & & & & & if (hKeyboardHook == 0)
& & & & & & & & {
& & & & & & & & & & Stop();
& & & & & & & & & & throw new Exception(&安装键盘钩子失败&);
& & & & & & & & }
& & & & & & }
& & & & public void Stop()
& & & & & & bool retKeyboard =
& & & & & & if (hKeyboardHook != 0)
& & & & & & {
& & & & & & & & retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
& & & & & & & & hKeyboardHook = 0;
& & & & & & }
& & & & & & if (!(retKeyboard)) throw new Exception(&卸载钩子失败!&);
& & & & //ToAscii职能的转换指定的虚拟键码和键盘状态的相应字符或字符
& & & & [DllImport(&user32&)]
& & & & public static extern int ToAscii(int uVirtKey, //[in] 指定虚拟关键代码进行翻译。&
& & & & & & & & & & & & & & & & & & & & &int uScanCode, // [in] 指定的硬件扫描码的关键须翻译成英文。高阶位的这个值设定的关键,如果是(不压)
& & & & & & & & & & & & & & & & & & & & &byte[] lpbKeyState, // [in] 指针,以256字节数组,包含当前键盘的状态。每个元素(字节)的数组包含状态的一个关键。如果高阶位的字节是一套,关键是下跌(按下)。在低比特,如果设置表明,关键是对切换。在此功能,只有肘位的CAPS LOCK键是相关的。在切换状态的NUM个锁和滚动锁定键被忽略。
& & & & & & & & & & & & & & & & & & & & &byte[] lpwTransKey, // [out] 指针的缓冲区收到翻译字符或字符。&
& & & & & & & & & & & & & & & & & & & & &int fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise.&
& & & & //获取按键的状态
& & & & [DllImport(&user32&)]
& & & & public static extern int GetKeyboardState(byte[] pbKeyState);
& & & & [DllImport(&user32.dll&, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
& & & & private static extern short GetKeyState(int vKey);
& & & & private const int WM_KEYDOWN = 0x100;//KEYDOWN&
& & & & private const int WM_KEYUP = 0x101;//KEYUP
& & & & private const int WM_SYSKEYDOWN = 0x104;//SYSKEYDOWN
& & & & private const int WM_SYSKEYUP = 0x105;//SYSKEYUP
& & & & private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
& & & & & & // 侦听键盘事件
& & & & & & if ((nCode &= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
& & & & & & {
& & & & & & & & KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
& & & & & & & & // raise KeyDown
& & & & & & & & if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
& & & & & & & & {
& & & & & & & & & & Keys keyData = (Keys)MyKeyboardHookStruct.vkC
& & & & & & & & & & KeyEventArgs e = new KeyEventArgs(keyData);
& & & & & & & & & & KeyDownEvent(this, e);
& & & & & & & & }
& & & & & & & & //键盘按下
& & & & & & & & if (KeyPressEvent != null && wParam == WM_KEYDOWN)
& & & & & & & & {
& & & & & & & & & & byte[] keyState = new byte[256];
& & & & & & & & & & GetKeyboardState(keyState);
& & & & & & & & & & byte[] inBuffer = new byte[2];
& & & & & & & & & & if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) == 1)
& & & & & & & & & & {
& & & & & & & & & & & & KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
& & & & & & & & & & & & KeyPressEvent(this, e);
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & // 键盘抬起&
& & & & & & & & if (KeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
& & & & & & & & {
& & & & & & & & & & Keys keyData = (Keys)MyKeyboardHookStruct.vkC
& & & & & & & & & & KeyEventArgs e = new KeyEventArgs(keyData);
& & & & & & & & & & KeyUpEvent(this, e);
& & & & & & & & }
& & & & & & }
& & & & & & //如果返回1,则结束消息,这个消息到此为止,不再传递。
& & & & & & //如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者&
& & & & & & return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
& & & & ~KeyboardHook()
& & & & & & Stop();
三.如何使用上面的工具类?
//0.准备工作
//把上面的工具类添加到项目中
//1.首先导入需要的命名空间
using System.Runtime.InteropS & //调用WINDOWS API函数时要用到
using Microsoft.Win32; &//写入注册表时要用到
//2.安装Hook,在程序入口中写上下面的代码(本例中用了WinForm,在Form的构造方法中安装Hook即可)
//安装键盘钩子
k_hook = new KeyboardHook();
k_hook.KeyDownEvent += new KeyEventHandler(hook_KeyDown);//钩住键按下
k_hook.Start();//安装键盘钩子
//3.判断输入键值(实现KeyDown事件)
private void hook_KeyDown(object sender, KeyEventArgs e)
& & & & & & //判断按下的键(Alt + A)
& & & & & & if (e.KeyValue == (int)Keys.A && (int)Control.ModifierKeys == (int)Keys.Alt)
& & & & & & {
& & & & & & & & System.Windows.Forms.MessageBox.Show(&按下了指定快捷键组合&);
& & & & & & }
//注意几种不同的键值判断:
//1&.单普通键(例如A)
//2&.单控制键+单普通键(例如Ctrl+A)
//3&.多控制键+单普通键(例如Ctrl+Alt+A)
//上面的代码中演示了2,其它情况以此类推,无非就是添几个条件再&&起来就好
3.搞定了,开始测试MFC中onmessage的响应函数中wparam与lparam分别代表什么意思!是如何传递过来的呢?类型是我们自己定义的吗_百度知道
MFC中onmessage的响应函数中wparam与lparam分别代表什么意思!是如何传递过来的呢?类型是我们自己定义的吗
我有更好的答案
在MFC中,消息处理机制被PreTranslateMessage函数代替了,每条消息都经过PreTranslateMessage来分配。它是CDialog类中的一个虚函数,我们只要重载它,截获这些消息。其中pMsg中就包含了message,wParam,lParam三个参数; 后面两个参数的原型是( WPARAM
lParam)WPARAM wParam,
// first message parameterLPARAM lParam
// second message parameter 即有些消息需要附带参数,就可以在这里填写,默认均是0,即该消息不带附加参数 ; 是通过消息队列获取消息得到的,然后通过消息处理函数进行处理; 类型是 WPARAM
LPARAM ,将你要传递的信息转化为 LPARAM类型,在需要处理的地方强制转化为你的信息类型
采纳率:50%
wparam信息参数lparam信息拓展参数举个例子:在cmd中我们调用ping 命令
可以这样:ping 127.0.0.1 -5 后面的-5就如wparam
为您推荐:
其他类似问题
wparam的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。WinAPI:CallNextHookEx调用下一个钩子_百度经验
&&&&&&互联网WinAPI:CallNextHookEx调用下一个钩子
百度经验:jingyan.baidu.com今天达内培训为大家分享的是有关WinAPI: CallNextHookEx之调用下一个钩子的代码,希望大家喜欢。CallNextHookEx(  hhk: HHOOK;     {当前钩子的句柄} nCode: I {钩子代码; 就是给下一个钩子要交待的}  wParam: WPARAM; {要传递的参数;由钩子类型决定是什么参数}  lParam: LPARAM  {要传递的参数; 由钩子类型决定是什么参数}): LRESULT;      {会返回下一个钩子执行后的返回值; 0 表示失败}//参数 nCode 的可选值:HC_ACTION      = 0;     {}HC_GETNEXT     = 1;    {}HC_SKIP        = 2;     {}HC_NOREMOVE    = 3;     {}HC_NOREM =HC_NOREMOVE; {}HC_SYSMODALON  = 4;     {}HC_SYSMODALOFF = 5;     {}& 以上就是达内为大家总结的有关WinAPI:CallNextHookEx 之调用下一个钩子的代码,相信能够对大家有一定的帮助。经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。投票(0)已投票(0)有得(0)我有疑问(0)◆◆说说为什么给这篇经验投票吧!我为什么投票...你还可以输入500字◆◆只有签约作者及以上等级才可发有得&你还可以输入1000字◆◆如对这篇经验有疑问,可反馈给作者,经验作者会尽力为您解决!你还可以输入500字相关经验0017150热门杂志第1期你不知道的iPad技巧3801次分享第1期win7电脑那些事6653次分享第2期新人玩转百度经验1417次分享第1期Win8.1实用小技巧2660次分享第1期小白装大神1939次分享◆请扫描分享到朋友圈}

我要回帖

更多关于 传中是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信