Registerhotkey Weiterleitung an aktives Fenster

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Registerhotkey Weiterleitung an aktives Fenster

    Hello again,

    ich fange die ESC-Taste ab, verarbeite es, und möchte sie anschließend wieder ans System weiterleiten, quasi ein Tastaturhook wenn ich es richtig verstehe?!
    Folgendes habe ich, funzt auch prächtig, der Tastendruck versandet aber in VB. Soll "MyBase.WndProc(m)" nicht dafür zuständig sein, dass der Key weitergeleitet wird?

    VB.NET-Quellcode

    1. Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr,
    2. ByVal id As Integer, ByVal fsModifiers As Integer,
    3. ByVal vk As Integer) As Integer
    4. End Function
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    6. RegisterHotKey(Me.Handle, 666, 0, Keys.Escape) ' Escape für Cancel
    7. end sub
    8. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    9. If m.WParam = New IntPtr(666) Then ' ESC, Cancel
    10. Cancel()
    11. End If
    12. MyBase.WndProc(m)
    13. End Sub
    Brauch' ich die?
    Mist, das war auch mein Google-Ergebnis. Ich hoffte, dass es doch einen Weg gibt - und ich denke Du kennst bestimmt einen :D Aber kann's verstehen, dass das nicht im Netz verbreitet werden sollte.
    Habe mir jetzt einen Button eingebaut, der bei Bedarf die Hotkeys unregistriert. Kann ich mir damit Probleme ins Windows-System holen wenn ich sie ständig registere/deregistriere? Bestimmt nicht, oder?
    Und wofür ist "MyBase.WndProc(m)" dann eigentlich gut?

    Ah, und EdR - Du hattest mir letztlich wunderschöne Codeschnipsel für den Zugriff aufs Dataset gegeben.
    Für folgendes:

    For Each rw In Dataset.Table.Where(function(xy) xy.test = irgendwas)
    rw.test = 1
    Next

    ...gibt es doch bestimmt auch so einen schmucken Einzeiler, ich komme einfach auf keine Lösung?!
    Dataset.Table.First(Function(xy) xy.ID = ID).test = 1 klappt ja, aber halt nur für einen Datensatz. Ist "Dataset.Table.All" ein Ansatz wenn ich in mehrere Datensätze gleichzeitig schreiben möchte?

    Gruß, Hanuta
    Brauch' ich die?

    Hanuta schrieb:

    Kann ich mir damit Probleme ins Windows-System holen wenn ich sie ständig registere/deregistriere?
    glaub nicht.

    Hanuta schrieb:

    Und wofür ist "MyBase.WndProc(m)" dann eigentlich gut?
    Protected Overrides Sub WndProc() ist schon sehr BetriebsSystem-nah, da kommen alle Window-Messages an, die an die aktuelle Window-Handle gesendet werden.
    Mit MyBase.WndProc(m) werden sie dann weitergeleitet ans Betriebssystem, was die iwie weiterverarbeitet, sodass letztendlich _Click-Events und all die anderen Control-Events aufgerufen werden.

    Hanuta schrieb:

    VB.NET-Quellcode

    1. For Each rw In Dataset.Table.Where(function(xy) xy.test = irgendwas)
    2. rw.test = 1
    3. Next
    vielleicht sowas:

    VB.NET-Quellcode

    1. Dataset.Table.Where(function(xy) xy.test = irgendwas).ToList().ForEach(Function(rw)rw.test = 1)

    VB.NET-Quellcode

    1. Dataset.Table.Where(function(xy) xy.test = irgendwas).ToList().ForEach(Function(rw)rw.test = 1)


    Mhm, interessanter Ansatz den Du mir da gibst. Wusste noch nicht, dass es so zu verketten ist!

    Mit Deiner Erklärung Betreff WndProc komme ich aber nicht weiter. So wie ich Dich da verstehe, wäre es doch das, was ich möchte?!
    Mit dem aktuellem Window-Handle meinst Du doch z.B. Notepad, in welchem ich grade schreibe. Ich drücke eine in VB registrierte Taste, das BS bekommt sie wegen WndProc nicht mit, es geht direkt an VB. Dort führt sie Function xy aus. Um dann mit mybase.wndproc(m) an das BS weitergeleitet zu werden?
    Ist das so richtig in meine Sprache übersetzt?
    Brauch' ich die?

    Hanuta schrieb:

    Ist "Dataset.Table.All" ein Ansatz wenn ich in mehrere Datensätze gleichzeitig schreiben möchte?
    Nein, da sie für folgendes gedacht: All gibt ein True zurück, wenn alle Datensätze eine Bedingung erfüllen, z.B.:

    VB.NET-Quellcode

    1. If Wetterdaten.All(Function(x) x.DatumDerAufzeichnung < Date.Today) Then MessageBox.Show("Für heute fehlt noch die Wetteraufzeichnung")

    (btw: für IEnumerable(Of T) habe ich mir die Extensions ForEach und None gemacht. Ersteres, um mir das ewige ToList zu ersparen, letztere, um mir die Formulierung Not Any zu ersparen)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.