-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathYBattery.cpp
105 lines (89 loc) · 2.72 KB
/
YBattery.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
Yuryu's Battery Information, displays detailed battery info.
Copyright 2008 Yuryu / Emma Haruka Iwao
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// YBattery.cpp: CYBattery クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "YbInfo.h"
#include "YBattery.h"
#include "resource.h"
//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////
CYBattery::CYBattery(LPCTSTR devicePath):
m_hBattery(nullptr),
m_ulBatTag(0),
m_csDevicePath(devicePath)
{
}
CYBattery::~CYBattery()
{
CloseIfOpen();
}
bool CYBattery::Open()
{
CloseIfOpen();
m_hBattery = ::CreateFile(m_csDevicePath, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
if(m_hBattery == INVALID_HANDLE_VALUE){
m_hBattery = nullptr;
return false;
}
return true;
}
bool CYBattery::CloseIfOpen()
{
if(m_hBattery){
::CloseHandle(m_hBattery);
m_hBattery = nullptr;
return true;
}
return false;
}
ULONG CYBattery::GetNewTag()
{
ULONG ulWait = 5000;
ULONG ulTag;
DWORD dwBytesReturned;
BOOL bResult = ::DeviceIoControl(m_hBattery, IOCTL_BATTERY_QUERY_TAG, &ulWait, sizeof(ULONG),
&ulTag, sizeof(ULONG), &dwBytesReturned, nullptr);
if(!bResult){
m_ulBatTag = 0;
return 0;
}
m_ulBatTag = ulTag;
return ulTag;
}
bool CYBattery::QueryInfoString(const BATTERY_QUERY_INFORMATION_LEVEL level, const CStringW& csPlaceholder, CStringW& csOutStr)
{
wchar_t wszStrTemp[200] = { 0 };
const auto bSucceeded = QueryInfo(level, wszStrTemp);
if (bSucceeded) {
csOutStr = CStringW(std::move(wszStrTemp));
} else {
csOutStr = csPlaceholder;
}
return bSucceeded;
}
bool CYBattery::QueryStatus(BATTERY_STATUS &batStat)
{
BATTERY_WAIT_STATUS batWaitStatus;
DWORD dwBytesReturned;
batWaitStatus.BatteryTag = m_ulBatTag;
batWaitStatus.Timeout = 0;
const BOOL bSucceeded = ::DeviceIoControl(m_hBattery, IOCTL_BATTERY_QUERY_STATUS,
&batWaitStatus, sizeof(batWaitStatus),
&batStat, sizeof(batStat), &dwBytesReturned, nullptr);
return bSucceeded;
}