Bildschirmtastatur - Aktives Fenster herausfinden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bildschirmtastatur - Aktives Fenster herausfinden

    Guten Morgen zusammen,

    ich bin gerade dabei eine kleine Bildschirmtastatur zu programmieren. Eigentlich ist das Vorhaben auch recht einfach. Das Problem ist nur,
    dass ich nicht weiß, wie man das Aktive Fenster auslesen kann. Ich erkläre mein Problem mal genauer anhand des Codes:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. AppActivate()
    3. System.Windows.Forms.SendKeys.Send("f")
    4. End Sub

    An der Stelle AppActivate() könnte ich beispielsweise Chrome einragen und der Buchstabe "f" wird automatisch an Chrome gesendet.
    Leider ist dies sehr ärgerlich d.h. man muss seine Tastatur vorher genau definieren.

    Daher die Frage, gibt es eine Möglichkeit das zu automatisieren, dass das aktuelle Programm, bzw an das zusendende Programm automatisch erkannt wird?

    Danke für kommende Antworten!

    VB.neter0101 schrieb:

    automatisch erkannt wird?
    Das ist der falsche Weg.
    Befasse Dich mal mit Fernsteuerung von Programmen.
    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!

    VB.neter0101 schrieb:

    Die Windows Tastatur erkennt das "Aktive" Programm
    Das aktive Programm ist das Programm, in dem der Code aus Deinem 1. Post steht, denn das Button_Click-Event wurde offensichtlich ausgewählt.
    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!
    Ja okay, aber ist klar was ich meine?

    Ich möchte gerne den Buchstaben an ein Programm senden, das Problem ist nur, dass ich das vorher definieren muss.
    BSP: Ich sende "f" an Chrome, weil Chrome in AppActivate("Chrome") definiert ist. Jetzt möchte ich den Buchstaben "f" an Firefox senden. Das geht nur nicht daher muss ich AppActivate("Firefox") schreiben. Und ich möchte das ganze jetzt gerne so realisieren, dass ich nicht immer Änderungen im Code vornehmen muss.

    Danke ;)

    VB.neter0101 schrieb:

    dass ich nicht immer Änderungen im Code vornehmen muss
    Du benötigst die Process-Instanz des Fensters, in das Du senden möchtest. Dies kannst Du dann mit SetActiveWindow() aktivieren, 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!
    Danke für den Hinweis, ich habe das mal "blind" in mein Projekt kopiert. Jetzt ist nur die Frage, wie das genau funktioniert, bzw, wie kann ich das dann mit meinem AppActiavte() verbinden oder muss ich das nicht mehr?

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", SetLastError:=True)>
    4. Private Shared Function SetActiveWindow(ByVal hWnd As IntPtr) As IntPtr
    5. End Function
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. My.Computer.Clipboard.SetText("KopierTest.")
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. AppActivate()
    11. System.Windows.Forms.SendKeys.Send("f")
    12. End Sub
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. Me.TopMost = True
    15. End Sub
    16. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB.neter0101“ ()

    VB.neter0101 schrieb:

    wie das genau funktioniert

    RodFromGermany schrieb:

    Du benötigst die Process-Instanz des Fensters, in das Du senden möchtest.
    Ungefähr so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private MyWindow As IntPtr
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim pr() = Process.GetProcessesByName("Notepad")
    4. If pr.Length > 0 Then
    5. MyWindow = pr(0).MainWindowHandle
    6. End If
    7. End Sub
    8. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    9. SetActiveWindow(MyWindow)
    10. System.Windows.Forms.SendKeys.Send("f")
    11. End Sub
    Ob das funktioniert, hab ich nicht getestet.
    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!

    VB.neter0101 schrieb:

    Button1
    Da wird das Fensterhandle des Empfangsfensters bereitgestellt.
    Ja, Explorer ticken anders. Das ist bekannt.
    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!
    Ich habe nochmal eine kleinere Frage:

    System.Windows.Forms.SendKeys.Send("{^}") sollte eigentlich "^" ausgeben, leider bekomme ich ein "&" ausgegeben...
    Kann mir jemand erklären, wo sich der Fehler befindet?

    Ich habe eigentlich das hier befolgt:
    Das Pluszeichen (+) Caretzeichen (^), Prozentzeichen (%), Tilde (~) und Klammern () haben eine besondere Bedeutung zu SendKeys. Wenn eines dieser Zeichen angeben möchten, müssen Sie ihn in geschweiften Klammern ({}).Um das Pluszeichen (+) anzugeben, verwenden Sie z. B. "{+}". Geschweifte Klammern, die mit "{{}" und "{}}" angeben.


    Danke!

    VB.neter0101 schrieb:

    wo sich der Fehler befindet
    Ggf. im Encoding.
    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!