none
"FindWindow" liefert falsche Werte RRS feed

  • Frage

  • Hallo Leute,

    mir ist aufgefallen, dass die besagte Funktion falsche Werte liefert:

    Dim DesthWnd As Long : DesthWnd = FindWindow(vbNullString, "Microsoft Outlook") : If DesthWnd = 0 Then Exit Sub

    Als ergebnis für "DesthWnd" bekomme ich ne lange Zahl auch wenn Outlook komplett geschlossen ist. Selbst wenn ich nach nem Buchstabensalat suche, bekomme ich einen positiven Wert. Die selbe Funktion liefert unter VB6 korrekte Werte (z.B. wenn Outlook geschlossen ist, bekomme ich ls Antwort eine 0.

    Muss man unter VB2010 was beachten oder anders einstellen?

    Danke  :-)

    Donnerstag, 16. Februar 2012 16:18

Antworten

Alle Antworten

  • Hallo Philipp,

    das Problem ist Dein (wohl aus VB Classic übernommener) Interop-Aufruf,
    für die richtige Signatur siehe PInvoke.NET FindWindow

    Allgemeiner:
    Man sollte keine VB Classic Interop-Aufrufe unbesehen übernehmen.
    Handles (Fenster und mehr) sind in .NET generell IntPtr, da sich ihre Größe je nach x86 / x64 unterscheidet.

    Gruß Elmar

    Donnerstag, 16. Februar 2012 18:21
    Beantworter
  • Hallo Philipp B._,

    Schau Dir mal folgenden Code an. Vielleicht kannst Du es durch Process machen.

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        <DllImport("user32.dll", SetLastError:=True)> _
        Private Shared Function SetActiveWindow(ByVal hWnd As IntPtr) As IntPtr
        End Function
    
        <DllImport("user32.dll")> _
        Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
        End Function
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim Outlook() As Process = Process.GetProcessesByName("Outlook")
            If Outlook.Length > 0 Then
                ' Main Window Caption durch "MainWindowTitle" herausfinden
                Debug.Print(Outlook(0).MainWindowTitle) ' <--- aktueller Titel
    
                ' Windows Handle durch "MainWindowHandle" herausfinden
                SetActiveWindow(Outlook(0).MainWindowHandle)
                SetForegroundWindow(Outlook(0).MainWindowHandle)
            End If
    
    
        End Sub
    End Class

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert Philipp B. _ Freitag, 17. Februar 2012 07:22
    Donnerstag, 16. Februar 2012 18:36
    Moderator
  • Danke euch Elmar und Robert,

    @Elmar: ich habe mir die seite mal angesehen und was rauskopiert:

    Dim DesthWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    DesthWnd = FindWindow(Nothing, "Microsoft Outlook")
    If DesthWnd.Equals(ceroIntPtr) Then Exit Sub

    Das hat aber sofort nen Überlauf erzeugt. (oder ich hab was falsch gemacht)

    @Robert: das mit dem Process funzt super. Danke...

    Freitag, 17. Februar 2012 07:26
  • Hallo Philipp,

    bei deiner FindWindow Anweisung wäre nur eine kleine Änderung notwendig gewesen. Beispiel mit Editor.

    Dim DesthWnd As IntPtr : DesthWnd = FindWindow(vbNullString, "Unbenannt - Editor") : If DesthWnd = IntPtr.Zero Then Exit Sub
    SetForegroundWindow(DesthWnd)
    System.Windows.Forms.SendKeys.SendWait("Hallo")

    Freitag, 17. Februar 2012 08:20
  • Hallo Philipp,

    ein IntPtr ist eine Strukturtyp, den Du wie einen Integer (oder Long) verwenden kannst.
    Um ihn mit 0 zu vergleichen gibt es den vordefinierten Wert IntPtr.Zero.

    Gruß Elmar
    Freitag, 17. Februar 2012 09:08
    Beantworter