Office System

The Office Developer Blog (by Luiz Cláudio C. V. Rocha - São Paulo, Brazil)

February 2007 - Posts

VB6 - SendKeys no Windows Vista

Ao rodar um código bastante simples, que transforma Enter em Tab, recebi a mensagem de erro "Permission Denied":

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
   KeyAscii = 0
   SendKeys "{TAB}"
   End If
End Sub

Demorei um pouco a entender o problema, mas enfim cheguei à coclusão que se tratava de uma regra de segurança do Windows Vista.

Para contorná-la, devemos recorrer a APIs do Windows para enviar teclas (o que, aliás, é uma boa prática independentemente da versão do Windows).

A função SendKeys pode ser substituída por esta:

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

Visual Basic 6.0 no Windows Vista
Instalei o Visual Basic 6 no Windows Vista e fiquei surpreso por ter funcionado corretamente sem muita dificuldade, já que o Visual Studio 2003 eu não consegui (apareceram diversas mensagens de erro na instalação).
 
Ao trabalhar com uma aplicação, porém, o desempenho no modo estrutura estava ruim, especialmente quando eu arrastava controles na tela para reposicionar. Na seleção múltipla, ele não conseguia quadricular a borda de todos os controles selecionados. Arrastar múltiplos controles, então, demorava excessivamente.
 
Não se trata de um problema de máquina, pois estou usando Pentium D 2.8GHz - 2037MB RAM.
 
Como eu imaginei, era um problema com o Aero Glass (modo de transparência do Windows Vista), que estava deixando a IDE do VB6 muito pesada. Cliquei na área de trabalho > Personalizar > Cor e aparência da janela e troquei o esquema de cores "Aero do  Windows" por "Básico do Windows Vista". O VB6 voltou a funcionar normalmente.
 
Felizmente o problema é só em modo estrutura. Em modo de execução a aplicação funciona normalmente, mesmo com o Aero ativado.