WinAPI LowLevel Keyboard Hooks

dnewbie run3 at myopera.com
Thu Jul 19 09:19:04 PDT 2012


On Thursday, 19 July 2012 at 15:49:48 UTC, DLimited wrote:
> But what are the differences of loading the Unicode version vs. 
> the ANSI version? I called the Unicode one because I figured 
> that would be the sensible choice, since Unicode is the default 
> for D (if I remember correctly). I have no clue what the actual 
> effects of calling the wrong version would be.
>
> Anyway, here's the of my .dll:
>
> < ------ Code begin ------ >
>
> import std.c.windows.windows;
> import core.sys.windows.dll;
> import core.runtime;
>
>
> extern (C) void gc_init();
> extern (C) void gc_term();
> extern (C) void _minit();
> extern (C) void _moduleCtor();
> extern (C) void _moduleDtor();
>
> extern (Windows) struct KBDLLHOOKSTRUCT {
>   DWORD     vkCode;
>   DWORD     scanCode;
>   DWORD     flags;
>   DWORD     time;
>   ULONG_PTR dwExtraInfo;
> };
> extern (Windows) LRESULT CallNextHookEx(
>     int function() hhk,
>       int nCode,
>        WPARAM wParam,
>         LPARAM lParam
> );
>
>
> __gshared HINSTANCE g_hInst;
>
>
>  extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG 
> ulReason, LPVOID pvReserved) {
> 	return true;
> 	switch (ulReason) {
> 		case DLL_PROCESS_ATTACH:
> 		g_hInst = hInstance;
> 		Runtime.initialize;
> 		//dll_process_attach( hInstance, true );
> 		break;
> 		
> 		case DLL_PROCESS_DETACH:
> 		dll_process_detach( hInstance, true );
> 		break;
>
> 		case DLL_THREAD_ATTACH:
> 		dll_thread_attach( true, true );
> 		break;
> 		case DLL_THREAD_DETACH:
> 		dll_thread_detach( true, true );
> 		break;
> 		
> 		default:
> 		return true;
> 	}
> 	return true;
> }
>
> extern (Windows) LRESULT LowLevelKeyboardProc(int code, WPARAM 
> wParam, LPARAM lParam)
> {
>     KBDLLHOOKSTRUCT* details = cast(KBDLLHOOKSTRUCT*) lParam;
> 	MessageBoxA(null, cast(char *)"WHOA", "Error",
> 		    MB_OK | MB_ICONEXCLAMATION);
>     if(code == 0 && wParam == WM_KEYDOWN)
>     {
>         if(details.vkCode == 0x41)
>         {
> 			
>             return 1;
>         }
>     }
>
>     return CallNextHookEx(null, code, wParam, lParam);
> }
>
> < ------ Code End ------ >
>
> Lots of copy&paste was used. I injected some senseless code to 
> try and check if a specific function ever gets called, though I 
> now realise the DllLoad itself is what fails. Haven't cleaned 
> it back up yet, though.
>
> The .def file contains the following: (including newlines)
>
> < ------ .DEF BEGIN ------ >
> LIBRARY "keydll.dll"
> EXETYPE NT
> SUBSYSTEM WINDOWS
> CODE PRELOAD
> DATA PRELOAD
> < ------ .DEF END   ------ >
>
>
> I compiled the dll using:
> dmd -ofkeydll.dll -L/IMPLIB keydll.d keydll.def
>
> No linker/compiler errors.

I guess you have to 'export' the function:
extern (Windows) export LRESULT LowLevelKeyboardProc(int code, 
WPARAM
wParam, LPARAM lParam)

and include
EXPORTS
   LowLevelKeyboardProc

in the .DEF file





More information about the Digitalmars-d-learn mailing list