hwnd GetForeGroundWindow EX

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Siestaeg.

    hwnd GetForeGroundWindow EX

    Hi Leute,

    bin dabei eine Bildschirmtastatur (Ziffernblock) für TouchScreens zu basteln. Ich möchte eine Funktion einbauen, mit der ich feststellen kann, welches Control gerade aktiv ist. Ist es ein Control mit der Möglichkeit Text einzugeben, soll sich der Ziffernblock automatisch einblenden.

    Das aktuelle Fenster bekomme ich ja mit "GetForegroundWindow()", aber funktioniert das auch irgendwie mit
    "GetForegroundWindowEX" um das aktuelle Control zu bekommen, bzw. wie bekomme ich den Typ dieses Controls,
    TextBox, Button, ...


    Danke für eure Hilfe :rolleyes:

    Einfügemarke

    Hi Leute,

    nachdem meine Versuche, den Code aus oben genannter Quelle, zum laufen zu bringen kläglich gescheitert sind, er ist zwar gelaufen, aber das Ergebnis war nicht das was ich brauche, habe ich mir Gedanken gemacht, wie ich das anders lösen kann.

    Die Idee wäre, feststellen ob sich eine aktive, blinkende Einfügemarke auf dem Bildschirm befindet.
    Leider habe ich keine Ahnung wie ich das rausfinden kann.
    Hi Leute,



    habs jetzt anders gelöst, vielleicht nicht sehr elegant, aber es funzt.

    Quellcode

    1. #Region"Autoshow"
    2. #Region"Variablen Autoshow"
    3. PrivateDeclareFunction GetCursorInfo Lib"user32.dll" (ByRef pc As CURSORINFO) AsInteger
    4. PrivateDeclareFunction GetAsyncKeyState Lib"user32" (ByVal vKey AsLong) AsInteger
    5. Public lClick AsInteger = 0
    6. Public lClick2 AsInteger = 0
    7. PrivateConst VK_LBUTTON = &H1
    8. PrivateConst VK_RBUTTON = &H2
    9. PrivateConst VK_MBUTTON = &H4
    10. Structure CURSORINFO
    11. Dim cbsize AsInteger
    12. Dim flags AsInteger
    13. Dim hCUrsor AsInteger
    14. Dim p As PointAPI
    15. EndStructure
    16. Structure PointAPI
    17. Dim X AsInteger
    18. Dim Y AsInteger
    19. EndStructure
    20. #EndRegion
    21. PrivateSub tmrAutoShow_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAutoShow.Tick
    22. Dim ff AsNew CURSORINFO
    23. ff.cbsize = System.Runtime.InteropServices.Marshal.SizeOf(GetType(CURSORINFO))
    24. GetCursorInfo(ff)
    25. With ff
    26. If GetAsyncKeyState(VK_LBUTTON) Then
    27. If lClick = 0 Then
    28. lClick = 1
    29. Else
    30. lClick = 0
    31. EndIf
    32. EndIf
    33. If ff.p.X >= Me.Left And ff.p.X <= Me.Right And ff.p.Y >= Me.Top And ff.p.Y <= Me.Bottom Then
    34. ExitSub
    35. Else
    36. If lClick <> lClick2 Then
    37. If .hCUrsor = 65557 Then
    38. Me.Show()
    39. Else
    40. Me.Hide()
    41. EndIf
    42. EndIf
    43. lClick2 = lClick
    44. EndIf
    45. EndWith
    46. EndSub
    47. #EndRegion


    In ein paar Tagen, werde ich die Tastatur online stellen.
    Wer Interesse hat findets unter Google unter dem Namen BS-Numblock. (Vorabversion bereit im Netz)
    Ist natürlich Freeware !!!

    Danke und schönes WE

    Siestaeg schrieb:

    habs jetzt anders gelöst, vielleicht nicht sehr elegant, aber es funzt.

    Sorry, aber das wird wohl nie sauber funktionieren, auch wenn die Idee den CursorTyp abzufragen sehr nett ist:
    - Felder können per TAB angesteuert werden, nicht nur per Mausclick
    - Dokumente (z.B. Google) können geöffnet werden und dabei schon den Focus auf einem Input Feld haben
    - bei schnellen Mausbewegungen schlägt die Abfrage fehl
    - ausserdem ist bei mir der ICursor = 65555

    Wie Du vorgehabt hattest, musst Du abfragen ob das momentan focussierte Control Eingaben erlaubt. Was funktionierte nicht an bla's Link ?
    Hi Kangaroo,

    hab den umgeschriebenen Code von bla's Link gerade nicht dabei, werde ihn posten, wenn ich wieder zu Hause bin.
    Jedenfalls habe ich immer anstelle eines Klassennamens eine Zahl bekommen, wenn ich mich ausserhalb meiner Form bewegt habe. Innerhalb meiner Form war der Klassennamen immer 0.
    Hier der übersetzte src (nur übersetzt, nicht optimiert!)

    einfach die longs der Apis in integers geändert. ein paar $'s entfernt und left durch substring ersetzt + das timer event geändert.

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' alle benötigten API-Deklarationen
    3. Private Declare Function GetClassName Lib "user32" _
    4. Alias "GetClassNameA" ( _
    5. ByVal hWnd As Integer, _
    6. ByVal lpClassName As String, _
    7. ByVal nMaxCount As Integer) As Integer
    8. Private Declare Function GetFocus Lib "user32" () As Integer
    9. Private Declare Function GetForegroundWindow Lib "user32" () As Integer
    10. Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
    11. ByVal hWnd As Integer, _
    12. ByVal lpdwProcessId As Integer) As Integer
    13. Private Declare Function AttachThreadInput Lib "user32" ( _
    14. ByVal idAttach As Integer, _
    15. ByVal idAttachTo As Integer, _
    16. ByVal fAttach As Integer) As Integer
    17. ' benutzerdefinierter Datentyp
    18. Private Structure tActiveCtrInfo
    19. Dim lnghWnd As Integer
    20. Dim strClassName As String
    21. End Structure
    22. ' Aktives Cntrol ermitteln
    23. Private Function GetActiveControl() As tActiveCtrInfo
    24. Dim strBuffer As String
    25. Dim lngOtherThreadID As Long
    26. Dim lngThread1 As Long
    27. Dim lngThread2 As Long
    28. Dim lngGetCurrentThreadID As Long
    29. Dim blnReminder As Boolean
    30. Dim lnghWndControl As Long
    31. ' Prozess-ID der eigenen Anwendung
    32. lngThread1 = GetWindowThreadProcessId(Me.Handle, _
    33. lngGetCurrentThreadID)
    34. ' Prozess-ID der aktiven Anwendung
    35. lngThread2 = GetWindowThreadProcessId(GetForegroundWindow(), _
    36. lngOtherThreadID)
    37. ' Falls eigene Anwendung nicht die aktive Anwendung...
    38. If lngThread1 <> lngThread2 Then
    39. blnReminder = AttachThreadInput(lngThread2, _
    40. lngThread1, True)
    41. End If
    42. ' Handle des aktuellen Controls
    43. lnghWndControl = GetFocus()
    44. GetActiveControl.lnghWnd = lnghWndControl
    45. If blnReminder Then
    46. blnReminder = AttachThreadInput(lngThread2, _
    47. lngThread1, False)
    48. End If
    49. ' jetzt Klassennamen ermitteln
    50. strBuffer = Space(255)
    51. GetClassName(lnghWndControl, strBuffer, Len(strBuffer))
    52. If InStr(strBuffer, Chr(0)) > 0 Then
    53. strBuffer = strBuffer.Substring(0, InStr(strBuffer, Chr(0)) - 1)
    54. End If
    55. GetActiveControl.strClassName = strBuffer
    56. End Function
    57. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    58. Dim aciActCtr As tActiveCtrInfo
    59. ' Aktives Control...
    60. aciActCtr = GetActiveControl()
    61. ' ...in den beiden Textboxen anzeigen
    62. With aciActCtr
    63. txtClassname.Text = .strClassName
    64. txtHandle.Text = CStr(.lnghWnd)
    65. End With
    66. End Sub
    67. End Class
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!
    Hi bla,

    dein Code funzt natürlich supi, echt Danke (keine Ahnung wo ich mit meinen Gedanken bei der Übersetzung war), das einzige Problem, bei den zwei ifs, wo der blreminder gesetzt wird, verliert das aktuell aktive Control den Focus. Somit schlägt der anschließende Sendkeys fehlt.

    Kann man das auch irgendwie lösen, daß das Control den Focus behält ?



    THX Simon