package Kbh;
our $VERSION = '0.01';
require XSLoader;
XSLoader::load('Kbh', $VERSION);
sub process_key {
print "process_key in perl\n";
}
1;
####
use ExtUtils::MakeMaker;
WriteMakefile (
NAME => 'Kbh',
VERSION => '0.01',
OBJECT => 'hook.o Kbh.o',
);
####
LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam);
void processKey();
void register_hook();
void unregister_hook();
void MsgLoop();
####
#include
#include
#include "stdio.h"
#include "hook.h"
HHOOK hook;
LRESULT CALLBACK HookCallback( int nCode, WPARAM wParam, LPARAM lParam ) {
processKey();
return CallNextHookEx( hook, nCode, wParam, lParam );
}
void processKey() {
printf("processKey in C\n");
}
void MsgLoop() {
MSG message;
while ( GetMessage( &message, NULL, 0, 0 ) ) {
TranslateMessage(&message);
DispatchMessage(&message);
}
}
void register_hook() {
HMODULE hMod = (HMODULE) GetModuleHandle(NULL);
hook = SetWindowsHookEx( WH_KEYBOARD_LL, HookCallback, hMod, 0 );
}
void unregister_hook() {
UnhookWindowsHookEx(hook);
}
####
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "hook.h"
MODULE = Kbh PACKAGE = Kbh
PROTOTYPES: DISABLE
void
MsgLoop()
void
register_hook()
void
unregister_hook()
void
processKey()
INIT:
int count;
PPCODE:
dSP;
PUSHMARK(SP);
count= call_pv("Kbh::process_key", G_DISCARD|G_NOARGS);
if (count != 0)
croak("Big trouble\n");
####
Perl Makefile.pl
dmake
####
use lib qw(./lib ./blib/arch/auto/Kbh);
use Kbh;
Kbh::register_hook();
Kbh::MsgLoop;
Kbh::unregister_hook();