· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Сабкласинг

Посл.отвђт Сообщенiе


Дата: Сен 23, 2004 21:15:22

Есть код, который заменяет процедуру кнопки "Пуск" на мою собственную. Так вот, он прекрасно работает в Win2k, WinXP, но под Win98 никак. Что он делает:
1)Вешается хук WH_CALLWNDPROCRET
2)В этом хуке идет проверка, сработал ли хук на кнопке "Пуск"
3)Через SetWindowLong меняется процедура. Но под Win98 мне SetWindowLong возвращает 0 и говорит, что неверный параметр. В чем грабли и почему под XP и 2k всё работает?


Дата: Сен 24, 2004 04:12:27

__Ranger
Код покажешь или будем ждать телепатов?


Дата: Сен 24, 2004 05:01:12 · Поправил: __Ranger

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



Дата: Сен 24, 2004 05:55:30 · Поправил: q_q

__Ranger
В рамках какого процесса выполняется этот код?
Imho наивно надеяться, что в системе не ходят сообщения WM_NULL, т.е. где в shell_proc проверка, что (CWPRETSTRUCT ptr [edx]).hwnd равен дескриптору окна кнопки "Пуск"?
Почему так сложно, разве не достаточно, получив дескриптор окна кнопки "Пуск" применить к нему SetWindowLong (разумеется, сначала надо попасть в адресное пространство ее процесса)?


Дата: Сен 24, 2004 07:42:37

У меня написана програмка, которая ловит все сообщ. через хук и записывает мышиные и клавишные (не через journal). Так вот все работает но на копке Пуск и меню этом- нет! (Win98). В чем дело, не знаю.


Дата: Сен 26, 2004 15:06:45 · Поправил: __Ranger

WM_NULL не ходит, но в любом случае, поменять на какое-то своё сообщение ничего не стоит, проблема в другом. А хук именно для того, чтобы попасть в адресное пространство ее процесса, иначе, естественно, никто ничего мне менять не даст. Set_startmenu выполняется в моём процессе.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083