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

📄 lumosmain.cpp

📁 Example of using HTC sensor api to get Light sensor value and set backlight level in modern HTC phon
💻 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 + -