Ошибка AddressOf в EnumChildWindows

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Ошибка AddressOf в EnumChildWindows

Сообщение viter.alex » 07.10.2009 (Ср) 15:59

Почему выдает ошибку?
AddressOf' expression cannot be converted to 'Long' because 'Long' is not a delegate type.

Код формы
Код: Выделить всё
Imports WastesRegister.clWinApi
Public Class frmMain
   Dim hwndDXF As Long
  Dim nTop As Single
  Dim nLeft As Single

  Private Sub btnFindChildWindows_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindChildWindows.Click
    EnumChildWindows(hwndDXF, AddressOf EnumChildWindowsProc, &H0)
  End Sub

  Private Function EnumChildWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim oNewLbl As New Label
    Static i As Long
    With oNewLbl
      .Text = i.ToString & " hwnd = &H" & Hex(hwnd).ToString
      .Top = nTop + 6
      nTop = .Top
      nTop = .Top + .Height
      .Left = nLeft
      .Visible = True
    End With
    Me.Controls.Add(oNewLbl) : i += 1
    EnumChildWindowsProc = True
  End Function

  Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    nTop = Label1.Top + Label1.Height
    nLeft = Label1.Left
  End Sub
End Class

Объявления функций API
Код: Выделить всё
Public Class clWinApi
  Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
  Public Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Int32
  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 Int32
End Class
Лучше день потерять — потом за пять минут долететь!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка AddressOf в EnumChildWindows

Сообщение FireFenix » 07.10.2009 (Ср) 16:11

В VB - Long, в VB.NET - Integer как бы

и вообще для этого в .NET существует <DllImport>, типа :
Код: Выделить всё
<DllImport("user32", CharSet:=CharSet.Auto)> _
Public Function SendMessage(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Integer
End Function
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Ошибка AddressOf в EnumChildWindows

Сообщение viter.alex » 07.10.2009 (Ср) 16:16

Заменил Long на Int32, но результат тот же
'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.
Лучше день потерять — потом за пять минут долететь!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка AddressOf в EnumChildWindows

Сообщение FireFenix » 07.10.2009 (Ср) 16:28

Третий линк с гугла
Код: Выделить всё
Imports System.Runtime.InteropServices

Public Class Form1
    Private Const WM_GETTEXTLENGTH As Integer = &HE
    Private Const WM_GETTEXT As Integer = &HD

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function FindWindowEx(ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Calcu As IntPtr = FindWindow(Nothing, "calculator")
        Dim editx As IntPtr = FindWindowEx(Calcu, IntPtr.Zero, "edit", Nothing)
        Dim length As Integer = CInt(SendMessage(editx, WM_GETTEXTLENGTH, 0, 0))
        Dim textr As System.Text.StringBuilder = New System.Text.StringBuilder(length)
        Dim hr As Integer = CInt(SendMessage(editx, WM_GETTEXT, length + 1, textr))

        MsgBox(textr.ToString)
    End Sub
End Class
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Ошибка AddressOf в EnumChildWindows

Сообщение viter.alex » 07.10.2009 (Ср) 16:46

Спасибо за уточнение. Почему именно так нужно объявлять API функции? Ведь у меня FindWindow работала и с обычным Declare.
Но это все равно не решило проблему. Функция, вынесенная в заголовок темы, так и не работает, ошибка никуда не исчезла
Лучше день потерять — потом за пять минут долететь!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка AddressOf в EnumChildWindows

Сообщение FireFenix » 07.10.2009 (Ср) 16:58

Виноват, забыл про AddressOf

AddressOf возвращает не Integer, а делегат. Нуна
Код: Выделить всё
Imports System.Text
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Console.WriteLine("Begin...")

        EnumWindows(New EnumWindowsProc(AddressOf EnumFunc), IntPtr.Zero)

        Console.WriteLine("End.")
    End Sub

    Private Shared Function EnumFunc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean
        Const WM_CLOSE As UInteger = &H10

        Dim wndCaption As New StringBuilder(1024)

        GetWindowText(hWnd, wndCaption, 1024)

        If wndCaption.ToString() = "Калькулятор" Then
            Console.WriteLine("Got it!")
            PostMessage(hWnd, WM_CLOSE, 0, 0)
            Return False
        Else
            Return True
        End If
    End Function

    Private Delegate Function EnumWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

    <DllImport("User32.dll")> _
    Private Shared Function EnumWindows(ByVal enumFunc As EnumWindowsProc, ByVal lParam As IntPtr) As Boolean
    End Function

    <DllImport("User32.dll")> _
    Private Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Boolean
    End Function

    <DllImport("User32.dll")> _
    Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As UInteger, ByVal lParam As UInteger) As Boolean
    End Function
End Class
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Ошибка AddressOf в EnumChildWindows

Сообщение viter.alex » 08.10.2009 (Чт) 14:04

Спасибо, разобрался. Не совсем понятен механизм работы с делегатами, но думаю, что разберусь.
Лучше день потерять — потом за пять минут долететь!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Ошибка AddressOf в EnumChildWindows

Сообщение Nord777 » 08.10.2009 (Чт) 16:05

Не совсем понятен механизм работы с делегатами, но думаю, что разберусь.
Делегат - это указатель на функцию. Безопасный указатель.
Это значит, что все параметры проверяются на соответствие.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

    TopList