SetWinEventHook正在从“olemainthreadwndclass”中挂钩事件。仅限课程 [英] SetWinEventHook is hooking event from "olemainthreadwndclass" class only

查看:210
本文介绍了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();






请支持我,提前致谢, 

解决方案

这是Microsoft Office Visio的论坛,但您的问题似乎与Visual Studio编程有关。


您的问题更适合于面向开发人员的MSDN论坛:


https:/ /social.msdn.microsoft.com/Forums/en-US/home?category=vslanguages


https://social.msdn.microsoft.com/Forums/en-US/home?category=visualstudio


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, 

解决方案

This is the forum for Microsoft Office Visio, but your question seems related to Visual Studio programming.

Your question is better suited to the MSDN forums for developers:

https://social.msdn.microsoft.com/Forums/en-US/home?category=vslanguages

https://social.msdn.microsoft.com/Forums/en-US/home?category=visualstudio


这篇关于SetWinEventHook正在从“olemainthreadwndclass”中挂钩事件。仅限课程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆