aicher1998
Goto Top

VB.Net Systemweit aktuelles Steuerelement wie TextBox abfragen

Hallo

ich müsste in VB wissen, welches das aktuell focusierte Steuerelement ist und müsste dann deren Eigenschaften lesen bzw. schreiben können.
Wie mach ich das?

Auf eure Antworten würd ich mich freuen.

Aicher

Content-ID: 234420

Url: https://administrator.de/forum/vb-net-systemweit-aktuelles-steuerelement-wie-textbox-abfragen-234420.html

Ausgedruckt am: 02.04.2025 um 19:04 Uhr

colinardo
Lösung colinardo 03.04.2014, aktualisiert am 05.04.2014 um 09:21:40 Uhr
Goto Top
Hallo Aicher,
kannst du folgendermaßen machen:
Für den Beispiel-Code erstellst du dir eine Form, dann fügst du noch einen Label mit dem Namen lblHwnd und einen Timer mit dem Namen Timer1 hinzu. Der Form sollte das Attribut TopMost gegeben werden damit du das Fenster immer sehen kannst. Dann startest du das Programm und setzt den Focus der Maus auf ein Textfeld in einer anderen Applikation - der Label sollte nun den Text des aktuell im Fokus liegenden Controls haben.
(Wenn du das Visual Studio Projekt-File brauchst sag bescheid.)
Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form1
    <DllImport("user32.dll")> _  
    Public Shared Function GetForegroundWindow() As IntPtr
    End Function
    <DllImport("user32.dll")> _  
    Public Shared Function GetWindowThreadProcessId(hWnd As IntPtr, ProcessId As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll")> _  
    Public Shared Sub AttachThreadInput(idAttach As IntPtr, idAttachTo As IntPtr, fAttach As Boolean)
    End Sub
    <DllImport("user32.dll")> _  
    Public Shared Function GetFocus() As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _  
    Public Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _  
    Public Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _  
    Public Shared Function SendMessage(hWnd As IntPtr, Msg As UInt32, wParam As IntPtr, lParam As StringBuilder) As IntPtr
    End Function

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        lblHwnd.Text = GetTextRaw(ControlInFocusedWindow())
    End Sub

    Private Function ControlInFocusedWindow() As IntPtr
        Dim activeWindowHandle As IntPtr = GetForegroundWindow()
        Dim activeWindowThread As IntPtr = GetWindowThreadProcessId(activeWindowHandle, IntPtr.Zero)
        Dim thisWindowThread As IntPtr = GetWindowThreadProcessId(Me.Handle, IntPtr.Zero)
        AttachThreadInput(activeWindowThread, thisWindowThread, True)
        Dim focusedControlHandle As IntPtr = GetFocus()
        AttachThreadInput(activeWindowThread, thisWindowThread, False)
        Return focusedControlHandle
    End Function

    Public Function GetTextRaw(hWnd As IntPtr) As String
        Const WM_GETTEXTLENGTH = &HE
        Const WM_GETTEXT = &HD
        Dim length As Integer = SendMessage(hWnd, WM_GETTEXTLENGTH, IntPtr.Zero, New StringBuilder)
        Dim sb As StringBuilder = New StringBuilder(length + 1)
        SendMessage(hWnd, WM_GETTEXT, sb.Capacity, sb)
        Return sb.ToString()
    End Function

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub
End Class
Viel Erfolg

Grüße Uwe
Aicher1998
Aicher1998 03.04.2014 um 13:26:06 Uhr
Goto Top
Danke, muss ich nachher testen.
Könnte es sein, dass das Programm von Virenscannern als potenziell gefährlich eingestuft werden kann?
Hast du das ergoogelt oder selber zusammengeschrieben?

Aicher
Aicher1998
Aicher1998 03.04.2014 aktualisiert um 13:29:37 Uhr
Goto Top
Zitat von @colinardo:
Public Shared Function GetFocus() As IntPtr
End Function
Wieso ist da nix drin?

Gruß Aicher
colinardo
colinardo 03.04.2014 aktualisiert um 13:30:15 Uhr
Goto Top
Zitat von @Aicher1998:
Danke, muss ich nachher testen.
Könnte es sein, dass das Programm von Virenscannern als potenziell gefährlich eingestuft werden kann?
hä ? nein...
Hast du das ergoogelt oder selber zusammengeschrieben?
das mach ich schon selber ...
colinardo
colinardo 03.04.2014 aktualisiert um 13:32:40 Uhr
Goto Top
Zitat von @Aicher1998:
Wieso ist da nix drin?
das ist ja auch ein Windows API-Call in user32.dll ...
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646294%28v=vs ...
Aicher1998
Aicher1998 03.04.2014 aktualisiert um 13:32:41 Uhr
Goto Top
Zitat von @colinardo:

> Zitat von @Aicher1998:
> Wieso ist da nix drin?
das ist ja auch ein API-Call in user32.dll ...

Häh aber da steht ja kein Code drin?
colinardo
colinardo 03.04.2014 aktualisiert um 13:35:07 Uhr
Goto Top
Zitat von @Aicher1998:
Häh aber da steht ja kein Code drin?
nochmal ....http://msdn.microsoft.com/en-us/library/windows/desktop/ms646294%28v=vs ...

Wieso steht da wohl das davor hmmm?:
<DllImport("user32.dll")> _ 
Aicher1998
Aicher1998 03.04.2014 um 13:36:34 Uhr
Goto Top
Zitat von @colinardo:
das mach ich schon selber ...

Alles selber geschrieben? Krass, wenn ich mich so gut auskennen würde... Naja ich hab da meine snippets und setzt mir dann was zusammen
Aicher1998
Aicher1998 03.04.2014 um 14:00:24 Uhr
Goto Top
Zitat von @colinardo:

> Zitat von @Aicher1998:
> Häh aber da steht ja kein Code drin?
nochmal ....http://msdn.microsoft.com/en-us/library/windows/desktop/ms646294%28v=vs ...

Wieso steht da wohl das davor hmmm?:
> <DllImport("user32.dll")> _ 
> 
Ja das hab ich ned gemerkt
Aicher1998
Aicher1998 04.04.2014 um 17:36:36 Uhr
Goto Top
Gibts auch ne Möglichkeit das in live anzuzeigen und nicht erst wenn man klickt? Und das man erhält, was man gerade für ein Steuerelement vor sich hat?
colinardo
colinardo 04.04.2014, aktualisiert am 05.04.2014 um 09:33:55 Uhr
Goto Top
Zitat von @Aicher1998:

Gibts auch ne Möglichkeit das in live anzuzeigen und nicht erst wenn man klickt? Und das man erhält, was man gerade
für ein Steuerelement vor sich hat?
dann ist das vielleicht was für dich:
http://msdn.microsoft.com/en-us/magazine/cc163617.aspx
Aicher1998
Aicher1998 05.04.2014 um 09:21:04 Uhr
Goto Top
Zitat von @colinardo:

> Zitat von @Aicher1998:
>
> Gibts auch ne Möglichkeit das in live anzuzeigen und nicht erst wenn man klickt? Und das man erhält, was man
gerade
> für ein Steuerelement vor sich hat?
dann ist vielleicht was für dich:
http://msdn.microsoft.com/en-us/magazine/cc163617.aspx

Is zu hoch für mich, aber danke