转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
VB5.0与Windows API 间的呼叫技巧         ★★★★

VB5.0与Windows API 间的呼叫技巧

作者:闵涛 文章来源:闵涛的学习笔记 点击数:3271 更新时间:2009/4/23 18:58:23
----------------
有没有注意到第三个参数它是一个 ByVal的Long,指的是存放某一个EVENTMSG的位址,
而先前我们提过,自定型态的参数传递要使用ByRef的方式才能解决,天啊!它用ByVal
的方式来做,如果是C语言,那不成问题,只要如下:

-----------------------------------------------------------------------------
EVENTMSG *p;
P = (EVENTMSG *) lParam;
-----------------------------------------------------------------------------
如此便可以用 *p->message 之方式来取得内容,但VB呢?这里便要用些小技巧了,试
想,如果我们能依lParam所指的位址,一个Byte一个Byte的Copy到一个EVENTMSG的变

上面,不就可以了吗?所以了, CopyMomory这个函式派上用场了,但是 CopyMomory的
原始宣告如下,前面两个参数都是ByRef的方式,但目前对我们有的是lParam的内容(假
设是lParam = 25600, Address of lParam = 100100),如果我们使用底下的宣告,而去
呼叫
-- 宣告一 ----------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy as Long)

CopyMomory msg , lParam, Lenb(msg)
-----------------------------------------------------------------------------
那麽WinAPI RtlMoveMemory会得到第二个参数值=100100,而使指标指到100100的位址
,那麽就得不到想要的资料了 (因资料在25600的位址上)。所以我们改变原始宣告,将
之变成宣告二的样子,如此VB 第二个参数的作法会传出25600(因为ByVal嘛)给RtlMoveMe
mory,那不就成功了吗?

----宣告二 ---------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy as Long)

CopyMomory msg , lParam, Lenb(msg)
-----------------------------------------------------------------------------
或许这RtlMoveMemory您在许多地方都会用上,前两个参数时而要ByRef, 时而需
ByVal,那是否就要定义四个宣告来因应不同之需,其实也不用,上面的例子中,只要
宣告成宣告一的样子,但是呼叫时改成:

CopyMemory msg, ByVal lParam, Lenb(msg)

在第二个参数前加上ByVal这样这可以了啦。

这里还有另外一个做法,那就是从Hook Procedure的宣告著手,别忘了,Hook Pro
cedure是Window所呼叫的,所以它传给我们定义的HookProc()时,第三个参数以先前的
举例来说便是传入25600,那麽,我们将HookProc()改定义成:

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long, _
lParam As Long) As Long
-----------------------------------------------------------------------------
第三个参数变成 ByRef的方式传入,所以了,用msg = lParam来取代CopyMemory的
作法, 嘛可以通啦!即如下:

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long, _
lParam As Long) As Long ''''lParam改成ByRef
msg = lParam
'''' CopyMemory msg, lParam, Lenb(msg) //这行可省啦
If (msg.message >= WM_KEYFIRST _
And msg.message <= WM_KEYLAST) Then
Debug.Print msg.message, msg.paramH
End If
HookProc = CallNextHookEx(hHook, code, wParam, lParam)
End Function
-----------------------------------------------------------------------------

上一页  [1] [2] [3] 


[VB.NET程序]Auto Complete combo Box(VB.NET Source Use API…  [VB.NET程序]在 VB 中使用 Unicode API
[VB.NET程序]API 更改系统菜单条目  [VB.NET程序]在VB中调用Windows API的注意事项
[VB.NET程序]vb调用winInet API接口post数据到指定的url  [VB.NET程序]如 何 用 API 播 放 CD
[VB.NET程序]在VB6中用WINDOWS API函数读写INI文件  [VB.NET程序]Visual Basic调用Windows API函数的应用举例
[VB.NET程序]VB + API 获取 IE 的 代理服务器 配制  [Delphi程序]Windows API函数使用技巧
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台