Как перехватить Win API
Задача простая. Нужно выдрать SysTray (точнее перехватывать функции добавления на него) в отсутствии Explorera (его просто напросто выгрузили)
при добавлении иконки в tray окну с классом TrayNotifyWnd приходит какое-то сообщение... точно не помню какое. Пример написания своего shell'а можно посмотреть в исходниках LiteStep (есть такой explorer заменитель - свободно распостраняемый и с исходниками)
при добавлении иконки в tray окну с классом TrayNotifyWnd приходит какое-то сообщение... точно не помню какое. Пример написания своего shell'а можно посмотреть в исходниках LiteStep (есть такой explorer заменитель - свободно распостраняемый и с исходниками)
А как насчет SetWindowsHookExA(..., ..., ..., ...):???:
А как насчет SetWindowsHookExA(..., ..., ..., ...):???:
нет, с помощью SetWindowsHookEx можно перехватыватить создание/удаление/активирование окон. С треем она не работает
нет, с помощью SetWindowsHookEx можно перехватыватить создание/удаление/активирование окон. С треем она не работает
А как же тогда люди софт пишут? LiteStep я скачал, поставил но исходников конечно-же не обнаружил!
А как же тогда люди софт пишут? LiteStep я скачал, поставил но исходников конечно-же не обнаружил!
http://am-productions.biz/downloads.php
Смотри там утилиту TrayModule - она вместе с исходниками. Работает в том случае, если текущий шелл сам не работает с треем. Так что перед испытаниями воспользуйся каким-нибудь другим шеллом без трея, например RunModule с того же сайта.
А как же тогда люди софт пишут? LiteStep я скачал, поставил но исходников конечно-же не обнаружил!
А ApySpy тебе не поможет?
http://am-productions.biz/downloads.php
Смотри там утилиту TrayModule - она вместе с исходниками. Работает в том случае, если текущий шелл сам не работает с треем. Так что перед испытаниями воспользуйся каким-нибудь другим шеллом без трея, например RunModule с того же сайта.
Спасибо за линк! Очень интересные проекты... но вот только я не понял, подменять вызов API своей функцией это единственный способ? Если посмотреть кусок кода который есть в исходниках можно заметить подмену класса "Shell_TrayWnd" и "TrayNotifyWnd"!!! (Кстати под XP работает вместе с Explorerom правда немного криво)
{
// unregister the classes
HINSTANCE hInstance = GetModuleHandle(NULL);
UnregisterClass(TEXT("Shell_TrayWnd"),hInstance);
UnregisterClass(TEXT("TrayNotifyWnd"),hInstance);
...........cut...........
// создали класс...
CShellTrayWnd::CShellTrayWnd()
{
m_pmwTrayNotifyWnd = NULL;
CTrayData tdData;
tdData.SetFile(TEXT("TrayModule.ini"));
m_nSnapPixels = tdData.GetSnapPixels();
// get the desktop rectangle for snappyness
GetWindowRect(GetDesktopWindow(),&m_rDesktopRect);
m_bActive = false;
m_nMoveSpace = 0;
}
...........cut............
// вижу создание методов класса
LRESULT CShellTrayWnd::WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{// begin WndProc
switch(nMessage)
{// begin nMessage switch
case WM_NCACTIVATE:
OnNcActivate(wParam);
break;
case WM_SETTEXT:
case WM_NCPAINT:
OnNcActivate(m_bActive);
break;
/* case WM_SETFOCUS:
m_bActive = true;
OnFocus();
break;
case WM_KILLFOCUS:
m_bActive = false;
OnFocus();
break;*/
case WM_COPYDATA:
return OnCopyData(wParam,lParam);
case WM_DISPLAYCHANGE:
OnDisplayChange(lParam);
break;
case WM_WINDOWPOSCHANGING:
OnWindowPosChanging(lParam);
break;
case WM_LBUTTONDOWN:
OnLButtonDown(wParam,lParam);
break;
case WM_CONTEXTMENU:
OnContextMenu(wParam,lParam);
break;
case WM_PAINT:
OnPaint();
break;
case WM_DESTROY:
OnDestroy();
break;
}// end nMessage swtich
return CMyWindow::WndProc(hWnd, nMessage, wParam, lParam);
}// end WndProc