none
VB 2008 如何向其他窗体发送关闭指令 RRS feed

  • 问题

  • 我知道一个窗体的标题,需要在 VB 2008 中将其结束。

    这是 VB 6 中向窗口 Form2 发送消息并令其关闭的代码:

            Dim Handle
            Handle = FindWindow(vbNullString, "Form2")   '获取 Form2 的句柄
            MsgBox("Handle " & Handle)
            If Handle <> 0 Then
                Handle = SendMessage(Handle, WM_CLOSE, 0, 0)     '向 Form2 发送关闭消息
                MsgBox("Handle" & Handle)
            End If

    将其复制到到 VB2008 中只能得到两个Handle 都有不为0 的值,却并不能关闭 Form2。

    注:那些 API 都定义了,常量也指定了,这是从 VB 6 中已运行通过的项目中复制过来的。Form2 在本窗体显示后,随及显示,此过程中 Form2 显示后调用,结果,却得到两个不相等、但都不为 0 的值。

     

    不知道是不是 VB 2008 (Visual Studio 2008 组件之一)中的消息机制与之前的不一样了,希望有人赐教,不甚感激!

    2008年11月14日 4:39

答案

  • Code Snippet

     Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
        Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
          (ByVal hwnd As Integer, _
          ByVal wMsg As Integer, _
          ByVal wParam As Integer, _
          ByVal lParam As Integer) As Integer
        Public Const WM_CLOSE = &H10

     

     

    .NET数据类型是32位的
    2008年11月14日 5:21
    版主

全部回复

  • 你的API定义?

     

    2008年11月14日 5:13
    版主
  • 这是我的定义:

        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
        Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
          (ByVal hwnd As Long, _
          ByVal wMsg As Long, _
          ByVal wParam As Long, _
          ByVal lParam As Long) As Long
        Public Const WM_CLOSE = &H10

     

    运行时,能获得两次 MsgBox 消息,提示 Handle 的值,都不为 0 而且不相等;当然,事实是,我的 Form2 窗口并没有被关闭

    2008年11月14日 5:15
  • Code Snippet

     Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
        Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
          (ByVal hwnd As Integer, _
          ByVal wMsg As Integer, _
          ByVal wParam As Integer, _
          ByVal lParam As Integer) As Integer
        Public Const WM_CLOSE = &H10

     

     

    .NET数据类型是32位的
    2008年11月14日 5:21
    版主
  •  

    相当感谢,问题已解决!又长了知识

    另外,问一句,以后是不是就不能将函数声明为 As Long 呢?还是何时声明成什么呢?

    2008年11月14日 5:33
  • 用同样长度的数据类型

     

    VB6中Long是32位的

     

    2008年11月14日 5:49
    版主