Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1804to1808
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

NUMLOCK Nepumuk CODE an 64Bit Anpassen

NUMLOCK Nepumuk CODE an 64Bit Anpassen
21.01.2021 21:25:26
Chris
Hallo VBA-Experten,
ein von mir sehr geschätzter "NUMLOCK" CODE von NEPUMUK (Danke nochmals!!!), als Abschluss von SendKeys Befehlen, funktioniert mit 32-Bit perfekt. Er sieht so aus:
Option Explicit
Private Declare Sub keybd_event Lib "user32.dll" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32.dll" ( _
ByRef pbKeyState As KeyboardBytes) As Long
Private Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type
Private pbKeyState As KeyboardBytes
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_KEYDOWN = &H0
Private Function Get_Value() As Boolean
Call GetKeyboardState(pbKeyState)
Get_Value = pbKeyState.kbByte(vbKeyNumlock) And 1
End Function
Private Sub Set_Value()
Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN, 0)
Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub
Public Sub NUMLOCK_True()
If Not Get_Value Then Call Set_Value
End Sub

Nun unter 64-Bit kommt aber die Meldung: "Der CODE muss für 64-Bit aktualisiert werden ... Überarbeiten Sie DCLARE Anweisungen und markieren sie sie mit dem Ptr-Safe Attribute".
Habe das versucht, aber anscheinend nicht richtig. Die Fehlermeldung kommt zwar nicht mehr, aber NumLock wird auch nicht wieder aktivert... Hier mein Versuch:
Option Explicit
Private Declare PtrSafe Sub keybd_event Lib "user32.dll" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Declare PtrSafe Function GetKeyboardState Lib "user32.dll" ( _
ByRef pbKeyState As KeyboardBytes) As Long
Private Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type
Private pbKeyState As KeyboardBytes
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_KEYDOWN = &H0
Private Function Get_Value() As Boolean
Call GetKeyboardState(pbKeyState)
Get_Value = pbKeyState.kbByte(vbKeyNumlock) And 1
End Function
Private Sub Set_Value()
Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN, 0)
Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub
Public Sub NUMLOCK_True()
If Not Get_Value Then Call Set_Value
End Sub

Hat jemand einen Tipp, was noch angepast werden muss? GOOGLE sagt was von "Zu beachten ist imho noch, dass der Rückgabewert den Type-Alias LongPtr bekommt . Der wird bei 64-Bit-Version zum Typ LongLong und bei 32-Bit zumTyp Long aufgelöst.". Aber das verstehe ich nicht. Da reicht wohl mein VBA nicht aus :-(.
1000 DANK für Eure Tipps

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: NUMLOCK Nepumuk CODE an 64Bit Anpassen
21.01.2021 22:09:30
ralf_b

Declare PtrSafe Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal  _
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
Declare PtrSafe Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As  _
Byte) As Long

AW: NUMLOCK Nepumuk CODE an 64Bit Anpassen
21.01.2021 22:29:55
Chris
Danke schön, aber es klappt nur jedes 2. Mal. D.h. NUMLOCK schaltet AUS... beim nächsten mal AN... beim nächsten CODE Aufruf wieder AUS...
Komisch. Fehlermeldung kommt nicht.
AW: NUMLOCK Nepumuk CODE an 64Bit Anpassen
21.01.2021 22:34:01
Chris
STOP... Mein Fehler, das war noch das "alte" VErhalten...
Nun mit Deinem neuen CODE kommt folgende Meldung:
"Fehler beim Kompilieren: Argumenttyp ByRef unverträglich" und pbKeyState im CODE...
Private Function Get_Value() As Boolean
Call GetKeyboardState(pbKeyState)
Get_Value = pbKeyState.kbByte(vbKeyNumlock) And 1
End Function
... ist markiert...
Anzeige
AW: NUMLOCK Nepumuk CODE an 64Bit Anpassen
21.01.2021 22:52:10
volti
Hallo Chris,
probiere mal folgende Alternative aus:
Code:
[Cc][+][-]

Option Explicit Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _ pbKeyState As Byte) As Long Private Declare PtrSafe Sub keybd_event Lib "user32" ( _ ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr) Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Const KEYEVENTF_KEYDOWN = &H0 Private Function Get_Value() As Boolean Dim Keys(0 To 255) As Byte Call GetKeyboardState(Keys(0)) Get_Value = Keys(vbKeyNumlock) And 1 End Function Private Sub Set_Value() Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN, 0) Call keybd_event(vbKeyNumlock, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) End Sub Public Sub NUMLOCK_True() If Not Get_Value Then Call Set_Value End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Und wenn Du nicht ständig auf die Nase
22.01.2021 09:23:47
Sulprobil
fallen willst, wenn Du zwischen Excel 32 Bit und 64 Bit wechseln musst:
#If Win64 then
volti's Code
#Else
Nepumuk's alter Code
#End if
AW: Und wenn Du nicht ständig auf die Nase
22.01.2021 11:48:37
Chris
Hallo Karl-Heinz, tatsächlich kommt nun keine Fehlermeldung mehr. Und der CODE funktioniert _ auch... aber nur manchmal. Ahbe jede Zeile mal verfolgt und das komische ist, dass

Keys(vbKeyNumlock)
mal den STATUS der NumLock Taste richtig erkennt, mal aber nicht. Also mal 0 anzeigt und mal 1...
Hat wer eine Idee? 1000 DANKE und VLG
AW: Und wenn Du nicht ständig auf die Nase
22.01.2021 12:40:44
volti
Hallo Chris,
bei mir funktioniert der (von mir angepasste) Part einwandfrei. Ist die Num-Taste an, wird immer true ausgegeben, ist sie aus, dann wird false ausgegeben.
Falls es darum geht, dass beim Senden über SendKeys teilweise der Num-Block verstellt ist, mache ich das immer so:
Code:
[Cc]

Option Explicit #If Win64 Or VBA7 Then Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _ pbKeyState As Byte) As Long #Else Private Declare Function GetKeyboardState Lib "user32" ( _ pbKeyState As Byte) As Long #End If Sub TestSendKeys() SendMyKeys "Abc" 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

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Und wenn Du nicht ständig auf die Nase
22.01.2021 17:49:32
Chris
Lieber Karl-Heinz, habe kurz gebraucht, bis ich verstanden habe, dass ich statt "Sendkey" Deinen CODE SendMyKeys verwenden muss. Aber klar... und "WUNDERBAR". Klappt perfekt... NumLock schaltet sich nun nicht mehr aus...
1000 DANK. Ihr seid einfach sooo stark!!!

32 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige