COMO CORRIGIR O RUN-TIME ERROR 70 DO VB NO WIN7?

KNILSSON 18/08/2014 12:42:33
#440529
Mudei minha versão do windows xp para o 7 e agora está dando esse erro quando estou programando. O executavel roda sem problemas.
Essa é a parte que dá erro:
If KeyAscii = vbKeyReturn Then
SendKeys ([Ô]{TAB}[Ô])
SendKeys [Ô]{Home}+{End}[Ô]
KeyAscii = 0
End If

O erro está ligado ao comando SendKeys. Já procurei no forum e não achei nenhum comentário sobre esse erro.
Alguém poderia ajudar ?
Agradeço desde já!
MARCELO.TREZE 18/08/2014 13:16:08
#440531
você instalou o sp6 do visual basic
TUNUSAT 18/08/2014 13:21:43
#440532
Resposta escolhida
KNILSSON,

O velho truque do UAC habilitado...

Veja isto:
http://blogs.msdn.com/b/luisdem/archive/2012/04/15/compatibilidade-de-aplica-231-245-es-visual-basic-6-0-no-windows-7.aspx

================================================
2. Permissão Negada

No Windows 7, o uso do método SendKeys gera o erro “Run-tine error [ô]70[ô]: Permission denied” quando o UAC está habilitado. A Figura 3 exibe um DUMP coletado, para uma das aplicações diagnosticadas, no momento em que o erro ocorre. Através do DUMP é possível verificar que o erro ocorreu devido ao uso da função SendKeys:
Existem algumas soluções para esse corrigir esse problema sem a necessidade de executar a aplicação com privilégio elevado ou desativar o UAC. Sendo algumas delas:
• Recompilar a aplicação VB6 no Windows 7. Esse problema de incompatibilidade foi corrigido na última versão do runtime do VB6 (MSVBVM60.DLL) que agora utiliza um método interno diferente para realizar a ação. Essa solução corrige o problema de acesso negado do código compilado, entretanto, não elimina o erro durante o debug do código através da IDE do VB6.

• Substituir o SendKeys pela API PostMessage, conforme:
Public Declare Function PostMessage Lib [Ô]user32[Ô] Alias [Ô]PostMessageA[Ô] (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then
SendKeys [Ô]{tab}[Ô] [ô]13 = Enter Key
PostMessage hwnd, &H100, &HD&, &H1C0001
End If

End Sub

================================================

[][ô]s,
Tunusat.
KNILSSON 18/08/2014 14:10:43
#440538
Eu ja instalei o SP6 e não resolveu nada[Ô]
KNILSSON 18/08/2014 14:13:39
#440539
TUNUSAT,

eu vi essa explicação no blog, mas não funcionou ou eu fiz alguma coisa errada. Podia explicar de outra forma ?
SIRIOUS 18/08/2014 14:26:32
#440541
Tente isto:

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


Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
SendKeysA vbKeyTab, True
KeyAscii = 0
End If
End Sub
KNILSSON 18/08/2014 14:44:02
#440543
SIRIUS,

beleza, funcionou certinho. Pena que eu vou ter incluir essa rotina em todos os meus sistemas para parar com esse erro. Mas tá otimo. Vou deixar o tópico aberto mais um tempo para ver se alguem tem outra ideia. Se não aparecer nada eu fecho o tópico e indico sua resposta.

Obrigado!
TUNUSAT 18/08/2014 14:45:07
#440544
KNILSSON,

A [Ô]PostMessage[Ô] é uma API ... A API faz acesso direto a biblioteca de comandos.
Neste caso você substituiria seus [Ô]SendKeys[Ô] por ela.

Bom ... eu ia montar um exemplo, mas acho que não precisa, pois veja esta dica aqui no VBMania:

EVITANDO O METODO SENDKEYS
http://www.vbmania.com.br/index.php?modulo=detalhe&id=6690

Acima, o método SendKeys foi substituído por uma função [Ô]PostMessage[Ô].

Veja também:

SENDKEYS NO WINDOWS VISTA
http://www.vbmania.com.br/index.php?modulo=detalhe&id=8334

SENDKEYS PARA WIN 2000
http://www.vbmania.com.br/index.php?modulo=detalhe&id=694

VB6 SendKeys() permission denied error
http://stackoverflow.com/questions/2307738/vb6-sendkeys-permission-denied-error

Pode apostar que vai dar problema no Windows 8...

====================================================

Bom ... vamos falar um pouco sobre UAC ... já tem muita coisa aqui no fórum também.

Ativar ou desativar o Controle da Conta de Usuário
http://windows.microsoft.com/pt-br/windows/turn-user-account-control-on-off

O Controle da Conta de Usuário (UAC) pode ajudar a impedir alterações não autorizadas no seu computador. O UAC o notificará quando forem feitas alterações no computador que exijam permissão em nível de administrador. Esses tipos de alterações podem afetar a segurança do computador ou podem afetar as configurações de outras pessoas que usam o computador. Recomendamos manter o UAC ativo para ajudar a proteger o computador.

====================================

Você pode mandar seu programa desativar UAC e depois ao sair ativar de novo.

Veja isto:

How do I integrate UAC into my VB6 program?
http://stackoverflow.com/questions/4754093/how-do-i-integrate-uac-into-my-vb6-program

[VB6] Disable UAC
http://www.ic0de.org/archive/index.php/t-9055.html

====================================

[][ô]s,
Tunusat.
SERGIOPASCOAL 07/11/2014 10:41:00
#442354
Para quem está tendo problemas com esse comando, vai uma dica para windows 8 [Ô]tive o mesmo problema[Ô]
Cole isso em um módulo e será resolvido

Public Sub Sendkeys(text$, Optional wait As Boolean = False)
Dim WshShell As Object
Set WshShell = CreateObject([Ô]wscript.shell[Ô])
WshShell.Sendkeys text, wait
Set WshShell = Nothing
End Sub
Tópico encerrado , respostas não são mais permitidas