⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 titletimer.cpp

📁 此为本书的配套光盘.本书不但由浅入深地讲解了软件保护技术
💻 CPP
字号:
/********************************************************************

	Copyright (c) Beijing Feitian Technologies
	http://www.FTSafe.com

	File :		TitleTimer.cpp	

	Created:	2003/11/04

	Author:		yihai
	
	Purpose:	?

	Revision:	?

*********************************************************************/
#include "stdafx.h"
#include <windows.h>

ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK EnumThreadWndProc(HWND hwnd,LPARAM lParam);

char	g_szAppTitle[256] = "TitleTimer";
char    g_szMsgErrThread[256] = "Create thread fail!";

static  HWND	g_hMainWnd=NULL;
static  char	szWindowClass[] = "ROCKEY_TIMER_WND";
static  DWORD	g_dwThreadID = 0;
static  HANDLE	g_hThread = NULL; 
const	DWORD	g_dwDefTimerID = 1;

//记时器ID
DWORD   g_dwTimerID = 1;
//记时器延时
DWORD   g_dwTimerDelay = 1000;

//主线程ID
DWORD	g_dwMainThreadID;
//主线程窗口句柄
HWND	g_hMainThreadWnd=NULL;

//壳所创建的后台线程
DWORD WINAPI SubThreadMainProc(LPVOID lpParameter)
{
	HINSTANCE hInst = (HINSTANCE )lpParameter;
	//等待主线程窗口的创建
	Sleep(2000);

	//在这个线程里创建一个隐藏的窗口
	if (!InitInstance (hInst, 0))
	{
		goto lbl_thread_end;
	}
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);	
	}
lbl_thread_end:
	ExitThread(0);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	g_dwMainThreadID = GetCurrentThreadId();

	//注册隐藏窗口的窗口类
	MyRegisterClass(hInstance);

	g_hThread = CreateThread(NULL,0,SubThreadMainProc,hInstance,0,&g_dwThreadID);
	if(g_hThread==NULL)
		MessageBox(NULL,g_szMsgErrThread,g_szAppTitle,MB_OK);
	return 0;	
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   
   hWnd = CreateWindow(szWindowClass, g_szAppTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   
   if (!hWnd)
   {
      return FALSE;
   }   
   g_hMainWnd = hWnd;
   ShowWindow(hWnd, SW_HIDE);   
   //UpdateWindow(hWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{	
	switch (message) 
	{
		case WM_CREATE:
			{
				g_dwTimerID = g_dwDefTimerID;
				//创建我们用来修改主程序标题栏的定时器
				SetTimer(hWnd,g_dwTimerID,g_dwTimerDelay,NULL);
			}
		break;
		case WM_TIMER:
			{		
				static bool	bEnum = false;

				if(wParam == g_dwTimerID)
				{					
					//在WIN98下可令后台线程的消息循环不会出现死锁
					//PostMessage(hWnd,WM_NULL,0,0);
					
					WORD	retcode=0;	
							
					if(!bEnum)
					{							
						//列举主线程的所有窗口,并找到主窗口
						EnumThreadWindows(g_dwMainThreadID,EnumThreadWndProc,NULL);	
						bEnum = true;
					}
					 //取得系统时间及标题栏原来的内容对其进行修改
					else if(g_hMainThreadWnd)
					{
						static bool bDot = true;
						char	szTitle[256];
						GetWindowText(g_hMainThreadWnd,szTitle,256);
						char* p = strrchr(szTitle,'!');
						if(p)
							*(p-1) = 0;	
						SYSTEMTIME	st;
						GetLocalTime(&st);
						bDot = !bDot;
						char chDot = bDot?':':' ';
						wsprintf(szTitle,"%s ! %02d%c%02d",szTitle,st.wHour,chDot,st.wMinute);
						SetWindowText(g_hMainThreadWnd,szTitle);
					}					
				}				
			}
			break;
		case WM_PAINT:
			{
				HDC hdc;
				PAINTSTRUCT ps;
				hdc = BeginPaint(hWnd, &ps);						
				EndPaint(hWnd, &ps);
			}			
			break;
		case WM_DESTROY:			
			{
				KillTimer(hWnd,g_dwTimerID);				
				PostQuitMessage(0);
			}
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCSTR)NULL;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_APPLICATION);

	return RegisterClassEx(&wcex);
}

BOOL CALLBACK EnumThreadWndProc(HWND hWnd,LPARAM lParam)
{
	if(hWnd)
	{
		if(GetParent(hWnd) == NULL)
		{
			g_hMainThreadWnd = hWnd;			
			return FALSE;
		}
	}	
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -