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.
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.
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
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*
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.
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. 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. Deshalb kann ich die datren nicht mit ‚FtpPutFile‘ übertragen, ich kann nichts testen.