怎么使桌面文字透明? (200分)

用注册表可以很简单的实现<br>不过好你是按F5剧新的话就——
 
在注册表修改中是不可能的,优化大师也做不到,他是在重启后又运行了一遍透明程序,要不然上面的Lamb(优化大师作者)怎么会问这个问题呢?<br>我觉得用timer每隔几毫秒就发送一个sendmessage检测的方法是不是有点浪费资源?我发现有人在VC中用DLL实现,效果比TIMER好多了,他告诉我说用全局钩子函数,只能放在DLL文件中,里面有两个导出函数:TransDesktop和UntransDesktop,由做DLL与应用程序的接口,我也不懂VC,干脆把部分源码给大家看看,希望懂VC的能用delphi写出桌面文字透明的DLL来。<br><br>// TransDLL.cpp : Defines the entry point for the DLL application.<br>//<br><br>#include "stdafx.h"<br>#include "ExportFuncs.h"<br><br>//******* 定义共享数据区******<br>//*** 因为钩子函数所在的DLL将被放到其它进程中,因此只有定义在共享<br>// &nbsp;数据区中的全局变量才能被保持一个实例,否则一般的全局变量将在每<br>// &nbsp;个进程中有一个独立的实例.<br>// &nbsp;共享数据区要接回.def文件使用!<br>//************<br><br>#pragma data_seg ("ShareData") &nbsp;//共享数据段(段内定义的数据必须在定义时初始化)<br>//........<br>HINSTANCE g_hInst=NULL; //DLL的实例句柄<br>HWND g_hDesktop=NULL; //桌面窗口的句柄<br>HHOOK g_hHook=NULL; //构子的句柄<br>COLORREF g_crTextColor=RGB(0,255,0); //桌面文字的颜色<br>//........<br>#pragma data_seg ()<br><br>BOOL APIENTRY DllMain( HANDLE hModule, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp;dwReason, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPVOID lpReserved)<br>{<br> if (dwReason==DLL_PROCESS_ATTACH)<br> {<br> if (g_hInst==0)<br> {<br> //保存DLL的实例句柄<br> g_hInst=(HINSTANCE)hModule;<br> }<br> }<br> return TRUE;<br>}<br><br>//消息处理钩子函数(WM_CALLWNDPROC类型)<br>//****************<br>LRESULT CALLBACK GetMessageHook(int nCode,WPARAM wParam,LPARAM lParam)<br>{<br> CWPSTRUCT *pMsg=(CWPSTRUCT*)lParam; //WH_CALLWNDPROC<br><br> if (pMsg-&gt;hwnd==g_hDesktop) &nbsp;//是桌面窗口的消息吗?<br> {<br> //下面判断桌面窗口是否已经变为不透明了<br> //***************<br> if (ListView_GetTextBkColor(g_hDesktop)!=CLR_NONE||<br> ListView_GetTextColor(g_hDesktop)!=g_crTextColor)<br> {<br> ListView_SetTextBkColor(g_hDesktop,CLR_NONE);<br> ListView_SetTextColor(g_hDesktop,g_crTextColor);<br> InvalidateRect(g_hDesktop,NULL,TRUE);<br> }<br><br> }<br><br> return CallNextHookEx(g_hHook,nCode,wParam,lParam);<br>}<br><br>//设置钩子函数<br>void TransDesktop(HWND hDesk,COLORREF crDeskText,int nShadowDist)<br>{<br> if (!::IsWindow(hDesk))<br> return;<br><br> g_hDesktop=hDesk;<br> g_crTextColor=crDeskText;<br><br> if (g_hHook!=NULL)<br> return; //若已经挂接了钩子则立即返回<br><br> //*** 没有挂接钩子,则设置钩子函数 ***<br> g_hHook=SetWindowsHookEx(WH_CALLWNDPROC,&amp;GetMessageHook,g_hInst,0);<br>}<br><br>//取消钩子函数<br>void UntransDesktop()<br>{<br> if (g_hHook!=NULL)<br> {<br> //***** 取消钩子函数 ****<br> UnhookWindowsHookEx(g_hHook);<br> g_hHook=NULL;<br> } <br>}<br><br><br>// 这是ExportFuncs.h文件<br>#ifndef _EXPORTFUNCS_H<br>#define _EXPORTFUNCS_H<br><br>void UntransDesktop();<br>void TransDesktop(HWND hDesk,COLORREF crDeskText,int nShadowDist);<br><br>//常量说明<br>const STYLE_OUTER=4000;<br>const STYLE_INNER=4001;<br>const STYLE_NORMAL=0;<br><br>#endif<br><br>//这是TransDll.def文件<br>LIBRARY "TransDLL"<br>DESCRIPTION "DLL file for Transparentive the Desktop"<br>SECTIONS<br> ShareData READ WRITE SHARED <br>EXPORTS<br> TransDesktop<br> UntransDesktop<br>
 
顶部