0
我有一个挂钩所有应用程序事件的程序。我的程序总是以管理员身份运行。 每当我试图获得事件它只会涉及来自类的事件 “olemainthreadwndclass”。它在用户模式和管理员模式下均适用于示例应用程序。 复制到我的项目中的相同代码不起作用。代码在下面提到。SetWinEventHook仅挂钩来自“olemainthreadwndclass”的事件
这里是CMainFrame.cpp ..
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
void ShutdownMSAA()
{
UnhookWinEvent(hook);
UnhookWinEvent(HookCreateToHide);
UnhookWinEvent(HookNameChange);
UnhookWinEvent(HookFocus);
UnhookWinEvent(HookSysCapEnd);
UnhookWinEvent(HookSysForeGrnd);
CoUninitialize();
}
void CALLBACK HandleWinEvent(HWINEVENTHOOK tEmphook, DWORD event, HWND hwnd,
LONG idObject, LONG idChild,
DWORD dwEventThread, DWORD dwmsEventTime)
{
if(hwnd)
{
TCHAR szWinClassName[256];
if(GetClassName(hwnd, szWinClassName, sizeof(szWinClassName)/sizeof(TCHAR)-1))
{
CString szGetWindowsClass(szWinClassName);
if(szGetWindowsClass.CollateNoCase("SysTreeView32") != 0 &&
szGetWindowsClass.CollateNoCase("SysListView32") != 0 &&
szGetWindowsClass.CollateNoCase("msctls_statusbar32") != 0 &&
szGetWindowsClass.CollateNoCase("#32770") != 0 &&
szGetWindowsClass.CollateNoCase("OleMainThreadWndClass") != 0)
{
OutputDebugString("#########################");
CString szdwEventThread = "";
szdwEventThread.Format(": %ld",dwEventThread);
szGetWindowsClass += szdwEventThread;
OutputDebugString(szGetWindowsClass);
}
}
}
}
void InitializeMSAA()
{
CoInitialize(NULL);
g_hook = SetWinEventHook(
EVENT_SYSTEM_MENUSTART, EVENT_SYSTEM_MENUEND, 0, HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
HookCreateToHide = SetWinEventHook(EVENT_OBJECT_CREATE,EVENT_OBJECT_HIDE, 0,
HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
HookNameChange = SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, 0,
HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
HookFocus = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0,
HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
HookSysCapEnd = SetWinEventHook(EVENT_SYSTEM_CAPTUREEND, EVENT_SYSTEM_CAPTUREEND, 0,
HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
HookSysForeGrnd = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0,
HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
}
CMainFrame::CMainFrame():Obj_SecondaryClass(NULL)
{
AfxGetApp()->LoadIcon(IDI_ICON);
Obj_SecondaryClass = new SecondaryClass();
Obj_SecondaryClass->SetActive(TRUE);
}
CMainFrame::~CMainFrame()
{
Obj_SecondaryClass->SetActive(FALSE);
delete Obj_SecondaryClass;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
try
{
if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
{
return -1;
}
EnterCriticalSection(&FirstCSec);
InitializeMSAA();
LeaveCriticalSection(&FirstCSec);
}
catch(...)
{
return -1;
}
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if(!CFrameWnd::PreCreateWindow(cs))
return FALSE;
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
void CMainFrame::OnSetFocus(CWnd*)
{
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
HANDLE hThread2;
DWORD dwSessionID;
switch(message)
{
case WM_NCACTIVATE :
break;
case WM_WINDOWS_LOGON :
break;
case WM_APPBLOCK :
MySelf::Me()->m_StatusOne = TRUE;
break;
case WM_UNAPPBLOCK:
MySelf::Me()->m_StatusTwo = FALSE;
break;
case WM_APPBLOCKMSG:
Obj_SecondaryClass->ChangeFunOne();
break;
case WM_DESTROY:
case WM_QUIT:
case WM_ENDSESSION:
PostQuitMessage(0);
break;
}
return CFrameWnd::WindowProc(message, wParam, lParam);
}
这里是MainApplication.cpp ..
MainApplication::MainApplication()
{
}
MainApplication theApp;
BOOL MainApplication::InitInstance()
{
InitializeCriticalSection(&g_cCritSec);
InitializeCriticalSection(&appBlocker_cCritSec);
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
NULL,
NULL);
pFrame->ShowWindow(SW_HIDE);
pFrame->UpdateWindow();
return TRUE;
}
int MainApplication::ExitInstance()
{
return CWinApp::ExitInstance();
}
请支持我,在此先感谢,
“它只会吸引来自类”olemainthreadwndclass“的事件。”你能发布一些示例输出来支持这个吗? 'if'条件写在你发布的代码中的方式,'OutputDebugString(“#########################”);对于''olemainthreadwndclass'''不会被执行' '。 – dxiv
它不会给出任何输出并不意味着它不会挂钩。为了让事件钩住除了*“olemainthreadwndclass”*以外的类,我们在那里进行比较,但它没有达到意味着没有事件比被比较的事件挂钩。 –
@AkhilVSuku我之前的评论是指出,OP没有指出它是如何失败的,或者它是如何确定它失败的。 – dxiv