Como eu imaginava. Acontece que estou fazendo um hook de teclado. Usei como base uma outra rotina, que funcionava. Resolvi fazer um do zero que é pra aprender mais sobre APIs. Minha função:
Public Function MonitorTeclado(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Vale As Boolean
Vale = True
If nCode = HC_ACTION Then
Vale = Not ((wParam = 91) Or (wParam = 92))
End If
If Vale Then
MonitorTeclado = CallNextHookEx(HookId, nCode, wParam, ByVal lParam)
Else
MonitorTeclado = -1
End If
End Function
A intenção inicial é só bloquear essas teclas do Windows (que abrem o menu iniciar). Para iniciar o hook:
HookId = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MonitorTeclado, App.hInstance, 0)
Para finalizar:
UnhookWindowsHookEx HookId
Até aí, tudo como manda a documentação, que também diz que, para a tecla "ter efeito", a função que faz o monitoramente tem que retornar 0. Se é pra tecla ser bloqueada, é pra retornar qualquer valor que não seja 0. Pois bem, eu retorno -1, como na rotina que usei de exemplo. Acontece que a minha não funciona. A única coisa que vi de diferente entre a minha rotina a outra é o uso da API CopyMemory. A documentação diz que a função de monitoramente recebe em wParam o código virtual da tecla. No caso das teclas do windows, 91 (esquerda) e 92 (direita). A função exemplo, fazia assim:
CopyMemory p, ByVal lParam, Len(p)
Copiava de lParam pra p, é uma estrutura. Essa daqui:
Public Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type
E depois fazia algo como:
If p.vkCode = xx Then ' xx é o número da tecla
Aí eu fiquei sem entender... Pelo que entendi, o "bloqueio" das teclas tem a ver somente com o valor que a função retorna. Ninguém falou nada de ter que usar o CopyMemory. Por isso eu queria saber se essa função faz alguma coisa além de copiar partes da memória de um canto para outro... Alguém saberia me dizer se o fato deu não ter usado o CopyMemory na minha rotina pode ter influenciado em alguma coisa?
Obrigado.