Почему возникает странная вещь с WH_CBT
От: redkin_pavel  
Дата: 19.10.06 13:03
Оценка:
Почему то ловятится та программа, которая вызывает DLL- с WH_CBT
, хотся хук задается так
CBTSysHook = SetWindowsHookEx(WH_CBT, &CBTProc, hInst, 0)

Вид такой
ClassName || WindowText
#327700 || myMonitor
#327700 || myMonitor

HHOOK SysHook, CBTSysHook, WNDSysHook;
HINSTANCE hInst;

struct myStr
{
    CString cWind, cClass;
};
CList<myStr, myStr&> myWindList;
...

LRESULT CALLBACK CBTProc(

    int code,    // hook code
    WPARAM wParam,    // removal flag
    LPARAM lParam     // address of structure with message
   )
{        
    if (code < 0) return CallNextHookEx(CBTSysHook, code, wParam, lParam);    
    
    if(code == HCBT_ACTIVATE)
    {
        HWND hwnd = (HWND) wParam;            
        if (IsWindow(hwnd)==TRUE)
        {
            myStr str;                
            GetClassName( hwnd, myStr.cClass.GetBuffer(64), 64);
            GetWindowText( hwnd, myStr.cWind.GetBuffer(64), 64);            
            myWindList.AddTail(str);
        }
    }
    return 0;
}
...
void RunStopHook(BOOL State)
{            
    if (State == TRUE)
    {            
        //SysHook = SetWindowsHookEx(WH_SHELL, &ShellProc, hInst, 0);
        CBTSysHook = SetWindowsHookEx(WH_CBT, &CBTProc, hInst, 0);
        //WNDSysHook = SetWindowsHookEx(WH_CALLWNDPROCRET, &CallWndRetProc, hInst, 0);
    }
    else
    {        
        //UnhookWindowsHookEx(SysHook);
        UnhookWindowsHookEx(CBTSysHook);
        //UnhookWindowsHookEx(WNDSysHook);
            
                AfxDaoInit(); // preparing for DAO
                CDaoDatabase database;
                CDaoRecordset recordset(& database);
                // Open database and recordset
                database.Open("d:\\¦юш фюъєьхэЄv\\+рчv фрээvї\\hookBase.mdb");
                

                recordset.Open(AFX_DAO_USE_DEFAULT_TYPE,
                         "SELECT * FROM testHook", 0);                
            
                myStr str;
                POSITION pos = myWindList.GetHeadPosition();
                for (int i=0;i < myWindList.GetCount();i++)
                {                    
                    str = myWindList.GetNext(pos);
                    if ((strlen( str.cWind ) < 255) &&
                        (strlen( str.cClass ) < 255))
                    {
                        recordset.AddNew();                                
                        recordset.SetFieldValue("lpszName",  (LPCSTR) str.cWind.GetString());
                        recordset.SetFieldValue("lpszClass", (LPCSTR) str.cClass.GetString());
                        recordset.Update();                                        
                    }
                    else
                    {                        
                        CString strC, strD;
                        strC.AppendFormat("%i", strlen( str.cWind ));
                        strD.AppendFormat("%i", strlen( str.cClass));
                        recordset.AddNew();                                
                        recordset.SetFieldValue("lpszName",  (LPCSTR) strC.GetString());
                        recordset.SetFieldValue("lpszClass", (LPCSTR) strD.GetString());
                        recordset.Update();
                    }
                }                
                myWindList.RemoveAll();
                recordset.Close();
                database.Close();
                AfxDaoTerm();    
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

19.10.06 18:36: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.