关于钩子拦截消息后能否截杀?解决方法

关于钩子拦截消息后能否截杀?
最近在学习钩子, 自己写了一个全局键盘钩子,想做成改建的效果. 下面是简单的代码
//全局变量
HINSTANCE hInstance = NULL ;
HHOOK hHook = NULL ;

//入口函数
BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH: break ;

  case DLL_THREAD_ATTACH: break ; //线程和进程开始时

  case DLL_THREAD_DETACH: break ;

  case DLL_PROCESS_DETACH: 
if( hHook != NULL )
UnhookWindowsHookEx( hHook ) ;
break ; //线程和进程结束时
}
 
hInstance = (HINSTANCE)hModule ;

return TRUE ;
}


//拦截键盘消息的回调函数
LRESULT CALLBACK GetKeyboardMsg(int nCode, WPARAM wParam, LPARAM lParam)
{
char Show_Char = NULL ;
if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode) )
//MessageBox(NULL, "截获击键消息了!", NULL, MB_OK) ;
switch( wParam )
{
case '1':
keybd_event(81,0,0,0) ;
keybd_event(81,0,KEYEVENTF_KEYUP,0) ;
break ;
}


LRESULT ReGetFun = CallNextHookEx(hHook, nCode, wParam, lParam ) ;
return ReGetFun ;

}


//安装钩子函数
EXPORT BOOL InstallHook()
{
hHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)GetKeyboardMsg, hInstance, 0) ;

if( hHook == NULL )
{
MessageBox(NULL, "钩子安装失败", "HookDll", MB_OK) ;
return FALSE ;
}

return TRUE ;
}

我想把1建改成Q建的效果,自己再写了个程序调用,可以达到效果,可是问题是,每次输出Q之前都会再输出1一次,好像是消息并没有截杀,只是拦截,拦截后消息还是继续运行。
请问要怎么做,才能拦截消息改成自己想要的结果后,不让原本的消息继续进行,而让自己改成的消息进行就好?

------解决方案--------------------
LRESULT CALLBACK LowLevelKeyboardProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(((PKBDLLHOOKSTRUCT)lParam)->vkCode=='Z')
{
INPUT Input[1];
Input[0].type=INPUT_KEYBOARD;
Input[0].ki.wVk='C';
Input[0].ki.dwFlags=((PKBDLLHOOKSTRUCT)lParam)->flags&LLKHF_UP?KEYEVENTF_KEYUP:0;
Input[0].ki.wScan=MapVirtualKeyExW('C',0,0);
Input[0].ki.time=0;
Input[0].ki.dwExtraInfo=0;
SendInput(1,Input,sizeof(INPUT));
return 1;
}
return CallNextHookEx(0,nCode,wParam,lParam);
}

int wmain()
{
MSG msg;
SetWindowsHookExW(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandleW(0),0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}