📄 titletimer.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 + -