win32 | 透明窗口實現&畫一個透明背景


主要參考:https://blog.csdn.net/bjbz_cxy/article/details/81119772

https://blog.csdn.net/zhuiyuanqingya/article/details/80844258
我的編譯環境是vc6,所以有的宏定義直接寫的數字。

透明窗口實現:

直接丟代碼:

#include <stdio.h>
#include <windows.h>

typedef BOOL (FAR WINAPI *LAYERFUNC)(HWND,COLORREF,BYTE,DWORD);

void main(){
	HMODULE hmod=LoadLibrary("user32.dll");

	// 先獲取窗口句柄
	//HWND hWnd = FindWindow(NULL, "Plants vs. Zombies");
	HWND hWnd = FindWindow(NULL, "掃雷");
	printf("窗口句柄:%x \n",hWnd);

	// 獲取窗口屬性
	LONG ret = GetWindowLong(hWnd, GWL_EXSTYLE);

	// 設置窗口屬性
	//ret = ret | WS_EX_LAYERED;
	ret = ret | 0x80000L;
	SetWindowLong(hWnd, GWL_EXSTYLE, ret);
	
	// 設置分層窗口屬性
	LAYERFUNC SetLayer;
	int alpha =50;
	SetLayer=(LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes");
	SetLayer(hWnd,0,(255*alpha)/100,0x2);
	FreeLibrary(hmod);

	printf("\n");
}


繪制窗口背景:

代碼(關鍵部分就是寫WM_PAINT的消息處理,這么說起來,是不是可以通過hook這部分實現對任意窗口背景的繪制呢?):

// 重繪的時候
	case WM_PAINT:
		PAINTSTRUCT ps;
		HDC hdc;
		HBITMAP hbmp;// 位圖繪制對象句柄,模糊圖像
		HDC mdc;
		hdc = BeginPaint(hwnd, &ps);
		mdc = CreateCompatibleDC(hdc); // 創建兼容的緩存DC對象
		//加載位圖
		hbmp = (HBITMAP)LoadImage(
			NULL, // 模塊實例句柄
			"C:\\Users\\thinkpad\\Desktop\\代碼相關\\c_test_free\\1.bmp", // 位圖路徑。注意雙斜杠,單斜杠表示轉義,此時文件會加載不成功!!!
			IMAGE_BITMAP, // 圖片類型
			600,
			300,
			LR_LOADFROMFILE // 從路徑處加載圖片
			);
		if (hbmp == NULL){
			char c[20] = {0};
			sprintf(c, "err: %d\n", GetLastError());
			MessageBox(0,c,0,0);
		}
		// 緩存DC(mdc)選擇位圖繪制對象(可以理解為將圖片保存到mdc中)
		SelectObject(mdc, hbmp);
		BitBlt(
			hdc, // 目的DC
			0,0,
			600, // 目的DC的 x,y 坐標
			300,
			mdc, // 緩存DC
			0, 0, // 緩存DC的x,y坐標
			SRCCOPY // 粘貼方式
			);
		DeleteObject(hbmp);
		DeleteDC(mdc);
		EndPaint(hwnd, &ps);
		break;

之后會嘗試通過hook來重畫窗口的背景顏色。
如果畫出來了可能再水一篇博文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM