📄 lumosmain.cpp
字号:
#include <windows.h>
#include "HtcStuff.h"
#include "HwStuff.h"
#include "Config.h"
#include "LumosConfig.h"
#include "BacklightManager.h"
#define MUTEX_NAME L"Lumos"
#define EVENT_SHUTDOWN L"Lumos/ShutdownEvent"
#define SIGNAL_KEYNAME L"Software\\HTC"
#define SIGNAL_VALUENAME L"Signal"
HINSTANCE g_hInst = 0;
LumosConfig* lconfig = 0;
HANDLE mutexOneInstance;
HANDLE eventShutdown;
bool IsFirstInstance();
void PrepareConfig();
void FreeHandles();
DWORD LSensorMonitorProc(LPVOID lpArgs);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
g_hInst = hInstance;
_LOG(L"Startup\n");
eventShutdown = CreateEvent(0, TRUE, FALSE, EVENT_SHUTDOWN);
if (!IsFirstInstance())
{
_LOG(L"Not a first instance, exiting\n");
FreeHandles();
return 1;
}
if (!HTCUtilInit())
{
_LOG(L"HTCUtil initialization failed, exiting\n");
FreeHandles();
return 1;
}
if (lpCmdLine != 0 && !wcscmp(lpCmdLine, L"--autostart"))
{
_LOG(L"Autostart option, testing sensor\n");
HTCLSensorInit();
int cnt = 0;
while (HTCLSensorGetValue() == 0 && cnt < 5 &&
WaitForSingleObject(eventShutdown, 0)==WAIT_TIMEOUT)
{
_LOG(L"Test sensor #%d\n", cnt);
DWORD ticks = GetTickCount();
while (GetTickCount() - ticks < 10000 &&
WaitForSingleObject(eventShutdown, 1000) == WAIT_TIMEOUT) {}
cnt++;
HTCLSensorFree();
HTCLSensorInit();
}
}
else
{
if (!HTCLSensorInit())
{
_LOG(L"HTCLSensor initialization failed, exiting\n");
FreeHandles();
return 1;
}
}
_LOG(L"Main run\n");
if (WaitForSingleObject(eventShutdown, 0)==WAIT_TIMEOUT)
{
PrepareConfig();
DWORD mainThreadId = GetCurrentThreadId();
CreateThread(0, 0, LSensorMonitorProc, &mainThreadId, 0, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SetEvent(eventShutdown);
Sleep(150);
}
_LOG(L"Shutdown program\n");
FreeHandles();
if (lconfig) delete lconfig;
lconfig = 0;
return 0;
}
void FreeHandles()
{
HTCLSensorFree();
HTCUtilFree();
CloseHandle(eventShutdown);
eventShutdown = 0;
CloseHandle(mutexOneInstance);
mutexOneInstance = 0;
}
void PrepareConfig()
{
config.Init();
lconfig = new LumosConfig();
lconfig->MAX_REPORTED_BACKLIGHT = HTCUtilGetBacklightMaxBrightness();
lconfig->MIN_REPORTED_BACKLIGHT = HTCUtilGetBacklightMinBrightness();
}
bool IsFirstInstance()
{
HKEY hKey;
if ((mutexOneInstance=CreateMutex(0, true, MUTEX_NAME)) && GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(mutexOneInstance);
mutexOneInstance = 0;
if (MessageBox(0, L"Lumos already running, Stop it?", L"Lumos", MB_ICONQUESTION | MB_YESNO)==IDYES)
{
SetEvent(eventShutdown);
Sleep(1000);
if ((mutexOneInstance=CreateMutex(0, true, MUTEX_NAME)) && GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(mutexOneInstance);
mutexOneInstance = 0;
if (RegOpenKeyEx(HKEY_CURRENT_USER, SIGNAL_KEYNAME, 0, 0, &hKey) != ERROR_SUCCESS)
{
MessageBox(0, L"Can't open reg key Signal key", L"Error", MB_TOPMOST | MB_ICONERROR);
return false;
}
DWORD vType;
DWORD pid;
DWORD vSize = sizeof(pid);
if (RegQueryValueEx(hKey, SIGNAL_VALUENAME, 0, &vType, (LPBYTE)&pid, &vSize) != ERROR_SUCCESS)
{
MessageBox(0, L"Another instance exists, but can't kill it", L"Error", MB_TOPMOST | MB_ICONERROR);
RegCloseKey(hKey);
return false;
}
RegCloseKey(hKey);
HANDLE hProc = OpenProcess(0, 0, pid);
if (hProc)
TerminateProcess(hProc, 0);
else
MessageBox(0, L"Can't kill running Lumos", L"Lumos", MB_TOPMOST | MB_ICONERROR);
}
}
return false;
}
else
{
if (RegOpenKeyEx(HKEY_CURRENT_USER, SIGNAL_KEYNAME, 0, 0, &hKey) != ERROR_SUCCESS)
{
MessageBox(0, L"Can't open reg key for Signal", L"Error", MB_TOPMOST | MB_ICONERROR);
return false;
}
DWORD pid = GetCurrentProcessId();
RegSetValueEx(hKey, SIGNAL_VALUENAME, 0, REG_DWORD, (LPBYTE)&pid, sizeof(pid));
RegCloseKey(hKey);
}
return true;
}
HFONT fnLums = 0;
HBRUSH brushFill = 0;
void DrawLums(int* lums, int curNum)
{
if (!fnLums)
{
LOGFONT lf;
ZeroMemory(&lf, sizeof(lf));
lf.lfPitchAndFamily = FIXED_PITCH;
lf.lfQuality = CLEARTYPE_QUALITY;
lf.lfWeight = FW_NORMAL;
lf.lfHeight = 14;
fnLums = CreateFontIndirect(&lf);
brushFill = CreateSolidBrush(0);
}
HDC hdc = GetDC(0);
RECT rc = {56, 0, 180, 46};
//FillRect(hdc, &rc, brushFill);
COLORREF crTextOld = SetTextColor(hdc, 0xFFFFFF);
COLORREF crBackOld = SetBkColor(hdc, 0);
int bkOldMode = SetBkMode(hdc, OPAQUE);
HGDIOBJ fnOld = SelectObject(hdc, fnLums);
TCHAR buf[10], buf2[256];
curNum += 8;
wcstrcpy(buf2, L"");
wcsprintf(buf, L"%03d ", lums[(curNum+0)%4]); wcstrcat(buf2, buf);
wcsprintf(buf, L"%03d ", lums[(curNum-1)%4]); wcstrcat(buf2, buf);
wcsprintf(buf, L"%03d ", lums[(curNum-2)%4]); wcstrcat(buf2, buf);
wcsprintf(buf, L"%03d ", lums[(curNum-3)%4]); wcstrcat(buf2, buf);
DrawText(hdc, buf2, -1, &rc, DT_TOP | DT_LEFT | DT_SINGLELINE);
SetTextColor(hdc, crTextOld);
SetBkColor(hdc, crBackOld);
SetBkMode(hdc, bkOldMode);
SelectObject(hdc, fnOld);
ReleaseDC(0, hdc);
}
DWORD LSensorMonitorProc(LPVOID lpArgs)
{
DWORD *mainThreadId = (DWORD*)lpArgs;
BacklightManager bkl(lconfig);
_LOG(L"LThread entering\n");
// here we fixing min, max backlight to corespond hardware levels (original BACKLIGHT between 1 and 10)
double factor = (lconfig->MAX_REPORTED_BACKLIGHT - lconfig->MIN_REPORTED_BACKLIGHT) / 9.0;
lconfig->MAX_BACKLIGHT = (int)(lconfig->MIN_REPORTED_BACKLIGHT + (lconfig->MAX_BACKLIGHT - lconfig->MIN_BACKLIGHT - 1) * factor);
lconfig->MIN_BACKLIGHT = (int)(lconfig->MIN_REPORTED_BACKLIGHT + (lconfig->MIN_BACKLIGHT - 1) * factor);
// if want original idea, about loosing user setting for MIN and MAX BACKLIGHT, need uncomment two lines below
//lconfig->MAX_BACKLIGHT = lconfig->MAX_REPORTED_BACKLIGHT;
//lconfig->MIN_BACKLIGHT = lconfig->MIN_REPORTED_BACKLIGHT;
int lums[4] = {HTCLSensorGetValue(), HTCLSensorGetValue(), HTCLSensorGetValue(), HTCLSensorGetValue()};
DWORD lumNum = 0;
int pollNum = 0;
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_BELOW_NORMAL);
while (WaitForSingleObject(eventShutdown, lconfig->POLLING_INTERVAL) == WAIT_TIMEOUT)
{
if (!IsScreenPowered()) continue;
lums[lumNum%4] = HTCLSensorGetValue();
//DrawLums(lums, lumNum);
lumNum++;
if ((pollNum >= lconfig->EXTRA_POLLS_BEFORE_SET))
{
int medium = (lums[0] + lums[1] + lums[2] + lums[3]) / 4;
bkl.CheckExceptions();
bkl.SetBrightness(bkl.CalculateBrightness(medium));
pollNum = 0;
}
else pollNum++;
}
_LOG(L"LThread leaving\n");
PostThreadMessage(*mainThreadId, WM_QUIT, 0, 0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -