Форум: "WinAPI";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
ВнизПрозрачность формы Найти похожие ветки
← →
iNBox (2005-12-15 19:32) [0]Нашёл у себя исходник на асме при помощи которого можно делать формы программ написанных на 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;
Уважаемые мастера помогите разобраться в чём ошибка.
← →
begin...end © (2005-12-15 19:45) [1]> 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) типа.
← →
iNBox (2005-12-15 22:09) [2]я переписал процедуру прозрачности:
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;
Теперь приложение при использование данной процеду работает но окно программы стало невидимым
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c