使用DX9怎样才能实现全屏透明窗口的游戏?游戏执行后不影响windows其它程序的使用。

visualvisual 2012-02-07 09:58:49
程序运行后就类似一个全屏屏保一样(比如:多彩气泡屏保),但是在运行这个全屏程序的同时,还要不影响用户使用其它软件。比如用户正在运行多彩气泡屏保,同时又在使用office编辑文档(编辑文档时,多彩气泡不会关闭)。


效果就像前几年的“圣诞小礼物下雪机”一样。
...全文
577 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
visualvisual 2012-02-11
  • 打赏
  • 举报
回复
错了不是“直接拷屏”是“直接写屏”
visualvisual 2012-02-11
  • 打赏
  • 举报
回复
这个方法确实可以使窗口透明,但是只有透明的部分才不相应本窗口的消息直接执行桌面其它程序。我想实现的是:即便是窗口完全不透明也能使操作系统不理会当前窗口的消息,而执行桌面其它程序。

其实我的目的是改变整个屏幕的颜色,我在网上看见使用汇编可以通过直接拷屏的方式好像可以实现。就是不知道这种方法是直接更改整个桌面的颜色,还是只针对某一个指定的窗口?效率怎么样?本人不懂汇编,如果可以改变全屏颜色,效率还可以,就开始学汇编。请大家给点建议,谢谢!
weiwuyuan 2012-02-09
  • 打赏
  • 举报
回复
补充一下:
我发现使用SetLayeredWindowAttributes有个漏洞,就是指定了一个colorkey后,程序如果要渲染这种颜色,将会被当成透明色过滤掉,这就大有影响了。

等高手解答。.
weiwuyuan 2012-02-09
  • 打赏
  • 举报
回复
楼上的代码是使整个窗口半透明,这样的话,程序渲染任何东西都将会半透明的,
正确的应该是这样:

hWnd = CreateWindowEx(WS_EX_LAYERED, ...);
::SetLayeredWindowAttributes(hWnd, 0xFFFFFF, 0, LWA_COLORKEY); // LWA_COLORKEY使指定关键色半透明


就这两步就可以了,很简单。


顺便把我的测试代码发一下,其中做了文字渲染测试.效果是除了标题栏和渲染的文字外,其他都是透明的,而且鼠标点上去,不会点到窗口自身。

#include <windows.h>
#include <tchar.h>

#define WND_WIDTH 1024
#define WND_HEIGHT 768

#define WND_CLASSNAME _T("MainWnd")
#define WND_TITLENAME _T("Test")

void MainLoop();
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HWND g_hWnd = NULL;



//------------------------------------------------------
// 程序入口
//------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int nCmdShow)
{
HWND hWnd = NULL;
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = WND_CLASSNAME;

if (!RegisterClass(&wc))
return 0;

DWORD wndStyle = WS_OVERLAPPEDWINDOW & (~WS_MAXIMIZEBOX) & (~WS_SIZEBOX); // 无标题栏:WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU;
RECT rcWnd = { 0, 0, WND_WIDTH, WND_HEIGHT };
AdjustWindowRect(&rcWnd, wndStyle, FALSE);

hWnd = CreateWindowEx(WS_EX_LAYERED,
WND_CLASSNAME,
WND_TITLENAME,
wndStyle,
(GetSystemMetrics(SM_CXSCREEN)-WND_WIDTH)/2, // SM_CXSCREEN:以像素为单位的屏幕的宽度
(GetSystemMetrics(SM_CYSCREEN)-WND_HEIGHT)/2, // SM_CYSCREEN:以像素为单位的屏幕的高度
(rcWnd.right-rcWnd.left), (rcWnd.bottom-rcWnd.top),
NULL,
NULL,
hInstance,
NULL);

// ::SetLayeredWindowAttributes(hWnd, 0, 100, LWA_ALPHA); // LWA_ALPHA使整个窗口半透明
::SetLayeredWindowAttributes(hWnd, 0xFFFFFF, 0, LWA_COLORKEY); // LWA_COLORKEY使指定关键色半透明

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

g_hWnd = hWnd;

MSG msg;
ZeroMemory(&msg, sizeof(msg));

while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;

TranslateMessage(&msg);
DispatchMessage(&msg);
}

MainLoop();
}

UnregisterClass(WND_CLASSNAME, hInstance);
return 0;
}

void MainLoop()
{
HDC hdc = GetDC(g_hWnd);

SetTextColor(hdc, RGB(0, 0,0));
SetBkMode(hdc, TRANSPARENT);

char szText[256] = "布武天下,唯魂致精!abcdg";
TextOutA(hdc, 200, 300, szText, strlen(szText));

ReleaseDC(g_hWnd, hdc);
}

LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
SuperLy 2012-02-08
  • 打赏
  • 举报
回复
再指定透明度:

::SetLayeredWindowAttributes(GetSafeHwnd(), 0, AlfValue, LWA_ALPHA);
SuperLy 2012-02-08
  • 打赏
  • 举报
回复
这个其实和D3D本身关系不大,是需要设置窗体的扩展属性:

//鼠标点击穿透开关
void CPicDlg::OnBnClickedCheck1()
{
// TODO: 在此添加控件通知处理程序代码
DWORD Style,
ExStyle = ::GetWindowLong(pPicShowDlg->GetSafeHwnd(), GWL_EXSTYLE);
if (ExStyle&WS_EX_TRANSPARENT)
{
Style = /*WS_SIZEBOX|*/WS_POPUP|WS_SYSMENU;
ExStyle &= ~WS_EX_TRANSPARENT;
}
else
{
Style = WS_POPUP|WS_SYSMENU;
ExStyle |= WS_EX_TRANSPARENT;
}
::SetWindowLong(pPicShowDlg->GetSafeHwnd(), GWL_STYLE, Style);
::SetWindowLong(pPicShowDlg->GetSafeHwnd(), GWL_EXSTYLE, ExStyle);
::PostMessage(pPicShowDlg->GetSafeHwnd(), WM_SYSCOMMAND, SC_MINIMIZE, 0);
::PostMessage(pPicShowDlg->GetSafeHwnd(), WM_SYSCOMMAND, SC_RESTORE, 0);
}

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧