Ir ao conteúdo

problemas com SetWindowsHookEx Erro 127 (C#)


maclogic

Posts recomendados

Postado

Tarde,

Estou tentando utilizar o API SetWindowsHookEx, para capturar teclas pressionadas pelo usuario.

Meu codigo é simples(abaixo), baseado no exemplo no site da MS. O problema é que ele não consegue attachar-se a funcao de callback. não consigo entender o porque...

Alguem ai já tentou fazer algo parecido?

Obrigado,

Mac

**** inicio da classe form

public delegate int HookProcDelegate (int nCode, int wParam, int lParam);

const int WH_KEYBOARD_LL = 13;

static int nKeyboardHook;

public static HookProcDelegate CallBackProcAddress;

//Attachment to APIs

[DllImport "user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall,SetLastError=true )]

public static extern int SetWindowsHookEx(int idHook, HookProcDelegate lpfn, int hInstance, int threadId);

[DllImport "User32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall,SetLastError=true )]

public static extern int CallNextHookEx(int idHook, int nCode, int wParam, int lParam);

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall, SetLastError=true )]

public static extern bool UnhookWindowsHookEx(int idHook);

**** Form Load

CallBackProcAddress = new HookProcDelegate(callback);

nKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL ,

CallBackProcAddress ,

AppDomain.GetCurrentThreadId(),

0);

if (nKeyboardHook != 0 )

{

label1.Text = "Keyboard hooked";

}

else

{

label1.Text = "Keyboard NOT hooked ("+Marshal.GetLastWin32Error().ToString()+")"; }

*** Form Unload

UnhookWindowsHookEx(nKeyboardHook);

*** Callback

public static int callback(int nCode, int wParam, int lParam)

{

if (nCode == 0)

{

//Do checkups for keystrokes

}

return CallNextHookEx(nKeyboardHook, nCode, wParam, lParam);

}

Postado

Ai galera só pra quem tiver interessado na resposta, eu descobri o problema:

A funcao "AppDomain.GetCurrentThreadId()" não retorna o handle correto para esse tipo

de implementacao. Ao invés, use "GetModuleHandle(null)".

O snipet funciona corretamente agora! :)

WOOOOOOOOOOOOOOOOAHHHH!

  • Membro VIP
Postado

CASO RESOLVIDO!

Caso o autor do tópico necessite, o mesmo será reaberto, para isso o mesmo deverá procurar um Moderador da área e solicitar o desbloqueio!

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!