Could it be possible, to do this in FWH ?
Extraordinary, Microsoft's own VB- SendKeys makes problems on some Win2k-Systems
The following source solves the problem.
The string contains the Keys to be sended.
Of cource the new SendKeysEx-Function supports also "non visible Keys",
like ALT, STRG and so on.
- Code: Select all Expand view
// the needed API-Declarations
Private Declare Sub keybd_event Lib "user32" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
// Visual-Basic
// --------------
Private Declare Function VkKeyScan Lib "User32" _
Alias "VkKeyScanA" ( _
ByVal cChar As Byte) As Integer
// FWH
// --------
DLL32 FUNCTION VkKeyScanA;
( cChar AS BYTE ) ;
AS _INT PASCAL;
LIB "USER32"
// Visual-Basic
// --------------
Private Declare Function MapVirtualKey Lib "User32" _
Alias "MapVirtualKeyA" ( _
ByVal wCode As Long, _
ByVal wMapType As Long) As Long
// FWH
// ----------
DLL32 FUNCTION MapVirKeyA;
( wCode AS LONG, ;
wMapType AS LONG ) ;
AS LONG PASCAL;
FROM "MapVirtualKeyA" LIB "USER32"
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_EXTENDEDKEY = &H1
// Virtual KeyCodes
Private Enum eVirtualKeyCode
VK_BAK = &H8
VK_TAB = &H9
VK_CLEAR = &HC
VK_RETURN = &HD
VK_SHIFT = &H10
VK_CONTROL = &H11
VK_MENU = &H12
VK_PAUSE = &H13
VK_CAPITAL = &H14
VK_ESCAPE = &H1B
VK_PRIOR = &H21
VK_NEXT = &H22
VK_END = &H23
VK_HOME = &H24
VK_LEFT = &H25
VK_UP = &H26
VK_RIGHT = &H27
VK_DOWN = &H28
VK_SELECT = &H29
// NEW ! Windows-Key
VK_SNAPSHOT = &H2C
VK_INSERT = &H2D
VK_DELETE = &H2E
VK_HELP = &H2F
VK_F1 = &H70
VK_F2 = &H71
VK_F3 = &H72
VK_F4 = &H73
VK_F5 = &H74
VK_F6 = &H75
VK_F7 = &H76
VK_F8 = &H77
VK_F9 = &H78
VK_F10 = &H79
VK_F11 = &H7A
VK_F12 = &H7B
VK_F13 = &H7C
VK_F14 = &H7D
VK_F15 = &H7E
VK_F16 = &H7F
VK_NUMLOCK = &H90
VK_SCROLL = &H91
// New ! Windows-Key
VK_WIN = &H5B
// NEW ! Key for Kontextmenue
VK_APPS = &H5D
End Enum
// sending Text with simulating keystrokes to the active control
Public Sub SendKeysEx(ByVal sText As String)
Dim VK As eVirtualKeyCode
Dim sChar As String
Dim i As Integer
Dim bShift As Boolean
Dim bAlt As Boolean
Dim bCtrl As Boolean
Dim nScan As Long
Dim nExtended As Long
// Sending each single char
For i = 1 To Len(sText)
// extract current char
sChar = Mid$(sText, i, 1)
// special character ?
bShift = False: bAlt = False: bCtrl = False
If sChar = "{" Then
If UCase$(Mid$(sText, i + 1, 9)) = "BACKSPACE" Then
VK = VK_BAK
i = i + 9
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "BS" Then
VK = VK_BAK
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "BKSP" Then
VK = VK_BAK
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "BREAK" Then
VK = VK_PAUSE
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 8)) = "CAPSLOCK" Then
VK = VK_CAPITAL
i = i + 9
ElseIf UCase$(Mid$(sText, i + 1, 6)) = "DELETE" Then
VK = VK_DELETE
i = i + 7
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "DEL" Then
VK = VK_DELETE
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "DOWN" Then
VK = VK_DOWN
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "UP" Then
VK = VK_UP
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "LEFT" Then
VK = VK_LEFT
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "RIGHT" Then
VK = VK_RIGHT
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "END" Then
VK = VK_END
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "ENTER" Then
VK = VK_RETURN
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "HOME" Then
VK = VK_HOME
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "ESC" Then
VK = VK_ESCAPE
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "HELP" Then
VK = VK_HELP
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 6)) = "INSERT" Then
VK = VK_INSERT
i = i + 7
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "INS" Then
VK = VK_INSERT
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 7)) = "NUMLOCK" Then
VK = VK_NUMLOCK
i = i + 8
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "PGUP" Then
VK = VK_PRIOR
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "PGDN" Then
VK = VK_NEXT
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 10)) = "SCROLLLOCK" Then
VK = VK_SCROLL
i = i + 11
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "TAB" Then
VK = VK_TAB
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F1" Then
VK = VK_F1
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F2" Then
VK = VK_F2
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F3" Then
VK = VK_F3
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F4" Then
VK = VK_F4
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F5" Then
VK = VK_F5
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F6" Then
VK = VK_F6
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F7" Then
VK = VK_F7
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F8" Then
VK = VK_F8
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F9" Then
VK = VK_F9
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F10" Then
VK = VK_F10
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F11" Then
VK = VK_F11
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F12" Then
VK = VK_F12
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F13" Then
VK = VK_F13
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F14" Then
VK = VK_F14
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F15" Then
VK = VK_F15
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F16" Then
VK = VK_F16
i = i + 4
// NEW ! Windows-Key
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "WIN" Then
VK = VK_WIN
i = i + 4
// NEW ! Kontextmenue
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "APPS" Then
VK = VK_APPS
i = i + 5
// NEW ! PrintScreen (PRINT)
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "PRINT" Then
VK = VK_SNAPSHOT
i = i + 6
End If
ElseIf sChar = "+" Then
// Switch-key
VK = VK_SHIFT
ElseIf sChar = "%" Then
' ALT
VK = VK_MENU
ElseIf sChar = "^" Then
' STRG
VK = VK_CONTROL
Else
// Detect Virtual KeyCode ...
VK = VkKeyScan(Asc(sChar))
End If
nScan = MapVirtualKey(VK, 2)
nExtended = 0
If nScan = 0 Then nExtended = KEYEVENTF_EXTENDEDKEY
nScan = MapVirtualKey(VK, 0)
If VK <> VK_SHIFT Then
// Uppercase...?
bShift = (VK And &H100)
bCtrl = (VK And &H200)
bAlt = (VK And &H400)
VK = (VK And &HFF)
End If
// Press and release
If bShift Then keybd_event VK_SHIFT, 0, 0, 0
If bCtrl Then keybd_event VK_CONTROL, 0, 0, 0
If bAlt Then keybd_event VK_MENU, 0, 0, 0
keybd_event VK, nScan, nExtended, 0
keybd_event VK, nScan, KEYEVENTF_KEYUP Or nExtended, 0
// Shift-key release
If bShift Then keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
If bCtrl Then keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
If bAlt Then keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
Next i
End Sub
examples :
txtName:SetFocus()
SendKeysEx "Dieter Otter"
Extension...
In opposition to "normal" SendKeys, it is possible to press with SendKeysEx
also additional System-keys :
Windows-Key
Kontextmenue-Key
Print-Key (PrintScreen)
START > open Programms
SendKeysEx "{WIN}"
Show Kontextmenue of the TextBox
txtName:SetFocus()
SendKeys "{APPS}"
Screen of aktive Window to Clipboard
SendKeys "{PRINT}"
Regards
Uwe