Vista 부터 지원하게 된 '사용자 계정 콘트롤(UAC)' 이 문제가 되는 경우중에 하나이다.
아마도 Sendkeys 라는 펑션이 사용자가 예측할 수 없는 기능을 수행하는 (사용자는 A키를 눌렀는데 B키가 반응하게도 할 수 있으니까..) 펑션이기때문에 UAC에서 Admin권한을 획득해야 사용가능한 것 같다.
해결 방안은 첫번째로 '사용자 계정 콘트롤'을 사용하지 않도록 하는 방법이 있다. 필수적으로 리붓해야 원하는 대로 사용이 가능할 것이다.
두번째로 웹서핑으로 검색한 결과이다.
자유로운영혼님께서 작성한 블로그글을 링크한다.
http://blog.daum.net/-freeman/4
- 두번째 해결 방법 -
그래서 이래저래 뒤져본봐. 해결방법은 나온다. 기존에 사용되고 있는 다른 API를 사용하여 처리하는 방법이 잇다.
아래처럼 모듈을 하나 만들고
Option Explicit
Private Const KEYEVENTF_KEYUP = &H2
Private Const INPUT_KEYBOARD =
1
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As
Byte
End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long,
pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub
CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal
ByteLen As Long)
Public Function SendKeysA(ByVal vKey As Integer, Optional booDown As Boolean = False)
Dim GInput(0) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = vKey
If Not booDown Then
KInput.dwFlags = KEYEVENTF_KEYUP
End If
GInput(0).dwType =
INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
Call SendInput(1, GInput(0), Len(GInput(0)))
End Function
아래와 같은 폼에 코딩을 한다.
Option Explicit
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii =
vbKeyReturn Then
SendKeysA vbKeyTab, True
KeyAscii =
0
End If
End Sub
그리고 비스타에서 테스트를 해보면 SendKeys에서 발생되던 오류가 없어지고 기존처럼 잘 동작하는게 보일것이다..