问题描述
我有程序挂钩所有应用程序事件。我的程序始终以管理员身份运行。
每当我尝试获取事件时它只会挂钩来自课程的事件
" olemainthreadwndclass" 即可。它在用户模式和管理模式的示例应用程序上都正常工作。
复制到我的项目的相同代码无效。代码如下所示。
这是CMainFrame.cpp ..
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
无效ShutdownMSAA()
{  
UnhookWinEvent(hook);  
UnhookWinEvent(HookCreateToHide);
UnhookWinEvent(HookNameChange);
UnhookWinEvent(HookFocus);
UnhookWinEvent(HookSysCapEnd);
UnhookWinEvent(HookSysForeGrnd);  
CoUninitialize();
}
void CALLBACK HandleWinEvent(HWINEVENTHOOK tEmphook,
DWORD事件,
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);
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);
删除Obj_SecondaryClass;
}
int CMainFrame :: OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFrameWnd :: OnCreate(lpCreateStruct)== -1)
{
返回-1;
}
EnterCriticalSection(& FirstCSec);
InitializeMSAA();
LeaveCriticalSection(& FirstCSec);
返回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);
返回TRUE;
}
CMainFrame :: OnSetFocus(CWnd *)
{
}
BOOL CMainFrame :: OnCmdMsg(UINT nID,int nCode,void * pExtra,AFX_CMDHANDLERINFO * pHandlerInfo)
{
返回CFrameWnd :: OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
LRESULT CMainFrame :: WindowProc(UINT消息,WPARAM wParam,LPARAM lParam)
{
HANDLE hThread2;
DWORD dwSessionID;
switch(message)
{
case WM_NCACTIVATE:break;
案例WM_WINDOWS_LOGON:break;
case WM_APPBLOCK:
MySelf :: Me() - > m_StatusOne = TRUE;
休息;
case WM_UNAPPBLOCK:
MySelf :: Me() - > m_StatusTwo = FALSE;
休息;
case WM_APPBLOCKMSG:
Obj_SecondaryClass-> ChangeFunOne();
休息;
案例WM_DESTROY:
案例WM_QUIT:
case WM_ENDSESSION:PostQuitMessage(0);
休息;
}
返回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 =新的CMainFrame;
if(!pFrame)
返回FALSE;
m_pMainWnd = pFrame;
pFrame-> LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
NULL,NULL);
pFrame-> ShowWindow(SW_HIDE);
pFrame-> UpdateWindow();
返回TRUE;
}
int MainApplication :: ExitInstance()
{
返回CWinApp :: ExitInstance();
}
请支持我,提前致谢,
I have program that hooks for all application events. My program is always run as administrator.
Whenever I am trying to get the events It only hooks for the events which coming from the class
"olemainthreadwndclass". It is working properly on a sample application both user mode and admin mode.
The same code copied to my project is not working. The code is referred below.
Here is the 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); 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) { if(CFrameWnd::OnCreate(lpCreateStruct) == -1) { return -1; } EnterCriticalSection(&FirstCSec); InitializeMSAA(); LeaveCriticalSection(&FirstCSec); 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; } 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); }
Here is the 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(); }
Please Support me, Thanks in advance,
这篇关于SetWinEventHook正在从“olemainthreadwndclass”中挂钩事件。仅限课程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!