VB2010 API函数具体用法
PublicDeclareFunctionGdiTransparentBltLib"gdi32"(ByValhdc1AsInteger,ByValx1AsInteger,...
Public Declare Function GdiTransparentBlt Lib "gdi32" (ByVal hdc1 As Integer, ByVal x1 As Integer, ByVal y1 As Integer, ByVal W1 As Integer, ByVal H1 As Integer, ByVal hdc2 As Int32, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal W2 As Integer, ByVal H2 As Integer, ByVal color As Integer) As Integer
‘由于是vb2010,因此作此声明 用long型无法通过
’ PictureBox1已装载图
GdiTransparentBlt Me.Handle, 0, 0, 20, 20, PictureBox1.Handle, 0, 0, 22, 20, RGB(0, 255, 0))
屏幕上没有绘制出来,是不是需要什么设置?
另外
Thwnd = FindWindow(vbNullString, "测试.txt - 记事本")
'Thwnd可以找到,此处通过
SendMessage(Twnd, WM_KEYDOWN, 96, 0&)
'无效。
注意 是vb2010 展开
‘由于是vb2010,因此作此声明 用long型无法通过
’ PictureBox1已装载图
GdiTransparentBlt Me.Handle, 0, 0, 20, 20, PictureBox1.Handle, 0, 0, 22, 20, RGB(0, 255, 0))
屏幕上没有绘制出来,是不是需要什么设置?
另外
Thwnd = FindWindow(vbNullString, "测试.txt - 记事本")
'Thwnd可以找到,此处通过
SendMessage(Twnd, WM_KEYDOWN, 96, 0&)
'无效。
注意 是vb2010 展开
2个回答
展开全部
一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:
声明的语法是:
Private Declare Function ...
Private Declare Sub.....
这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。
如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
先添加一个模块,
然后采用如下语法声明:
Public Declare Function....
Public Declare Sub....
Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。声明完毕我们就能在程序中使用此API函数了。
二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:
(1)忽略函数返回值的调用:
SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
注意此时函数的参数是不加括号的。
(2)Call方法调用:
Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
注意这里需要加上括号,但我们不取回函数的返回值。
(3)取得函数返回值的调用:
MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。
三、几个问题的说明:
(1)Lib 和 Alias 的说明
一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。
Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。
(2)常见的API参数类型的说明
API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。
(3)声明中的ByVal的作用
这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,
这样VB就采用传值方式传递参数了。
声明的语法是:
Private Declare Function ...
Private Declare Sub.....
这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。
如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
先添加一个模块,
然后采用如下语法声明:
Public Declare Function....
Public Declare Sub....
Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。声明完毕我们就能在程序中使用此API函数了。
二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:
(1)忽略函数返回值的调用:
SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
注意此时函数的参数是不加括号的。
(2)Call方法调用:
Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
注意这里需要加上括号,但我们不取回函数的返回值。
(3)取得函数返回值的调用:
MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。
三、几个问题的说明:
(1)Lib 和 Alias 的说明
一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。
Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。
(2)常见的API参数类型的说明
API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。
(3)声明中的ByVal的作用
这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,
这样VB就采用传值方式传递参数了。
展开全部
vb.net本身即可实现此功能,无需API函数
System.Drawing.Bitmap.MakeTransparent
System.Drawing.Bitmap.MakeTransparent
追问
sendmessage的问题我自己知道错在哪里了,是句柄不对,需要找到notepad的文本框控件的句柄,至于.net本身的System.Drawing.Bitmap.MakeTransparent……我有空再试试看,不过还是想知道为什么GdiTransparentBlt 无效,是本身不再支持还是我哪里有问题。(例如form设置等等)
追答
没有用过这个函数,但是无论如何,不能将VB6的API定义照抄到Vb.net,因为两者的数据格式不完全一样,例如vb6中的参数是Long类型,到了VB.NET就要改成Integer类型,等等等等。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询