Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Прозрачность формы   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.043 c
2-1138816063
Дмитрий_177
2006-02-01 20:47
2006.03.05
Компоненты на api (или еще как-нибудь)


3-1137207954
psyBNC
2006-01-14 06:05
2006.03.05
ПРОБЛЕМА С БАЗОЙ ДАННЫХ


15-1139681490
PARUS
2006-02-11 21:11
2006.03.05
Телефонный вопрос.


2-1139663837
Glex
2006-02-11 16:17
2006.03.05
Как поймать мышиное сообщение и передать его контролу?


2-1139733653
Galiaf
2006-02-12 11:40
2006.03.05
Как грамотно округлить вещественное число до, например, тысячной?