本文介绍了SetWinEventHook正在从“olemainthreadwndclass”中挂钩事件。仅限课程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有程序挂钩所有应用程序事件。我的程序始终以管理员身份运行。 

每当我尝试获取事件时它只会挂钩来自课程的事件 

" 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(s​​zWinClassName );
if(
szGetWindowsClass.Collat​​eNoCase(" SysTreeView32")!= 0&&
szGetWindowsClass.Collat​​eNoCase(" SysListView32")!= 0&&
szGetWindowsClass.Collat​​eNoCase(" msctls_statusbar32")!= 0&&
szGetWindowsClass.Collat​​eNoCase(&#;#32770")!= 0 &&
szGetWindowsClass.Collat​​eNoCase(" 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”中挂钩事件。仅限课程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 09:18
查看更多