Benutzer mit den meisten Antworten
"FindWindow" liefert falsche Werte

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 :-)
Antworten
-
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
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
Alle Antworten
-
Hallo Philipp,
das Problem ist Dein (wohl aus VB Classic übernommener) Interop-Aufruf,
für die richtige Signatur siehe PInvoke.NET FindWindowAllgemeiner:
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
-
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
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
-
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...
-
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")