Есть код, который заменяет процедуру кнопки "Пуск" на мою собственную. Так вот, он прекрасно работает в Win2k, WinXP, но под Win98 никак. Что он делает: 1)Вешается хук WH_CALLWNDPROCRET 2)В этом хуке идет проверка, сработал ли хук на кнопке "Пуск" 3)Через SetWindowLong меняется процедура. Но под Win98 мне SetWindowLong возвращает 0 и говорит, что неверный параметр. В чем грабли и почему под XP и 2k всё работает?
Код (Text): set_startmenu proc uses ebx xor eax,eax invoke FindWindowEx,eax,eax,offset tray_name,eax invoke GetDlgItem,eax,304 test eax,eax jz no_menu mov ebx,eax invoke SetWindowsHookEx,WH_CALLWNDPROCRET,offset shell_proc,hInstance,0 mov btn_hook,eax invoke SendMessage,ebx,WM_NULL,0,0 invoke Sleep,50;чтоб наверняка invoke SendMessage,ebx,WM_NULL,0,0 invoke UnhookWindowsHookEx,btn_hook and btn_hook,0 no_menu: ret set_startmenu endp shell_proc proc nCode:DWORD,wParam:DWORD,lParam:DWORD mov eax,nCode .if eax<0 invoke CallNextHookEx,btn_hook,nCode,wParam,lParam ret .else mov edx,lParam assume edx:ptr CWPRETSTRUCT mov eax,[edx].message mov eсx,[edx].hwnd .if ((start_dll==0)&&(eax==WM_NULL)) invoke set_startmenu_proc,eсx .endif assume edx:NOTHING .endif xor eax,eax fin: ret shell_proc endp set_startmenu_proc proc uses edi hWin:DWORD mov edi,hWin mov start_btn,edi invoke GetWindowRect,edi,addr startmenu_x invoke GetClassLong,edi,GCL_WNDPROC mov default_proc,eax invoke SetWindowLong,edi,GWL_WNDPROC,offset start_btn_proc ;вот здесь 0 приходит под 98 mov old_start,eax m2m start_dll,hInstance ret set_startmenu_proc endp
__Ranger В рамках какого процесса выполняется этот код? Imho наивно надеяться, что в системе не ходят сообщения WM_NULL, т.е. где в shell_proc проверка, что (CWPRETSTRUCT ptr [edx]).hwnd равен дескриптору окна кнопки "Пуск"? Почему так сложно, разве не достаточно, получив дескриптор окна кнопки "Пуск" применить к нему SetWindowLong (разумеется, сначала надо попасть в адресное пространство ее процесса)?
У меня написана програмка, которая ловит все сообщ. через хук и записывает мышиные и клавишные (не через journal). Так вот все работает но на копке Пуск и меню этом- нет! (Win98). В чем дело, не знаю.
WM_NULL не ходит, но в любом случае, поменять на какое-то своё сообщение ничего не стоит, проблема в другом. А хук именно для того, чтобы попасть в адресное пространство ее процесса, иначе, естественно, никто ничего мне менять не даст. Set_startmenu выполняется в моём процессе.