RegisterHotKey mit Variable verwenden

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von King2k7.

    RegisterHotKey mit Variable verwenden

    Hallo,
    ich möchte Hotkeys in meinem Tool verwenden. Das klappt auch alles ohne Probleme. Hatte bisher einen Hotkey fest im Code vergeben nun wollte ich es variable gestalten damit Benutzter selbst die Hotkeys vergeben können.

    Daran scheitert es jetzt. Normal verwende ich Diesen Code um die Hotkeys festzulegen:

    C#-Quellcode

    1. RegisterHotKey(this.Handle, 1, MOD_CONTROL, (int)Keys.V);


    Nun wollte ich den festen Hotkey(im Bsp. "V") mit einer Variable("Hotkey") vertauschen:

    C#-Quellcode

    1. RegisterHotKey(this.Handle, 1, MOD_CONTROL, (int)Keys.Hotkey);


    Leider bekomme ich dies nicht hin da VS 2012 sagt:
    Fehler 1 'System.Windows.Forms.Keys' enthält keine Definition für 'Hotkey'.


    Gibt es eine Möglichkeit dies variable zu gestallten? Habe leider keine Lösung gefunden.

    Artentus schrieb:

    Wenn deine Variable "Hotkey" heißt, dann wärst doch einfach.

    C#-Quellcode

    1. ​RegisterHotKey(this.Handle, 1, MOD_CONTROL, (int)Hotkey);
    Keine Ahnung, warum du da Keys davor gesetzt hast, kann ja logischerweise gar nicht funktionieren.


    Habe ein weiterers Problem. Die Variable muss ja eine Int Variable(Mit dem Entsprchendem KeyCode des Buchstabens) sein ist aber zurzeit ein String(Der Hotkey Buchstabe z.B. "V"). Wie ist es möglich unter Net2.0 den Buchstaben in den entsprechenden Zahlencode umzuwandeln.

    Habe nach langem suchen leider für Net2.0 nichtsgefunden. Auch die Class "System.Windows.Form.KeysConverter" ist erst ab 3.5 verfügbar.
    @WhitePage: Nein, der Hotkey wird aus einer config Datei geladen wo gespeichert wird welches Taste der Benutzer als Hotkey nutzten möchte.

    @Artentus: Damit gehts. Besten Dank!


    Für alle mit dem selben Problem hier der funktionierende Code:

    C#-Quellcode

    1. var key = (Keys)Enum.Parse(typeof(Keys), Hotkey);
    Hi
    praktischer wäre es, eine TextBox zu schreiben (auf ReadOnly setzen und KeyDown behandeln), die die gedrückte Taste nur darstellt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class KeyTextBox
    3. Inherits TextBox
    4. Private Shared ReadOnly Converter As KeysConverter = New KeysConverter()
    5. Public Event KeysChanged As EventHandler(Of KeyEventArgs)
    6. Private _keys As Keys
    7. Public Property Keys As Keys
    8. Get
    9. Return _keys
    10. End Get
    11. Set(value As Keys)
    12. If value <> _keys Then
    13. If Not IsValidKey(value) Then
    14. Throw New ArgumentException("Invalid key combination.", "Keys")
    15. End If
    16. _keys = value
    17. Text = Converter.ConvertToString(value)
    18. OnKeysChanged(New KeyEventArgs(value))
    19. End If
    20. End Set
    21. End Property
    22. Public Overrides Property Text As String
    23. Get
    24. Return MyBase.Text
    25. End Get
    26. Set(value As String)
    27. Keys = DirectCast(Converter.ConvertFromString(value), Keys)
    28. MyBase.Text = value
    29. End Set
    30. End Property
    31. Protected Overridable Sub OnKeysChanged(e As KeyEventArgs)
    32. RaiseEvent KeysChanged(Me, e)
    33. End Sub
    34. Protected Overridable Function IsValidKey(key As Keys) As Boolean
    35. Dim kc As Keys = key And Not Keys.Modifiers
    36. If kc = Windows.Forms.Keys.ShiftKey OrElse kc = Windows.Forms.Keys.Menu OrElse kc = Windows.Forms.Keys.ControlKey Then Return False
    37. Return (key And Windows.Forms.Keys.Modifiers) <> key
    38. End Function
    39. Public Sub New()
    40. MyBase.ReadOnly = True
    41. MyBase.BackColor = System.Drawing.SystemColors.Window
    42. End Sub
    43. Protected Overrides Sub OnReadOnlyChanged(e As EventArgs)
    44. If Not [ReadOnly] Then [ReadOnly] = True
    45. End Sub
    46. Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
    47. e.Handled = True
    48. If IsValidKey(e.KeyCode) Then Keys = e.KeyData
    49. MyBase.OnKeyDown(e)
    50. End Sub
    51. End Class

    C#-Quellcode

    1. using System;
    2. using System.Windows.Forms;
    3. namespace HowTo
    4. {
    5. public class KeysTextBox : TextBox
    6. {
    7. private readonly KeysConverter Converter = new KeysConverter();
    8. public event EventHandler<KeyEventArgs> KeysChanged;
    9. private Keys _key;
    10. public Keys Key
    11. {
    12. get { return _key; }
    13. set
    14. {
    15. if (value != _key)
    16. if (!IsValidKey(value))
    17. throw new ArgumentException("Invalid key combination.", "Keys");
    18. _key = value;
    19. Text = Converter.ConvertToString(value);
    20. OnKeysChanged(new KeyEventArgs(value));
    21. }
    22. }
    23. public override string Text
    24. {
    25. get { return base.Text; }
    26. set
    27. {
    28. Key = (Keys)Converter.ConvertFromString(value);
    29. base.Text = value;
    30. }
    31. }
    32. protected virtual void OnKeysChanged(KeyEventArgs e)
    33. {
    34. if (KeysChanged != null)
    35. KeysChanged(this, e);
    36. }
    37. protected virtual bool IsValidKey(Keys key)
    38. {
    39. Keys kc = key & ~Keys.Modifiers;
    40. if (kc == Keys.ShiftKey || kc == Keys.Menu || kc == Keys.ControlKey)
    41. return false;
    42. return (key & System.Windows.Forms.Keys.Modifiers) != key;
    43. }
    44. public KeysTextBox()
    45. {
    46. base.ReadOnly = true;
    47. base.BackColor = System.Drawing.SystemColors.Window;
    48. }
    49. protected override void OnReadOnlyChanged(EventArgs e)
    50. {
    51. if (!ReadOnly)
    52. ReadOnly = true;
    53. }
    54. protected override void OnKeyDown(KeyEventArgs e)
    55. {
    56. e.Handled = true;
    57. if (IsValidKey(e.KeyData))
    58. Key = e.KeyData;
    59. base.OnKeyDown(e);
    60. }
    61. }
    62. }


    Sorry, in VB geschrieben, ich mach' mich schnell noch an eine C#-Version davon.
    Edit: done.

    Gruß
    ~blaze~

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