none
SendKeys.Send("{NUMLOCK}") geht nur zur hälfte RRS feed

  • Frage

  • Hallo zusammen,

    ich habe in der MSDN Libary gelesen das man die SendKeys-Klasse dazu versenden soll um die Tastatur zu bedienen. dort steht auch eine sehr schöne Tabelle, in der alle Tasten aufgelistet sind.

    sende ich nun den befehl

    SendKeys.Send("{NUMLOCK}")

    blendet Windows unten rechts ein Popup fenster ein, und sagt Num-Lock on oder halt Num-Lock off.
    als passiert ja irgendwas.

    Die Tastur bleibt aber wie gehabt auf Num-Lock on stehen. Das heist ich kann weiterhin über den NummerBlock Zahlen eingeben.

    Muss ich da noch mehr senden oder über eine API gehen ?
    lieben dank

    Bernd 
    Dienstag, 29. Dezember 2009 17:44

Antworten

  • Hallo Bernd,

    Ja, ich glaube die API machts:

    http://support.microsoft.com/kb/177674

     

    Public Class Form1
        Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
        Private Const KEYEVENTF_KEYUP = &H2
        Const VK_NUMLOCK = &H90
        Const KEYEVENTF_EXTENDEDKEY = &H1
        Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal ByValnVirtKey As Integer) As Short
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If Not GetKeyState(VK_NUMLOCK) Then numlockON()
    End Sub
       
    
    Private Sub numlockON()
            keybd_event(VK_NUMLOCK, 0, 0, 0)
            keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0)
    End Sub
    
    
    End Class




    Grüße,

    Robert

    Dienstag, 29. Dezember 2009 18:24
    Moderator
  • Hier mal die allgemeine MSDN Doku zur keybd_event API:
    http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx

    Die passenden KeyCodes findest Du hier aufgelistet:
    Virtual-Key Codes
    http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx

    Ergibt für die Einfg-Taste:

    Const VK_INSERT As Integer = &H2D

    In einigen Fällen musst Du auch nicht unbedingt die passende Konstante deklarieren, sondern kannst diese auch aus der Keys Enumeration entnehmen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 29. Dezember 2009 21:23
    Moderator

Alle Antworten

  • Hallo Bernd,

    Ja, ich glaube die API machts:

    http://support.microsoft.com/kb/177674

     

    Public Class Form1
        Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
        Private Const KEYEVENTF_KEYUP = &H2
        Const VK_NUMLOCK = &H90
        Const KEYEVENTF_EXTENDEDKEY = &H1
        Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal ByValnVirtKey As Integer) As Short
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If Not GetKeyState(VK_NUMLOCK) Then numlockON()
    End Sub
       
    
    Private Sub numlockON()
            keybd_event(VK_NUMLOCK, 0, 0, 0)
            keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0)
    End Sub
    
    
    End Class




    Grüße,

    Robert

    Dienstag, 29. Dezember 2009 18:24
    Moderator
  • Hallo Robert,
    diese funktion habe ich. Sie geht einwandfrei.

    Weil mich das seit langem nervt, habe ich mir den Win32API Helper mal runter geladen.
    Diese Funktion habe ich dort auch gefunden.
    Nun Klicke ich dieses an und er bringt mir die zusammenstellung.
    Aber wie komme ich nun an die ZahlenWerte die dort eingetragen werden ?
    Gibt es eine Beschreibung oder eine Hilfe zu diesem Programm ?

    weil wenn man auf Help drückt, kommt leider nichts !


    Danke
    Bernd 
    Dienstag, 29. Dezember 2009 18:44
  • Bei Option Strict On muss es so heißen:
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    
    Private Const KEYEVENTF_KEYUP As Integer = &H2
    Const VK_NUMLOCK As Integer = &H90
    Const KEYEVENTF_EXTENDEDKEY As Integer = &H1
    Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal ByValnVirtKey As Integer) As Short
    
    Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
    
    If CBool(Not GetKeyState(VK_NUMLOCK)) Then numlockON()
    End Sub
    Private Sub numlockON()
    keybd_event(VK_NUMLOCK, 0, 0, 0)
    keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0)
    End Sub
    
    ich suche gerade noch die anderen raus , damit alle was davon haben.

    so hier mal alle drei Tasten

     

    Const VK_NUMLOCK As Integer = &H90 ' Num-Lock
    Const VK_CAPITAL As Integer = &H14 ' Caps_Lock
    Const VK_SCROLL As Integer = &H91 ' Scroll-Lock


    Dienstag, 29. Dezember 2009 19:52
  • jetzt fehtlt mir noch der wert für die Einfg Taste ?

    danke
    bernd
    Dienstag, 29. Dezember 2009 21:00
  • Hier mal die allgemeine MSDN Doku zur keybd_event API:
    http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx

    Die passenden KeyCodes findest Du hier aufgelistet:
    Virtual-Key Codes
    http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx

    Ergibt für die Einfg-Taste:

    Const VK_INSERT As Integer = &H2D

    In einigen Fällen musst Du auch nicht unbedingt die passende Konstante deklarieren, sondern kannst diese auch aus der Keys Enumeration entnehmen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 29. Dezember 2009 21:23
    Moderator
  • Ok,
    super vielen dank, da kann ich mir noch so einiges raussuchen.

    aber auf API und deklaration komme ich nochmal drauf zurück

    schönen abend
    und eine gesunden rutsch ins neue jahr, an euch alle
    Bernd
    Dienstag, 29. Dezember 2009 22:11
  • Hallo nochmal,

    dir drei Taste Caps Num un Scoll gehen einwandfrei, jedoch will die
    Const VK_INSERT As Integer = &H2D ' Einfg
    zu verrecken nicht.

    Was ist den an dieser Taste anders ?

    danke
    Bernd
    Mittwoch, 30. Dezember 2009 10:22
  • Hallo Bernd,

    was möchtest Du denn erreichen? Die Einfg. Taste ist normal kein Toggle Key bzw. das Verhalten kommt auf die gerade aktive Anwendung an. In vielen Anwendungen hat die Einfg. Taste keine Funktion.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Mittwoch, 30. Dezember 2009 10:27
    Moderator
  • Hallo Thorsten,

    eigentlich möchte ich erreichen das alles Tasten die relevant sind, auch eingestellt werden könn.
    Also Beispiel:
    Immer wenn du irgendwo im Internet bist, dein Logon Passwort eingibst, kannst du wegen der Sternchen nicht sehen was da passiert.
    Gibst du kleine oder große Buchstaben ein ?
    Bei einigen Programmen schreibst du los und merkst dann, ups ich überschreibe ja....
    Nun dachte ich mir, schreibst du mal ein Tool welches dir anzeigt, und auch steuern kann, was denn so mit der Tasatur los ist !
    Das mit der Registry, also standart werte beim Starten habe ich fertig. Geht auch einwandfrei.


    Aber du hast recht,
    es ist halt von anwendung zu anwendung unterschiedlich.

    also lasse ich doch einfach die Einf Taste weg.

    lieben dank
    Bernd

    Mittwoch, 30. Dezember 2009 10:35