Feststelltaste aktivieren/deaktivieren
#1
Hallo zusammen und erst mal danke für die Aufnahme im Forum,

ich habe folgendes Problem: 
auf einigen Tabellenblättern würde ich gerne die Feststelltaste automatisch aktivieren, auf anderen wieder ausschalten.
Über sendkey gibt es aber immer wieder das Problem, das die Taste auf den falschen Blättern angesprochen wird bzw. Numlock mit
ein-/ausgeschaltet wird.
Mit einer Abfrage ob die Taste an oder aus ist war ich noch nicht erfolgreich.

Allerdings bin ich auch noch ziemlicher Anfänger mit VBA..

LG YueGo
Antworten Top
#2
Hallo YueGo,

dass bei SendKeys der Numlock ohne erkennbaren Grund und unkontrolliert umgeschaltet wird, ist ein bekanntes Problem.

Ich habe mir mal dazu eine Ersatz-Sub geschrieben, die das Problem löst. Hierzu sendest Du Deine Tastencodes nicht direkt sondern über die Funktion SendMyKeys.

Weitere Alternative ist der Test2.

Vielleicht hilft Dir das ja weiter.

Code:

Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
          pbKeyState As Byte) As Long

Sub TestSendKeys()
  SendMyKeys "^v"
End Sub

Sub SendMyKeys(Was As String)
' Nummernblockeinstellung merken, SendKeys abschicken,
' Nummernblock ggf. wiederherstellen
' GetKeyboardState Keys(0) Keyboard-Array füllen
  Dim Keys(0 To 255) As Byte, bNumBlock As Byte

  GetKeyboardState Keys(0): bNumBlock = Keys(vbKeyNumlock)
  SendKeys Was
  GetKeyboardState Keys(0)
  If bNumBlock <> Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub

' oder diese Alternative hier

Sub Test2()
 CreateObject("WScript.Shell").SendKeys "^v", True
End Sub

_________
viele Grüße
Karl-Heinz
Antworten Top
#3
@Volti

Hallo,

da ich sehr wenig Ahnung von API's habe, wollte ich den Code sofort ausprobieren.

Aber "^v", also "paste" zerstört den Code im VBE.

Benötigt man nicht einen Schalter für "Einschalten" und "Ausschalten"?

Mein Versuch war:

Code:
Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
          pbKeyState As Byte) As Long

Sub TestSendKeys()
  'SendMyKeys "^v"
  SendMyKeys "{NUMLOCK}"
End Sub

Sub SendMyKeys(Was As String)
' Nummernblockeinstellung merken, SendKeys abschicken,
' Nummernblock ggf. wiederherstellen
' GetKeyboardState Keys(0) Keyboard-Array füllen
  Dim Keys(0 To 255) As Byte, bNumBlock As Byte

  GetKeyboardState Keys(0): bNumBlock = Keys(vbKeyNumlock)
  SendKeys Was
  GetKeyboardState Keys(0)
  If bNumBlock <> Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub

Damit wird Numlook gewechselt, aber nicht gezielt "An-" oder "Ausgeschaltet".

mfg

PS: Aus meinem Archiv:

Code:
Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _
        pbKeyState As Byte) As Long

Sub NumBlockEinschalten()
  Dim Keys(0 To 255) As Byte

  GetKeyboardState Keys(0)
  If Keys(vbKeyNumlock) = False Then SendKeys "{NUMLOCK}"
End Sub

Sub NumBlockAusschalten()
  Dim Keys(0 To 255) As Byte

  GetKeyboardState Keys(0)
  If Keys(vbKeyNumlock) Then SendKeys "{NUMLOCK}"
End Sub

Function GetNumBlockStatus() As Boolean
  Dim Keys(0 To 255) As Byte

  GetKeyboardState Keys(0)
  GetNumBlockStatus = Keys(vbKeyNumlock)
End Function

Sub Test()
  MsgBox "Der Nummernblock ist " & IIf(GetNumBlockStatus, "ein", "aus") & "geschaltet!"
End Sub
Antworten Top
#4
Mein Vorschlag wäre
Code:
Option Explicit

Public Declare Function GetKeyState Lib "user32" ( _
    ByVal nVirtKey As Long) As Integer

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 VK_CAPITAL = &H14
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_EXTENDEDKEY = &H1

Sub ToggleCapsLock()
    ' Simulate a Caps Lock key press
    keybd_event VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0
    ' Simulate a Caps Lock key release
    keybd_event VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End Sub
Sub CapsLockOff()
    If (GetKeyState(VK_CAPITAL) = 1) Then
        ToggleCapsLock
    End If
End Sub
Sub CapsLockOn()
    If Not (GetKeyState(VK_CAPITAL) = 1) Then
        ToggleCapsLock
    End If
End Sub
Antworten Top
#5
Hallo Fennek,

hier ging es darum, SendKeys sicher zu benutzen ohne dass die Numlock-Taste verstellt wird, was ja leider öfter mal passiert.
Es ging nicht um das gezielte Ein- oder Ausschalten der Numlock oder Feststelltaste.

Die Funktion verwendet genauso Sendkeys, als wenn man es gleich verwendet, nur dass vorher die Numlock-Taste gecheckt wird und nach der Sendung eine evtl. Verstellung wieder korrigiert wird.

Das Beispiel ^v war vielleicht etwas dumm gelaufen, aber das ganze hat nichts mit der API zu tun.

SendKeys sendet die Tastenanschläge, wie auch die von Warkings gezeigte keybd_event, immer an das aktive Vordergrundfenster. Wenn Du die Test-Sub bei offenem VBE ablaufen lässt, erhält die VBE die Tastenanschläge und führt dort zu der Einfügeoperation.

Gruß
Karl-Heinz
Antworten Top
#6
Moin,

bei YueGo wird hinzukommen, dass er zusätzlich zu SheetActivate-Events immer auch darauf reagieren muss, wenn der User mit Alt-Tab in- oder aus einer anderen Anwendung zu Excel wechselt. Ich glaube, das hatten wir in der letzten oder vorletzten Woche schonmal als Thema.

Die Frage ist daher - wie so oft -: Was soll der Spaß? Wozu sollte es wichtig sein, auf bestimmten Blättern mit CapsLock zu arbeiten, was nicht anders besser gelöst wäre? Vielleicht erhellt uns der TE ja noch diesbezüglich.

Viele Grüße
derHöpp
Antworten Top
#7
Wink 
Danke für die Hilfe!

Habe es hinbekommen.
Aber das nächste Problem kommt bestimmt   19

Gruß
YueGo
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste