On Thursday, 19 July 2012 at 16:38:19 UTC, DLimited wrote:

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

Thanks, I changed that. Also, I changed LoadLibraryW( ) to
LoadLibraryA( ) in the main program and now it works (kinda). I
feel stupid now, although I still don't get why it wouldn't work
with LoadLibraryW.

Acutally, that was only the half-truth. The .dll seems to get loaded correctly ( GetLastError returns 0), but my keyboard-presses aren't captured at all. My system seems to freeze up for ~5sec, after which everything resumes. Any keyboard input seems to get buffered and is processed by my terminal after my program closes.

Also I'm unsure about types because the often-used HHOOK is not defined with my imports, so I'm left guessing what it is. I used the type int function() instead (my best guess).

Here's the code:

< ------- CODE BEGIN --------- >

import std.c.windows.windows;
import std.stdio;
import core.thread;

extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleDtor();
extern (C) void _moduleUnitTests();
extern (Windows) int function() SetWindowsHookExA( int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId );
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
);

extern (Windows) bool UnhookWindowsHookEx(
   int function() hhk
);

extern (Windows) HMODULE LoadLibraryA(
   LPCTSTR lpFileName
);


        
extern (Windows)
int WinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
{
    int result;

    gc_init();                  // initialize garbage collector
    _minit();                   // initialize module constructor table

    try
    {
        _moduleCtor();          // call module constructors
        //_moduleUnitTests();   // run unit tests (optional)

result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

        _moduleDtor();          // call module destructors
    }

    catch (Exception o)         // catch any uncaught exceptions
    {
        MessageBoxA(null, cast(char *)o.toString(), "Error",
                    MB_OK | MB_ICONEXCLAMATION);
        result = 0;             // failed
    }

    gc_term();                  // run finalizers; terminate garbage collector
    return result;
}

int myWinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
{
        
        HOOKPROC hkprcSysMsg;
        HINSTANCE hinstDLL;
        extern (Windows) int function() hhookSysMsg;

hinstDLL = LoadLibraryA(cast(LPCTSTR)"correct_absolute_path\\keydll.dll");
writeln(GetLastError()); //returns 0
hkprcSysMsg = cast(HOOKPROC)GetProcAddress(hinstDLL, "LowLevelKeyboardProc");
writeln(GetLastError()); //return 0
hhookSysMsg = SetWindowsHookExA(
                    13,
                    hkprcSysMsg,
                    hinstDLL,
                    0);
        
        writeln(GetLastError()); // returns 0 aswell
        Thread.sleep( dur!("seconds")(10) );
        UnhookWindowsHookEx( hhookSysMsg );

        return 0;
}

Reply via email to