Shiftlock Status ermitteln

Hallo,

weiß jemand, wie ich ermitteln kann, ob ‚shiftlock‘ aktiv ist?

Problem:

Ein VB-Programm arbeitet noch mit ‚SendKeys‘, geht nicht anders.
Drückt der Anwender vorher auf shiftlock, wird ‚FTP !)":!&(:!:!‘ statt 'ftp 192.168.1.1" gesendet und das führt natürlich zu einem Fehler statt zur Übertragung von Daten.

Weiß jemand, wie ich das Problem lösen kann? Vorläufig werde ich erst mal eine Warnung anzeigen, den Status auslesen und reagieren wäre mir aber lieber. :wink:

Gruß, Rainer

Hallo,

Hi,
pack dir in ein Modul folgende Funktion:

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

Aufruf dann z.B. mit :

if GetKeyState(20) = 1 then msgbox "CapsLock ist gedrückt"

Die 20 steht für die Capslock-Taste

Gruß.Timo

weiß jemand, wie ich ermitteln kann, ob ‚shiftlock‘ aktiv ist?

Problem:

Ein VB-Programm arbeitet noch mit ‚SendKeys‘, geht nicht
anders.
Drückt der Anwender vorher auf shiftlock, wird ‚FTP
!)":!&(:!:!‘ statt 'ftp 192.168.1.1" gesendet und das führt
natürlich zu einem Fehler statt zur Übertragung von Daten.

Weiß jemand, wie ich das Problem lösen kann? Vorläufig werde
ich erst mal eine Warnung anzeigen, den Status auslesen und
reagieren wäre mir aber lieber. :wink:

Gruß, Rainer

Hallo Timo,

DANKE!

Gruß, Rainer

Hallo,

was haellst du davon deinem Formular oder Control vorab ein SendKeys zu schicken, dann erhaellst du im KeyDown event den Shiftstatus.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Problem gelöst
Hallo Peter,

was haellst du davon deinem Formular oder Control vorab ein
SendKeys zu schicken, dann erhaellst du im KeyDown event den
Shiftstatus.

das finde ich nicht so gut, dann habe ich ja ein Zeichen, das ich erst wieder entfernen muß. Die Variante den Status über die API auszulesen finde ich besser, sauberer. Ich hatte die richtige Stelle nur selbst nicht gefunden. Mit der Hilfe habe ich nun eine Prozedur, die ‚Capslock‘ ausschaltet, falls es eingeschaltet ist.
Nachdem ich wußte, wonach ich suchen muß, war’s dann nicht mehr schwer. Das sieht etwas unübersichtlich aus, funktioniert dafür aber mit jedem Windows.

 Private Type OSVERSIONINFO
 dwOSVersionInfoSize As Long
 dwMajorVersion As Long
 dwMinorVersion As Long
 dwBuildNumber As Long
 dwPlatformId As Long
 szCSDVersion As String \* 128 ' Maintenance string for PSS usage
 End Type

 ' API declarations:

 Private Declare Function GetVersionEx Lib "kernel32" \_
 Alias "GetVersionExA" \_
 (lpVersionInformation As OSVERSIONINFO) As Long

 Private Declare Sub keybd\_event Lib "user32" \_
 (ByVal bVk As Byte, \_
 ByVal bScan As Byte, \_
 ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

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

 Private Declare Function SetKeyboardState Lib "user32" \_
 (lppbKeyState As Byte) As Long

 ' Constant declarations:
 Const VK\_CAPITAL = &H14
 Const KEYEVENTF\_EXTENDEDKEY = &H1
 Const KEYEVENTF\_KEYUP = &H2
 Const VER\_PLATFORM\_WIN32\_NT = 2
 Const VER\_PLATFORM\_WIN32\_WINDOWS = 1


Private Sub Command1\_Click()
 Dim o As OSVERSIONINFO
 Dim CapsLockState As Boolean

 o.dwOSVersionInfoSize = Len(o)
 GetVersionEx o
 Dim keys(0 To 255) As Byte
 GetKeyboardState keys(0)

 ' CapsLock handling:
 CapsLockState = keys(VK\_CAPITAL)
 If CapsLockState = True Then 'Turn capslock on
 If o.dwPlatformId = VER\_PLATFORM\_WIN32\_WINDOWS Then '=== Win95/98
 keys(VK\_CAPITAL) = 0
 SetKeyboardState keys(0)
 ElseIf o.dwPlatformId = VER\_PLATFORM\_WIN32\_NT Then '=== WinNT
 'Simulate Key Press
 keybd\_event VK\_CAPITAL, &H45, KEYEVENTF\_EXTENDEDKEY Or 0, 0
 'Simulate Key Release
 keybd\_event VK\_CAPITAL, &H45, KEYEVENTF\_EXTENDEDKEY \_
 Or KEYEVENTF\_KEYUP, 0
 End If
 End If

End Sub

Gruß, Rainer

Hallo Rainer,

standest ein wenig auf dem Schlauch oder? *feix*
Zu den Alternativ genannten Varianten noch eine andere. *feix*

Mache eine Temp. Form, setze darauf eine Statusbar. Ein Panel davon gibst du die Eigenschaft „CapsLook“ Diese kannst du dann nach belieben abfragen und weisst ergo ob Capslook aktiviert ist *zwinker*

MfG Alex

Hi Anno,

standest ein wenig auf dem Schlauch oder? *feix*

ja, lach nur. Ich habe in der API-guide ‚GetKeyboardState‘ einfach nicht gesehen, obwohl ich gezielt da gesucht habe. Ich habe aber Hilfe bekommen, ist eben w-w-w. :wink:

Zu den Alternativ genannten Varianten noch eine andere. *feix*

Mache eine Temp. Form, setze darauf eine Statusbar. Ein Panel
davon gibst du die Eigenschaft „CapsLook“ Diese kannst du dann
nach belieben abfragen und weisst ergo ob Capslook aktiviert
ist *zwinker*

Das verstehe ich immer noch nicht. Werde ich probieren, aber nicht jetzt. :wink: Im Moment schmeckt das Bier zu gut, da programmiere ich besser nicht. Wenn Du’s fertig hast, mail doch mal 'nen Beispielcode. *g* Drängt aber nicht, das Programm ist geändert, das Problem wird nicht mehr auftreten. Ist halt dumm, wenn ich auf SendKeys angewiesen bin, weil ich es anders nicht kann. Ich weiß noch nicht mal, welches BS auf dem Rechner ist, auf den ich Daten übertrage. :wink: Deshalb kann ich die datren nicht mit ‚FtpPutFile‘ übertragen, ich kann nichts testen.

Gruß, Rainer