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