![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность формы [D1, D2, D3, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
iNBox © (2005-12-15 19:32:00)Нашёл у себя исходник на асме при помощи которого можно делать формы программ написанных на WinAPI прозрачными вот тот код на масме:
.data
LMA_ALPHA equ 2
WS_EX_LAYERED equ 80000h
Value dd 0
pSLWA dd ?
User32 db "User32.dll",0
SLWA db "SetLayeredWindowAttributes",0
.code
Transparency proc hWnd:DWORD
invoke GetWindowLongA,hWnd,GWL_EXSTYLE
or eax,WS_EX_LAYERED
invoke SetWindowLongA,hWnd,GWL_EXSTYLE,eax
invoke GetModuleHandleA,ADDR User32
invoke GetProcAddress,eax,ADDR SLWA
mov pSLWA,eax
push LMA_ALPHA
push 225
push 0
push hWnd
call pSLWA
ret
Transparency endp
Попытался переписать этот код на Delphi но он не работает а окно вместо того что бы стать прозрачным просто не отображается,вот переписанный на Delphi код:
const
LMA_ALPHA = 2;
WS_EX_LAYERED = $80000;
Value = 0;
User32 = 'User32.dll';
SLWA = 'SetLayeredWindowAttributes';
var
pSLWA : dword;
procedure Trans(WinHwnd:DWORD);
var
e_x:dword;
begin
GetWindowLongA(WinHwnd,GWL_EXSTYLE or WS_EX_LAYERED);
SetWindowLongA(WinHwnd,GWL_EXSTYLE,0);
GetModuleHandleA(pchar(User32));
GetProcAddress(0,pchar(SLWA));
asm
mov pSLWA,eax
push LMA_ALPHA
push 250
push 0
push hWnd
call pSLWA
ret
end;
end;
Уважаемые мастера помогите разобраться в чём ошибка.
iNBox (2005-12-15 22:09:00) [1]я переписал процедуру прозрачности:
procedure Trans(WinHwnd:DWORD);
begin
SetWindowLongA(WinHwnd, GWL_EXSTYLE, GetWindowLongA(WinHwnd, GWL_EXSTYLE) or WS_EX_LAYERED);
pSLWA := DWORD(GetProcAddress(GetModuleHandleA(User32), SLWA));
asm
mov pSLWA,eax
push LMA_ALPHA
push 225
push 0
push hWnd
call pSLWA
end;
end;
Теперь приложение при использование данной процеду работает но окно программы стало невидимым
begin...end (2005-12-15 19:45:00) [2]> invoke GetWindowLongA,hWnd,GWL_EXSTYLE
> or eax,WS_EX_LAYERED
> invoke SetWindowLongA,hWnd,GWL_EXSTYLE,eax
> invoke GetModuleHandleA,ADDR User32
> invoke GetProcAddress,eax,ADDR SLWA
SetWindowLongA(hWnd, GWL_EXSTYLE, GetWindowLongA(hWnd, GWL_EXSTYLE) or WS_EX_LAYERED);
pSLWA := DWORD(GetProcAddress(GetModuleHandleA(User32), SLWA))
И ещё: ret в конце дельфишной ассемблерной вставки, по-моему, не нужен в данном случае. Да и непонятно, зачем эта вставка нужна -- ИМХО, проще объявить pSLWA как переменную нужного процедурного (stdcall) типа.