Главная страница
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.264 c
15-1139492255
Странник
2006-02-09 16:37
2006.03.05
Borland уходит из бизнеса IDE


2-1140345028
antoxa2005
2006-02-19 13:30
2006.03.05
Можно ли во время закачки файла по HTTP отслеживать "ход процесса


2-1140286213
Дубинка
2006-02-18 21:10
2006.03.05
Подключение по локальной сети


2-1140088376
Id
2006-02-16 14:12
2006.03.05
TIBBlobStream


2-1140189073
The Sound
2006-02-17 18:11
2006.03.05
Складование побайтно 2х чисел.