记录着 2016-01-16 03:48 采纳率: 0%
浏览 1426
已结题

为什么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 收错了?不得而知。

  • 写回答

2条回答 默认 最新

  • 91program 博客专家认证 2016-01-16 04:32
    关注

    改成 PostMessage 试试

    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?