SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
FSetLayeredWindowAttributes SetLayeredWindowAttributes ;
HINSTANCE hInst = LoadLibrary("User32.DLL");
SetLayeredWindowAttributes = (FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if (SetLayeredWindowAttributes)
{
SetLayeredWindowAttributes(GetSafeHwnd(),RGB(0,0,0),128,2);
}
FreeLibrary(hInst);
通过这种方式可以使得窗口背景透明,但同时会使得其子窗口也变得透明。我尝试过使用同样的方式让子窗口不透明也即
SetWindowLong(子窗口句柄,GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
FSetLayeredWindowAttributes SetLayeredWindowAttributes ;
HINSTANCE hInst = LoadLibrary("User32.DLL");
SetLayeredWindowAttributes = (FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if (SetLayeredWindowAttributes)
{
SetLayeredWindowAttributes(子窗口句柄,RGB(0,0,0),255,2);
}
FreeLibrary(hInst);
发现行不通
另外SetLayeredWindowAttributes 在 msdn 上虽然可以查到使用说明,但尝试包含声明的头文件并不能找到其声明。