SendKeys.Send() mit Key variable

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Wolf066.

    SendKeys.Send() mit Key variable

    Hallo...

    Ich möchte, dass mein Tool eine Taste an das System rausschickt... Diese Taste ist in einer Keyvariable gespeichert...
    Wie mach ich daraus jetzt einen String, der bei jedem Key funktioniert?

    Denn wenn ich es einfach so mache:

    C#-Quellcode

    1. "{" + Key.ToString().ToUpper() + "}"


    Dann geht es bei manchen Tasten nicht... Z.B: pageup wird in Keys als NEXT gespeichert ich bräuchte aber {PGUP}

    Kann mir also jemand sagen, wie ich jetzt den Key der in der Variable steht an das System schicken kann?

    Danke schon mal ;D

    LG Wolf
    Nimm diese Klasse, dort kannst du direkt Windows.Forms.Keys mit "senden". Denke dran das du bei Grossbauchstaben vorher ShiftDown schicken musst, u.U. brauchste auch AltGR, kannst ja SendKey noch ueberladen. Vergiss bloss nicht Shift oder AltGr wieder KeyUp zu senden, kann lustige folgen haben.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class InputSender
    3. Const KeyDown As Integer = &H0
    4. Const KeyUp As Integer = &H2
    5. <DllImport("user32.dll")>
    6. Private Shared Function SendInput(ByVal nInputs As UInteger, ByVal pInputs() As INPUT, ByVal cbSize As Integer) As UInteger
    7. End Function
    8. <StructLayout(LayoutKind.Explicit)> _
    9. Private Structure INPUT
    10. 'FieldOffset 32 Bit->4, 64 Bit->8
    11. <FieldOffset(0)> Public type As Integer
    12. <FieldOffset(4)> Public mi As MOUSEINPUT
    13. <FieldOffset(4)> Public ki As KEYBDINPUT
    14. <FieldOffset(4)> Public hi As HARDWAREINPUT
    15. End Structure
    16. Private Structure MOUSEINPUT
    17. Public dx As Integer
    18. Public dy As Integer
    19. Public mouseData As Integer
    20. Public dwFlags As Integer
    21. Public time As Integer
    22. Public dwExtraInfo As IntPtr
    23. End Structure
    24. Private Structure KEYBDINPUT
    25. Public wVk As Short
    26. Public wScan As Short
    27. Public dwFlags As Integer
    28. Public time As Integer
    29. Public dwExtraInfo As IntPtr
    30. End Structure
    31. Private Structure HARDWAREINPUT
    32. Public uMsg As Integer
    33. Public wParamL As Short
    34. Public wParamH As Short
    35. End Structure
    36. Public Sub SendKey(ByVal key As Keys)
    37. Dim Inputs(1) As INPUT
    38. Inputs(0).type = 1
    39. Inputs(0).ki.wVk = CShort(key)
    40. Inputs(0).ki.dwFlags = KeyDown
    41. Inputs(1).type = 1
    42. Inputs(1).ki.wVk = CShort(key)
    43. Inputs(1).ki.dwFlags = KeyUp
    44. SendInput(1, Inputs, Marshal.SizeOf(GetType(INPUT)))
    45. End Sub
    46. End Class

    And i think to myself... what a wonderfuL World!
    Hab das ganze jetzt in C# portiert:

    C#-Quellcode

    1. using Microsoft.VisualBasic;
    2. using System;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using System.Data;
    6. using System.Diagnostics;
    7. using System.Runtime.InteropServices;
    8. using System.Windows.Forms;
    9. public class InputSender
    10. {
    11. const int KeyDown = 0x0;
    12. const int KeyUp = 0x2;
    13. [DllImport("user32.dll")]
    14. private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    15. [StructLayout(LayoutKind.Explicit)]
    16. private struct INPUT
    17. {
    18. //FieldOffset 32 Bit->4, 64 Bit->8
    19. [FieldOffset(0)]
    20. public int type;
    21. [FieldOffset(4)]
    22. public MOUSEINPUT mi;
    23. [FieldOffset(4)]
    24. public KEYBDINPUT ki;
    25. [FieldOffset(4)]
    26. public HARDWAREINPUT hi;
    27. }
    28. private struct MOUSEINPUT
    29. {
    30. public int dx;
    31. public int dy;
    32. public int mouseData;
    33. public int dwFlags;
    34. public int time;
    35. public IntPtr dwExtraInfo;
    36. }
    37. private struct KEYBDINPUT
    38. {
    39. public short wVk;
    40. public short wScan;
    41. public int dwFlags;
    42. public int time;
    43. public IntPtr dwExtraInfo;
    44. }
    45. private struct HARDWAREINPUT
    46. {
    47. public int uMsg;
    48. public short wParamL;
    49. public short wParamH;
    50. }
    51. public void SendKey(Keys key)
    52. {
    53. INPUT[] Inputs = new INPUT[2];
    54. Inputs[0].type = 1;
    55. Inputs[0].ki.wVk = Convert.ToInt16(key);
    56. Inputs[0].ki.dwFlags = KeyDown;
    57. Inputs[1].type = 1;
    58. Inputs[1].ki.wVk = Convert.ToInt16(key);
    59. Inputs[1].ki.dwFlags = KeyUp;
    60. SendInput(1, Inputs, Marshal.SizeOf(typeof(INPUT)));
    61. }
    62. }
    63. //=======================================================
    64. //Service provided by Telerik (www.telerik.com)
    65. //Conversion powered by NRefactory.
    66. //Twitter: @telerik
    67. //Facebook: facebook.com/telerik
    68. //=======================================================


    Wenn ich jetzt allerdings die Methode aufrufe:

    C#-Quellcode

    1. ​ InputSender t = new InputSender();
    2. t.SendKey(Keys.PageUp);


    passiert nichts...

    Danke schonmal!
    Ok ich habs verstanden... Mit der Klasse wird der Input nur an das aktuelle Element(z.B. Textbox) geschickt... Ich will aber, dass ich damit z.B. eine Tastenkombination an ein anderes Programme schicken kann...

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

    Also direkt an ein Handle? Dann kaeme SendMessage oder PostMessage in Frage.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("User32.Dll")>
    4. Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Boolean
    5. End Function
    6. Const WM_KEYDOWN = &H100
    7. Const WM_KEYUP = &H101
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. Close()
    10. End Sub
    11. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    12. Dim hwnd As IntPtr = Button1.Handle
    13. PostMessage(hwnd, WM_KEYDOWN, CUInt(Keys.Enter), 0)
    14. PostMessage(hwnd, WM_KEYUP, CUInt(Keys.Enter), 0)
    15. End Sub
    16. End Class

    And i think to myself... what a wonderfuL World!
    @Wolf066 Informiere Dich mal darüber, welches Fenster die Eingaben bekommt.
    Bei SendKeys() von .NET ist es das Fenster mit dem Fokus,
    Bei PostMessage() ist es das Fenster, dessen HWND-Property explizit angegeben wird.
    Wo hast Du diese denn hergenommen?
    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 möchte den Key ja nicht an ein bestimmtes Programm schicken, sondern quasi an alles... und jedes Programm das diesen Key selbst im Code integriert hat führt dann die Programminterne Funktion aus... quasi wie wenn ich egal in welchem Programm irgendwo eine Taste drücke und dann z.B. mein Aufnahmeprogramm die Aufnahme startet. So eine Key will ich schicken bzw. simulieren

    Wolf066 schrieb:

    sondern quasi an alles... und jedes Programm
    Immerhin kommt ein solch absolut unwichtiges Detail bereits in Post #11. X(
    Definiere zunächst mal an alles... und jedes Programm.
    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!

    Wolf066 schrieb:

    quasi wie wenn ich egal in welchem Programm irgendwo eine Taste drücke und dann z.B. mein Aufnahmeprogramm die Aufnahme startet. So eine Key will ich schicken bzw. simulieren



    Hab ich doch versucht... Ich will einfach nur das diese Taste gedrückt wird... mehr nicht... Es soll einfach so aussehen als würde jemand diese taste auf der tastatur drücken