?? fancontrolor.cpp
字號:
#include<windows.h>
#include<commctrl.h>
#include "resource.h"
//<-----------全局變量聲明----->
//全局變量
HINSTANCE hInst;//實例變量
HBRUSH bk_brush,fr_brush;//背景畫刷
RECT Rt;//窗口RECT
HRGN DlgRgn,frRgn,tmpRgn;//窗口RGN
HDC hdc;
PAINTSTRUCT ps;
SC_HANDLE hSCObject;
HANDLE hFan;
char strSpeed[16],strSpeedRate[16];
int iSpeedRate=255;
UINT_PTR hGetSpeedTimer=NULL,hSetSpeedTimer=NULL;
//<--------------函數(shù)聲明----------->
//主對話框過程函數(shù)
INT_PTR CALLBACK MainDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
//風(fēng)扇控制函數(shù)
int GetFanSpeed(HANDLE hFan);
void SetFanSpeedAuto(HANDLE hFan);
void SetFanSpeed(HANDLE hFan,int SpeedRate);//調(diào)節(jié)風(fēng)扇速度,only for dell
//Opcode函數(shù)
int SendOpcode(HANDLE hFan,byte op1,byte op2,byte op3);
//<----------------------------驅(qū)動相關(guān)函數(shù)----------------------->
//裝載風(fēng)扇設(shè)備
DWORD LoadFanDevice();
////創(chuàng)建服務(wù)
BOOL CreateFanService(SC_HANDLE hSCManager,LPCSTR lpDisplayName,LPCSTR lpBinaryPathName);
////啟動服務(wù)
BOOL StartFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName);
//卸載風(fēng)扇驅(qū)動
void UnLoadFanService();
///停止服務(wù)
void StopFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName);
////刪除服務(wù)
void DeleteFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName);
//<------------------輔助函數(shù)-------------->
//警告框
void AlarmBox(LPSTR msg);
//繪制漸變背景
void OnEraseBkGnd(HWND hwnd);
//程序入口點
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
hInst = hInstance;
LoadIcon(hInst,MAKEINTRESOURCE(IDI_LOGO));
//<------------------裝載風(fēng)扇驅(qū)動------------------------------------->
if(0xFFFFFFFF == (DWORD)(hFan=(HANDLE)LoadFanDevice()))
{
UnLoadFanService();
}
DialogBoxA(hInstance, MAKEINTRESOURCE(DLG_MAIN), 0, MainDlgProc);
//<-------------卸載風(fēng)扇驅(qū)動------------->
UnLoadFanService();
return 0;
}
//主對話框過程函數(shù)定義
INT_PTR CALLBACK MainDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_INITDIALOG :
//<-------------------初始化界面--------------------------------------->
GetWindowRect(hDlg, &Rt);
DlgRgn = CreateRectRgn(0,0,0,0);
frRgn = CreateRectRgn(0,0,0,0);
tmpRgn = CreateRectRgn(0,0,0,0);
CombineRgn( DlgRgn, //保存創(chuàng)建的RGN---------創(chuàng)建窗口非標準RGN
CreateEllipticRgn(0,0,Rt.bottom-Rt.top,Rt.bottom-Rt.top), //圓形RGN
CreateRectRgn((Rt.bottom-Rt.top)/2,0,Rt.right-Rt.left,Rt.bottom-Rt.top), //矩形RGN
RGN_OR); //疊加方式
CombineRgn( tmpRgn,
CreateEllipticRgn(1,1,Rt.bottom-Rt.top-1,Rt.bottom-Rt.top-1),
CreateRectRgn((Rt.bottom-Rt.top-1)/2,1,Rt.right-Rt.left-1,Rt.bottom-Rt.top-1),
RGN_OR);
CombineRgn(frRgn,tmpRgn,DlgRgn,RGN_XOR);
SetWindowRgn(hDlg, DlgRgn, TRUE); //應(yīng)用創(chuàng)建好的RGN
//<-----------------初始化控件-------------------------------------->
CheckDlgButton(hDlg,IDC_AUTOCHECK,BST_CHECKED);
SetDlgItemText(hDlg,IDC_FanSpeed,"偵測中");
//限制輸入長度
SendMessage(GetDlgItem(hDlg,IDC_SPEEDRATE),(UINT)EM_SETLIMITTEXT,(WPARAM)0x3,NULL );
//----------加載GDI Object----------
bk_brush=CreateSolidBrush(RGB(255,255,255));
fr_brush=CreateSolidBrush(RGB(0,0,0));
//<--------------------設(shè)置測速時間消息------------------------------->
hGetSpeedTimer=SetTimer(hDlg,0x1,2000,NULL);
return TRUE;
break;
//<------------畫界面--------------------->
case WM_PAINT:
InvalidateRect(hDlg,NULL,TRUE);
hdc=BeginPaint(hDlg,&ps);
FillRgn(hdc,frRgn,fr_brush);
EndPaint(hDlg,&ps);
return FALSE;
break;
//<----------------------添加無標題欄拖動功能----------------------->
case WM_LBUTTONDOWN:
SendMessage(hDlg,WM_NCLBUTTONDOWN,HTCAPTION, wParam);
return TRUE;
break;
/* //<---------------------添加無標題欄Alt+F4關(guān)閉功能------------------>
case WM_SYSKEYUP:
switch(wParam)
{
case VK_F4:
if( (lParam & 0x20000000)!=0)
{
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return FALSE;
break;
*/
//<-----------------處理時間消息-更新轉(zhuǎn)速-設(shè)置轉(zhuǎn)速-------->
case WM_TIMER:
switch(wParam)
{
case 0x1:
wsprintf(strSpeed,"%d",GetFanSpeed(hFan));
SetDlgItemText(hDlg,IDC_FanSpeed,strSpeed);
return TRUE;
break;
case 0x2:
memset(strSpeedRate,0,16);
GetDlgItemText(hDlg,IDC_SPEEDRATE,strSpeedRate,4);
if(strlen(strSpeedRate) == 3 && (iSpeedRate=atoi(strSpeedRate))<=255)
{
SetFanSpeed(hFan,iSpeedRate);
}
KillTimer(hDlg,hSetSpeedTimer);
return TRUE;
break;
}
return FALSE;
break;
//<----------------------------------改變顏色-------------------------->
case WM_CTLCOLORDLG:
return (INT_PTR)bk_brush;
break;
case WM_ERASEBKGND:
OnEraseBkGnd(hDlg);
return TRUE;
break;
//<----------------------------------關(guān)閉對話框------------------------>
case WM_CLOSE:
//----------卸載GDI Object-----------
DeleteObject(bk_brush);DeleteObject(fr_brush);
//---kill timer--------
KillTimer(hDlg, hGetSpeedTimer);
EndDialog(hDlg,0);
return TRUE;
break;
case WM_COMMAND :
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId)
{
case IDC_AUTOCHECK:
if (IsDlgButtonChecked(hDlg,IDC_AUTOCHECK) == BST_CHECKED)
{
EnableWindow(GetDlgItem(hDlg,IDC_SPEEDRATE),FALSE);
SetFanSpeedAuto(hFan);
}
else
{
EnableWindow(GetDlgItem(hDlg,IDC_SPEEDRATE),TRUE);
}
return TRUE;
break;
case IDC_SPEEDRATE:
if(wmEvent == EN_CHANGE)
{
memset(strSpeedRate,0,16);
GetDlgItemText(hDlg,IDC_SPEEDRATE,strSpeedRate,4);
if(strlen(strSpeedRate) == 3 && (iSpeedRate=atoi(strSpeedRate))<=255 )
{
hSetSpeedTimer=SetTimer(hDlg,0x2,3000,NULL);
}
}
return TRUE;
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return FALSE;
}
//警告框定義
void AlarmBox(LPSTR msg)
{
MessageBox(NULL,msg,"Alarm",MB_OK);
}
//裝載風(fēng)扇設(shè)備定義
DWORD LoadFanDevice()
{
char TempPath[256],FilePath[256];//臨時文件名
DWORD dwNumberOfBytesWritten,dwNumberOfBytesToWrite;
LPVOID pDriverFile;
DWORD dwRET=0xFFFFFFFF;
HRSRC hrsrcDriver;
HANDLE hDriverFile;
if( hSCObject = OpenSCManager(NULL,NULL,0x000F003F) )
{
if( hrsrcDriver=FindResource(NULL,"FanDriver","SYS"))
{
if( (pDriverFile=LockResource(LoadResource(NULL,hrsrcDriver))) && (dwNumberOfBytesToWrite=SizeofResource(NULL,hrsrcDriver)))
{
GetTempPath(256,TempPath);
wsprintf(FilePath,"%sdump%x.tmp",TempPath,GetTickCount());
if( ( hDriverFile = CreateFile(FilePath,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY,NULL)) != INVALID_HANDLE_VALUE)
{
WriteFile(hDriverFile,pDriverFile,dwNumberOfBytesToWrite,&dwNumberOfBytesWritten,NULL);
CloseHandle(hDriverFile);
if ( CreateFanService(hSCObject,"#!#!",FilePath))
{
if( StartFanService(hSCObject,"#!#!"))
{
dwRET = (DWORD)CreateFile("\\\\.\\#!#!",GENERIC_WRITE|GENERIC_READ,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
}
}
//<-----------刪除文件----------->
DeleteFile(FilePath);
return dwRET;
}
}
}
}
return dwRET;
}
////創(chuàng)建服務(wù)定義
BOOL CreateFanService(SC_HANDLE hSCManager,LPCSTR lpDisplayName,LPCSTR lpBinaryPathName)
{
SC_HANDLE hFanService;
if( NULL == (hFanService= CreateService(hSCManager,lpDisplayName,lpDisplayName,
SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,lpBinaryPathName,
NULL,NULL,NULL,NULL,NULL)))
{
if(GetLastError() != ERROR_SERVICE_EXISTS)
{
AlarmBox("CreateService failed!");
return FALSE;
}
}
CloseServiceHandle(hFanService);
return TRUE;
}
////啟動服務(wù)定義
BOOL StartFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName)
{
SC_HANDLE hFanService;
if( hFanService=OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS))
{
if(FALSE==StartService(hFanService,NULL,NULL))
{
if(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING)
{
AlarmBox("StartService failed!");
return FALSE;
}
}
CloseServiceHandle(hFanService);
return TRUE;
}
AlarmBox("OpenService failed! Error");
return FALSE;
}
//卸載風(fēng)扇驅(qū)動定義
void UnLoadFanService()
{
if(hSCObject!=NULL)
{
StopFanService(hSCObject,"#!#!");
DeleteFanService(hSCObject,"#!#!");
CloseServiceHandle(hSCObject);
}
return;
}
///停止服務(wù)定義
void StopFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName)
{
SERVICE_STATUS ServiceStatus;
SC_HANDLE hFanService;
if( !(hFanService=OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS)))
{
AlarmBox("OpenService failed! Error");
return;
}
if( !(ControlService(hFanService,SERVICE_CONTROL_STOP,&ServiceStatus)))
{
AlarmBox("ControlService failed!");
}
CloseServiceHandle(hFanService);
return;
}
////刪除服務(wù)定義
void DeleteFanService(SC_HANDLE hSCManager,LPCSTR lpServiceName)
{
SC_HANDLE hFanService;
if( !(hFanService=OpenService(hSCManager,lpServiceName,SERVICE_ALL_ACCESS)))
{
AlarmBox("OpenService failed! Error");
return;
}
if(!(DeleteService(hFanService)))
{
AlarmBox("DeleteService failed! Error");
return;
}
CloseServiceHandle(hFanService);
}
//得到風(fēng)扇轉(zhuǎn)速定義
int GetFanSpeed(HANDLE hFan)
{
WORD speed;
speed=(WORD)SendOpcode(hFan,(byte)2,(byte)0,(byte)0);
return (DWORD)speed;
}
//自動調(diào)節(jié)速度
void SetFanSpeedAuto(HANDLE hFan)
{
SendOpcode(hFan,(byte)1,(byte)3,(byte)0);
}
//設(shè)置風(fēng)扇轉(zhuǎn)速
void SetFanSpeed(HANDLE hFan,int SpeedRate)
{
SendOpcode(hFan,0x1,0x80,SpeedRate);
}
//Opcode函數(shù)定義
int SendOpcode(HANDLE hFan,byte op1,byte op2,byte op3)
{
DWORD BytesReturned;
byte buffer[8];
WORD RetValue;
memset((LPVOID)buffer,0,8);
buffer[0]=op1;
buffer[1]=op2;
buffer[2]=op3;
if(DeviceIoControl(hFan,0x80012000,buffer,6,buffer,6,&BytesReturned,NULL))
{
RetValue=*((LPWORD)&buffer[4]);
if(RetValue!=0xFFFF)
return RetValue;
}
return 0xFFFFFFFF;
}
//繪制漸變背景
void OnEraseBkGnd(HWND hwnd)
{
/* Vars */
HDC dc; /* Standard Device Context; used to do the painting */
/* Start color; Change the R,G,B values
to the color of your choice */
int r1 =255, g1 =255, b1 = 255;
/* End Color; Change the R,G,B values
to the color of your choice */
int r2 = 0, g2 = 204, b2 = 255;
/* Color ref. for the gradient */
int r,g,b;
int i;
/* rect = Client Rect of the window;
Temp = Temparary rect tangle for the color bands */
RECT rect, temp;
HBRUSH color; /* A brush to do the painting with */
/* Get the dc for the wnd */
dc = GetDC(hwnd);
/* Get the client rect */
GetClientRect(hwnd, &rect);
/* loop to create the gradient */
for(i=0;i<rect.right;i++)
{
/* Determine the colors */
if(i<=48)
{
r=255;g=255;b=255;
}
else
{
r = r1 + ((i-48) * (r2-r1) / rect.right);
g = g1 + ((i-48) * (g2-g1) / rect.right);
b = b1 + ((i-48) * (b2-b1) / rect.right);
}
/* Fill in the rectangle information */
/* The uper left point of the rectangle
being painted; uses i as the starting point*/
temp.left = i;
/* Upeer Y cord. Always start at the top */
temp.top = 0;
/* Okay heres the key part,
create a rectangle thats 1 pixel wide */
temp.right = i + 1;
/* Height of the rectangle */
temp.bottom = rect.bottom;
/* Create a brush to draw with;
these colors are randomized */
color = CreateSolidBrush(RGB(r, g, b));
/* Finally fill in the rectange */
FillRect(dc, &temp, color);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -