我正在编写一个简单的程序,它在屏幕上打印一些文本,覆盖其他窗口。
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HWND hwnd = GetDesktopWindow();
HDC hdc;
RECT rect;
//LPRECT rect = new RECT;
wchar_t text[] = L"test";
GetClientRect(hwnd, &rect);
do{
hdc = GetWindowDC(hwnd);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(100, 100, 100));
DrawText(hdc, text, -1, &rect, DT_NOCLIP);
ReleaseDC(hwnd, hdc);
Sleep(15);
} while (1);
return 0;
}
问题在于我希望打印文本的背景是透明的,但SetBkMode似乎不起作用(如果我将它设置为OPAQUE或TRANSPARENT,它实际上没有区别)所以我得到了坚实的背景。有任何想法吗?我错过了什么?
编辑:按照建议将LPRECT更改为RECT。
编辑:使用透明窗口:
创建窗口:
CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED, // extended style
(LPCWSTR)WINDOW_CLASS_NAME, // class
L"test", // title
NULL,
0, 0, // initial x,y
400, 300, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL)
全局:
wchar_t tst_Str[] = L"TEST";
WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
RECT rc;
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetTextColor(hdc, RGB(255, 0, 0));
DrawText(hdc, tst_Str, -1, &rc,NULL);
EndPaint(hwnd, &ps);
return 0;
答案 0 :(得分:0)
Windows负责自己绘画。系统的设计不允许外部各方以您尝试的方式在其他窗口上绘图。您将不得不重新调整您的期望。
如果你想画一些东西,你应该创建一个窗口并在上面画画。您可以自由地将窗口设置为透明的分层窗口并定位绘图,使其显示在另一个窗口的顶部。而且您还可以获得不需要运行繁忙循环的好处。您可以使用标准方式绘制,以响应WM_PAINT
消息。
答案 1 :(得分:0)
要在桌面上显示分层窗口,您必须调用SetLayeredWindowAttributes函数,例如
SetLayeredWindowAttributes(hWnd,
RGB(255, 255, 255), // The transparent color
128, // Opacity of the window
LWA_ALPHA | LWA_COLORKEY); // Enable both features
此示例将使白色窗口的部分完全透明。参数bAlpha
指定窗口的不透明度(不受crKey
影响的像素)。
这是一个这样的窗口的屏幕截图,其中 Test 文本浮动在浏览器窗口上,并带有以下问题:
如果你创建没有边框的窗口,使用这些窗口样式:WS_POPUP | WS_SYSMENU
,那么它将在屏幕截图中显示。我在WS_SYSMENU
中添加了标准窗口菜单。要强制任务栏显示弹出窗口的按钮,请包含WS_EX_APPWINDOW
扩展样式。