2 yangtianyu2004 yangtianyu2004 于 2016.01.16 11:48 提问

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

为方便起见,许多情况下要用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
91program   Ds   Rxr 2016.01.16 12:32

改成 PostMessage 试试

yangtianyu2004
yangtianyu2004 原来还能收到个WM_NULL,改成postmessage之后什么也收不到了
接近 2 年之前 回复
yangtianyu2004
yangtianyu2004 改了,但是不起作用。
接近 2 年之前 回复
oyljerry
oyljerry   Ds   Rxr 2016.01.16 12:49

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

yangtianyu2004
yangtianyu2004 改了,但是不起作用。这个处理过滤是怎么回事啊,为什么Destroywindow能正常使用?
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!