Страница: 1 | 2 | 3 | 4 |
|
Вопрос: Переопределение оконной процедуры
|
Добавлено: 27.11.05 20:38
|
|
Номер ответа: 17 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #17
|
Добавлено: 29.11.05 12:59
|
хук-пpоцедуpа должна находиться в DLL, котоpая будет пpомэппиpована в дpугой пpоцесс. Когда Windows мэппиpует DLL в дpугой пpоцесс, секция данных мэппиpоваться не будет. То есть, все пpоцессы pазделяют одну копию секции кода, но у них будет своя личная копия секции данных DLL! Это может стать большим сюpпpизом для непpедупpежденного человека. Вы можете подумать, что пpи сохpанении значения в пеpеменную в секции данных DLL, это значение получат все пpоцессы, загpузившие DLL в свое адpесное пpостpанство. Hа самом деле, это не так. В обычной ситуации, такое поведение пpавильно, потому что это создает иллюзию, что у каждого пpоцесса есть отдельная копия DLL. Hо не тогда, когда это касается хуков Windows. Hам нужно, чтобы DLL была идентична во всех пpоцессах, включая данные. Решение: вы должны пометить секцию данных как pазделяемую. Это можно сделать, указав аттpибуты секции линкеpу.
Уроки Iczelion'а. Урок 24.
Ответить
|
Номер ответа: 21 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #21
|
Добавлено: 29.11.05 22:38
|
QWORD (quad word) equ Double (8 Bytes)
DWORD (double word) equ Long or Single (4 Bytes)
WORD equ Integer (2 Bytes)
BYTE equ Byte (1 byte)
Свои width/height можешь задавать хоть в Integer, хоть в Byte, хоть в попугаях. Как больше нравится.
Что именно?
Всё Создаешь файл .asm, пишешь в него все инклюды, либы, пишешь свои процедуры, запускаешь в командной строке компилятор (ml.exe) c нужными параметрами, получаешь .obj, запускаешь в командной строке с нужными параматрами линкер Link.exe, и вот у тебя .dll.
Ну ты скачай да попробуй, потом будешь вопросы задавать
Ответить
|
Номер ответа: 25 Автор ответа: Sacred Phoenix
ICQ: 304238252
Вопросов: 52 Ответов: 927
|
Профиль | | #25
|
Добавлено: 30.11.05 22:14
|
2 All: почему не катит код:
Private Declare Function CallNextHookEx Lib "user32" ( ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" ( ByVal hHook As Long) As Long
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const WH_CALLWNDPROC As Long = 4
'Private Const LB_ADDSTRING As Long = &H180
'Private Type EVENTMSG
' wMsg As Long
' lParam As Long
' hParam As Long
' Time As Long
' hWnd As Long
'End Type
Private lngHHook As Long
Private lngHInst As Long
'Private lngHLB As Long
Option Explicit
Public Function DLLMain( ByVal A&, ByVal B&, ByVal C& As Long
lngHInst = A
  LLMain = 1
End Function
Public Sub Main()
'Dummy
End Sub
Public Function SetWindowsHookStatus( ByVal blnSet As Boolean, ByVal lngListBoxHandle& As Boolean
If blnSet Then
' lngHLB = lngListBoxHandle
lngHHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WindowsHookProc, lngHInst, 0)
SetWindowsHookStatus = lngHHook
ElseIf lngHHook Then
Call UnhookWindowsHookEx(lngHHook)
SetWindowsHookStatus = True
End If
End Function
Public Function WindowsHookProc( ByVal nCode&, ByVal wParam&, ByVal lParam& As Long
If nCode < 0 Then
WindowsHookProc = CallNextHookEx(lngHHook, nCode, wParam, ByVal lParam)
Else
'Dim lpMSG As EVENTMSG
' Call CopyMemory(lpMSG, lParam, Len(lpMSG))
' Call SendMessage(lngHLB, LB_ADDSTRING, 0, ByVal Format(Now, "dd.MM.yy hh:mm:ss" & " - Handle = " & lpMSG.hWnd & "; Message = " & lpMSG.wMsg)
WindowsHookProc = CallNextHookEx(lngHHook, nCode, wParam, ByVal lParam)
End If
End Function
Explorer и все программы вылетают, проорав пару мессагов что-то о памяти. Если это не работает, то о часиках и говорить рано...
Ответить
|
Номер ответа: 27 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #27
|
Добавлено: 01.12.05 01:17
|
Слушай, а с чего это ты взял, что если вернуть из CallWndProc координаты, то часы изменят свой размер? Это с какого перепугу вдруг?
Тебе нужны 2 dll: одна, которая обсуждается до сих пор, она будет типа трамплина для подгрузки в процесс explorer'а второй dll, в которой описывается новая WndProc. То есть первая нужна для попадания внутрь эксплорера через механизм хука, и попав туда, она должна подтянуть за собой вторую dll, которая собственно и будет менять размер.
Возможно, обе их можно совместить, надо пробовать.
Ответить
|
Номер ответа: 28 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #28
|
Добавлено: 01.12.05 01:48
|
Да, сейчас попробовал, можно делать в одной dll, только нельзя завершать хук, т.е. вызывать функцию UninstallHook, а то при этом dll выгружается из пространства эксплорера и он теряет свою новую оконную процедуру (она ведь в выгружаемой dll) и грохается.
Так что сейчас у меня часы шириной в полэкрана ))
Короче такой вот код получается:
;=====новая оконная процедура=============================
NewProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
mov eax, uMsg
.if eax==WM_USER+100
mov eax,100
shl eax,16
add eax,600 ;это новая ширина
ret
.endif
invoke CallWindowProc, oldProc, hWin, uMsg, wParam, lParam
ret
NewProc endp
;======= тут ловим какое-нибудь сообщение и меняем процедуру WndProc ====
WProc proc uses ebx nCode:DWORD,wParam:DWORD,lParam:DWORD
cmp nCode,0
jl @F
mov ebx,lParam
assume ebx: ptr CWPSTRUCT
mov eax,[ebx].hwnd
cmp eax,hTarget
jne @F
cmp oldProc,0
jne @F
invoke SetWindowLong, hTarget, GWL_WNDPROC, addr NewProc
mov oldProc,eax
@@:
assume ebx: nothing
invoke CallNextHookEx,hHook,nCode,wParam,lParam
xor eax,eax
ret
WProc endp
;=============================================================================
InstallHook proc hwnd:DWORD,hwndFrom:DWORD
push hwnd
pop hWnd
push hwndFrom
pop hWndFrom
invoke FindWindow, SADD("Shell_TrayWnd" , NULL
invoke FindWindowEx, eax, NULL, SADD("TrayNotifyWnd" , NULL
invoke FindWindowEx, eax, NULL, SADD("TrayClockWClass" , NULL
mov hTarget,eax
invoke SetWindowsHookEx,WH_CALLWNDPROC,addr WProc,hInstance,NULL
mov hHook,eax
ret
InstallHook endp
;============================================================================
Ответить
|
Номер ответа: 29 Автор ответа: Sacred Phoenix
ICQ: 304238252
Вопросов: 52 Ответов: 927
|
Профиль | | #29
|
Добавлено: 02.12.05 21:15
|
2 HOOLIGAN:
1) на комменты не обращай внимания, я убрал часть кода, чтоб "облегчить" алгоритм. А вообще, Handle хука DLL возвращает, imho, дело в WindowsHookProc.
2)Слушай, а с чего это ты взял, что если вернуть из CallWndProc координаты, то часы изменят свой размер? Это с какого перепугу вдруг? Статьи, статьи и еще раз статьи...
Afaik, таскбар посылает часам мессагу WM_USER + 100 и получает в ответ инфу о ширине/высоте, соответственно расширяясь.
3) 2 DLL не нужны, т.к. Chameleon Clock и Tray Skins Clock (которая написана наподобие первой проги) юзают 1 DLL.
4) Так все равно скажи, чего мой код не катит! Если очень нужно, пойму )
Ответить
|
Номер ответа: 30 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #30
|
Добавлено: 02.12.05 23:24
|
Во-первых, таскбар ничего никому не посылает.
Сообщения посылает windows. В данном случае в оконную процедуру процесса explorer.
Во-вторых, когда винда посылает в оконную процедуру сообщения, из неё (из оконной процедуры) должны вернуться определенные данные, которые говорят о том, было ли обработано сообщение, или нет, если было то каким образом.
В-третьих, ты оконную процедуру не менял, и возвращаемые из неё значения тоже. Ты всего лишь пытаешься из процедуры хука пронаблюдать, какие сообщения проследовали через неё в оконную процедуру. Не более того. То, что ты возвращаешь из процедуры хука, никаким боком на значение, возвращаемое из оконной процудуры, не влияет. Максимум, что ты можешь сделать из процедуры хука - это заблокировать прохождение в оконную процедуру каких-то сообщений. Не более того.
В-четвёртых, одна или две dll - непринципиально. Я тебе привел пример с одной dll (может ты не заметил?)
В-пятых. Чтобы сказать, почему твой код не работает, я должен его повторить, имея ту примочку, которой ты пользовался. Но качать ту примочку и ставить к себе никакого желания нет, так как есть нормальный инструмент, предназначенный для таких вещей, даже два (vc++ и asm). Твой код практически ничего криминального не делает, чтобы explorer грохался. Раз он грохается, то наиболее вероятная причина, на мой взгляд - кривая dll (ёе структура).
В-шестых, я тебе уже выдал количество кода, достаточное для изменения размера часов. Чего ты пытаешься левой ногой почесать правое ухо - мне непонятно Правое ухо удобнее всего чесать правой рукой. А что у нас правая рука? Правильно, ассемблер. Можно также почесать и левой рукой, тоже достаточно удобно (левая рука у нас си). Если ты хочешь и дальше мазохировать, то я тебе не помощник
Ответить
|
Страница: 1 | 2 | 3 | 4 |
Поиск по форуму