vb.net-为什么MFC里可以引用的API函数,到VB.NET却不能用?

问题描述

为什么MFC里可以引用的API函数,到VB.NET却不能用?

为方便起见,许多情况下要用Winform来代替MFC,于是我选择了用VB语言编写程序。其中为了窗口的通信,要用到sendmessage函数。

查阅了许多关于VB的资料(或许 VB6 与 VB.NET 的规则有点不同),编写代码如下。这个代码的目的很简单:就是要让Form1的button1被按下时候,关掉Form2。

要想达到这个目的,需要Form1对Form2发出WM_CLOSE消息。

使用工具是VS2010。

在一个project下面有三个代码:

这是发送WM__CLOSE信息的窗口:

 Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Form2.Visible = True
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim kkk As Long
        kkk = SendMessage(Form2.Handle, WM_CLOSE, 0&, 0&) '关闭窗口的语句

        ' DestroyWindow(Form2.Handle) ’也是关闭窗口的语句,这里弃用
    End Sub
End Class

在VB里,所有API函数、所有常数,都需要用户声明。

 Module Module1
    Const SW_SHOWNORMAL = 1
    Const SW_SHOW = 5
    Const SW_SHOWMAXIMIZED = 3
    Const SW_SHOWDEFAULT = 10
    Public Const WM_CLOSE = &H10 '这是我所定义的常数
    Public Const WM_DESTROY = &H2
    Public Const WM_COPYDATA = &H4A
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal handle As Long, ByVal WM_WINDOW As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'这是我所声明的API函数
    Public Declare Sub PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
    Public Declare Function DestroyWindow Lib "user32" Alias "DestroyWindow" (ByVal hwnd As Long) As Long
    Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function ShowWindowAsync Lib "user32" Alias "ShowWindowAsync" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

End Module

这是接收WM__CLOSE 信息的窗口:

 Public Class Form2

End Class

DestroyWindow函数可以成功地关掉任何一个窗口。

而SendMessage函数却根本不起作用。为何窗口关不掉?是没发吗?

请出大侦探 spy++ 一查,发现无论参数是多少,目标窗口收到的永远都是WM_NULL (就是0)!

这说明,第一个参数(窗口句柄)对了,第二个参数(消息序号)错了。

这究竟是是Form1 发错了,还是 Form2 收错了?不得而知。

解决方案

改成 PostMessage 试试

解决方案二:

你的句柄正确的话,就是消息发送问题。比如post而不是send。消息窗口是否处理,过滤

时间: 2025-01-27 00:57:51

vb.net-为什么MFC里可以引用的API函数,到VB.NET却不能用?的相关文章

动态调用dll-C#如何动态调用VB编译的dll里的函数

问题描述 C#如何动态调用VB编译的dll里的函数 有一个VB的工程项目,里面有很多类,每个类里都有相同的函数: 比如 a工程:类模块里有 b类,c类:而b类和c类都有相同的函数d: 我怎么在C#里动态调用b类的d函数呢? 因为是动态调用,所以不能是直接引用dll,再"对象名.函数名": DLLImport和反射都尝试过,关键是我要定位到某个类的那个函数,就不知道怎么弄,麻烦大神帮帮忙

用VB在word文件里插入横跨两个section的表格

问题描述 用VB在word文件里插入横跨两个section的表格 我的word文件有两个section,第一页是section1,后面的都是section2.分成两个section是因为我header部分的高度不同. 现在我想用vb插入一个3行7列的表格,其中第三行的单元格合并成一个,里面有大量文字,一页不够会到第二页.现在我直接用vb插入的时候表格会横跨第一第二页,都是section1,然后第三页是section2. 我想让超出第一页的部分直接在section2继续,应该怎样用vb完成? 谢谢

mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊

问题描述 mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊 mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊!! 解决方案 直接用SQL语句控制记录. 解决方案二: 文档 数独求解"> 解决方案三: 我是这样插入的

c++里常量引用的问题(函数)

问题描述 c++里常量引用的问题(函数) 常量引用是什么意思,比如有一个类p,然后一个函数int f(const & p),这个函数是p的成员函数,要怎么调用他,函数体的形参怎么写.求解释谢谢啦 解决方案 求大神给举个例子真心谢谢了 解决方案二: 常量引用主要是用来表明函数的行为,就是这个参数是引用,而且是常量的,函数内部应该不会对这个引用的对象进行修改处理.只是只读的操作 解决方案三: class P { public: int fun(const int& tmp) { cout<

引用函数-c++怎么在view里的一个函数引用的函数里再引用一个函数?

问题描述 c++怎么在view里的一个函数引用的函数里再引用一个函数? 下面第一个函数就是我想要在第二个函数里面用的,而第二个函数是第一个引用的 void CZHANGMIN1View::InsertSort(unsigned char pArray, int iLength) { unsigned char tmp; int i, j; for(i = 1; i < iLength; i++) { j = i-1; tmp = pArray[i]; while(j >= 0 &&am

vb 串口发送16进制-Vb将文本框里输入的十进制数据按chr(13)分割,然后转换成&amp;amp;amp;h+16进制字符串形式

问题描述 Vb将文本框里输入的十进制数据按chr(13)分割,然后转换成&h+16进制字符串形式 例如文本框里输入253chr(13)255chr(13),要求输出结果书"&HFD" "&HFF",看了好多算法,但是还是没有研究出来. 我自己做的结果如下 Private Sub Text2_KeyPress(KeyAscii As Integer) Dim tmp() As String Dim aa As String * 1 Dim rd

vc++-MFC里如何判断控件失去了焦点

问题描述 MFC里如何判断控件失去了焦点 我想在一个编辑框失去焦点时判断输入的是否正确,请问该如何判断失去了焦点? 解决方案 不需要自己写,直接用ddv/ddxhttp://blog.csdn.net/laogaoav/article/details/20764231http://blog.sina.com.cn/s/blog_6c8fad9f01011yxg.htmlhttp://blog.csdn.net/zhangyang0402/article/details/3948144 解决方案二

mfc求助-我是新手,MFC里edit Control控件怎么用

问题描述 我是新手,MFC里edit Control控件怎么用 怎么用edit Control输出?网上查的没看懂,谁能帮忙详细讲一讲怎么用?最好能有实例讲一下,谢谢 解决方案 在vs左边展开文件视图,找到对话框,找到你的对话框 然后从工具箱中拖动一个编辑框到你的界面上 ctrl+c调出class wizard,映射一个cstring的成员变量给它. 然后在你的代码中直接用: 比如 updatedata(); cstring str = m_edit1; 解决方案二: MFC中VALUE和CON

播放器-MFC里listbox如何双击打开选中行

问题描述 MFC里listbox如何双击打开选中行 MFC做媒体播放器的播放列表时, 我是用了listbox显示播放列表.添加双级响应消息后,写入代码 int nSel = m_listbox.GetCurSel(); m_player.put_URL(m_media.get_sourceURL()); 想用put_URL函数打开选中歌曲,但是m_media.get_sourceURL()函数返回的地址是每次添加歌曲过后的那一首歌曲的地址, 也就是双击每一项只能打开最后添加的一首歌曲, 有没有什