指定したウィンドウのハンドルを取得して透過処理を行いたいのですが
var
hw: HWND;
begin
hw := FindWindow(nil,'無題 - メモ帳');
//**********
//ここに透過処理
//**********
end;
透過処理のやり方がいまいちわかりません
そもそも透過APIのようなものは存在するのでしょうか?
検索すればサンプルは出てくると思いますが。
ttp://homepage1.nifty.com/MADIA/delphi/Win32API/Toumei.htm
透過処理=半透明化でしょうか。
SetLayeredWindowAttributesというAPIでできます。対応OSは2000以降だと思います。
var
memoWnd: HWND;
Style: Integer;
begin
memoWnd := FindWindow(nil,'無題 - メモ帳');
Memo1.Lines.Add(IntToHex(memoWnd, 8));
Style := GetWindowLong(memoWnd, GWL_EXSTYLE);
Style := Style or WS_EX_LAYERED;
SetWindowLong(memoWnd, GWL_EXSTYLE, Style);
SetLayeredWindowAttributes(memoWnd, 0, 128, LWA_ALPHA);
end;
http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=0289.txt
の中の Handle を 上記 hw に置き換えればいいと思いますが・・・。
簡潔にまとめてみました。
type
TSetLayeredWindowAttributes = function(hWnd : HWND; crKey : DWORD; bAlpha : Byte; dwFlags : DWORD) : BOOL; stdcall;
function SetLayeredWindowAttributes(hWindow: HWND; crKey: DWORD; bAlpha: Byte; dwFlags: DWORD): BOOL; stdcall; external user32 name 'SetLayeredWindowAttributes';
procedure TForm1.Button1Click(Sender: TObject);
var
SLWA: TSetLayeredWindowAttributes;
hUser32: HINST;
H: HWnd;
ibAlpha: Byte;
const
WS_EX_LAYERED = $80000;
begin
ibAlpha := random(256); //透明度
H := FindWindow(nil,'無題 - メモ帳');
if H <> 0 then begin
hUser32 := LoadLibrary('user32.dll');
if hUser32 <> 0 then begin
SetWindowLong(H, GWL_EXSTYLE, GetWindowLong(H, GWL_EXSTYLE) or WS_EX_LAYERED);
try
SLWA := GetProcAddress(hUser32, 'SetLayeredWindowAttributes');
if Assigned(@SetLayeredWindowAttributes) then SLWA(H, 0, ibAlpha, 2);
finally
FreeLibrary(hUser32);
end;
end;
end;
end;
?さん、にしのさん、Manbonさんが教えてくれた事で実現できました
ありがとうございました
ツイート | ![]() |