Sendkey an Fenster

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Sendkey an Fenster

    Hallo
    wie man Keys sendet weiß ich, allerdings suche ich eine Möglichkeit einen Tastendruck an ein Fenster zu senden.
    Suche nun seit ner halben Stunde aber habe nichts hilfreiches gefunden.
    Kann mir evtl. jemand von euch dabei helfen?
    ich würde gern die F2 Taste an ein bestimmtes Fenster senden.

    Hoffe jemand kann helfen

    Gruß
    shocK
    Dann haste wohl Google falsch bedient.


    War da etwa nix dabei?
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Was daran hilft dir nicht? Hast du wenigstens einen Ansatz, denn du verfolgst oder für verfolgungswürdig hälst?

    Stichwort SendMessage, WM_KeyDown.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lukas“ ()

    Das sind bestimmte Konstanten der WinAPI. WM_KEYDOWN sagt SendMessage beispielsweise, dass ein Tastendruck erfolgen soll. Die sollte man sich von irgendwoher besorgen - MSDN sollte die in der Regel haben. Dahinter stecken sonst nur nichtssagende Zahlen.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Lukas schrieb:

    Das sind bestimmte Konstanten der WinAPI. WM_KEYDOWN sagt SendMessage beispielsweise, dass ein Tastendruck erfolgen soll.


    Das weiß ich, allerdings weiß ich nicht was ich damit nun machen soll:

    VB.NET-Quellcode

    1. Dim x As Integer = FindWindow("fensterhandle", ft )


    Was genau muss ich da eintragen? Den Fenstertitle oder was?
    Zunächst einmal sollte man sich bei WinAPI-Sachen immer die korrekte Signatur holen - da kann man sich oft nicht drauf verlassen, was man da so findet. Empfehlbar hier ist pinvoke.

    ->pinvoke.net/default.aspx/user32.findwindow

    VB.NET-Quellcode

    1. FindWindow(String.Empty, "Fenstertitel")

    müsste gehen, soweit ich das noch in Erinnerung habe.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Habe den code von meinem letzten Post mal eingebaut und bekomme aber folgende Fehler:




    Mein Code:

    VB.NET-Quellcode

    1. Imports System.Text
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As StringBuilder) As Integer
    5. Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Integer
    6. Public Declare Function SendMessage2 Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
    7. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    8. Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As IntPtr, ByVal hWndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    9. Public Const EM_GETSEL = &HB0
    10. Public Const WM_GETTEXT = &HD
    11. Public Const WM_GETTEXTLENGTH = &HE
    12. Public Const WM_CHAR = &H102
    13. Public Const WM_SETTEXT = &HC
    14. Public Const WM_KEYDOWN As Integer = &H100
    15. Public Const WM_KEYUP As Integer = &H101
    16. Public Shared Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
    17. Dim ChildrenList As New List(Of IntPtr)
    18. Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
    19. Try
    20. EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
    21. Finally
    22. If ListHandle.IsAllocated Then ListHandle.Free()
    23. End Try
    24. Return ChildrenList.ToArray
    25. End Function
    26. Public Shared Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
    27. Dim ChildrenList As List(Of IntPtr) = GCHandle.FromIntPtr(Parameter).Target
    28. If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)")
    29. ChildrenList.Add(Handle)
    30. Return True
    31. End Function
    32. Function FindedeinFenster(ByVal ft As String) As IntPtr
    33. 'FindXfire = FindWindow("ChatSkinWnd", vbNullString)
    34. Try
    35. Dim x As Integer = FindWindow("fensterhandle", ft)
    36. Return x
    37. Catch
    38. 'fehler meldung
    39. End Try
    40. End Function
    41. Public Function sfi(ByVal handle As IntPtr) As String
    42. If Not handle = 0 Then
    43. For Each child As IntPtr In GetChildWindows(handle)
    44. Dim sClassName As New System.Text.StringBuilder("", 256)
    45. Call GetClassName(child, sClassName, 256)
    46. SendMessage(child, WM_KEYDOWN, 13, 1)
    47. SendMessage(child, WM_KEYUP, 13, 1)
    48. Next
    49. End If
    50. End Function
    51. End Class
    Was hast du dir denn da kopiert - weißt du, was das macht? Gut, ich nämlich auch nicht.

    Erstmal mit FindWindow das Fenster raussuchen war genau der richtige Ansatz. Wenn du dein Handle hast, kann man weitersehen.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    shocK schrieb:

    Hoffe jemand kann helfen
    SenKey oder SendMessage?
    SendKey() Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @shocK:

    RodFromGermany schrieb:

    SenKey oder SendMessage?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    shocK schrieb:

    SendMessage benutzen
    Du musst Dir das FensterHandle besorgen:

    VB.NET-Quellcode

    1. pr = New Process
    2. pr.StartInfo.FileName = "Notepad.exe"
    3. pr.Start()
    4. pr.WaitForInputIdle(500)
    5. Dim hh = pr.MainWindowHandle
    6. SendMessage3(hh, &HC, 0, "bla")
    So wird allerdings nur die Titelzeile des Fensters geändert.
    Wenn Du das Edit-Feld des Notepads beschreiben willst, musst Du dieses Child-Fenster mit Spy++ identifizieren und Dir dann mit EnumWindows dessen Handle besorgen.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    shocK schrieb:

    ich will lediglich
    Entschuldige bitte, dass ich den Code nicht für Dich aufbereitet habe. Aber rrgend was wirst Du schon dabei gelernt haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry, dass ich jetzt OT werden muss, aber es geht mir schon den ganzen Thread hier durch den Kopf.

    "Theorie brauche ich nicht, ich will es nur zum Laufen bekommen."

    Einfach mal ein wenig durch den Kopf gehen lassen und umsetzen - dann ist man eventuell auch schneller, zumindest stressfreier bei seiner Lösung angekommen.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.