-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathWhatPulseLogitechApp.cpp
153 lines (130 loc) · 4.11 KB
/
WhatPulseLogitechApp.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
* WhatPulse Logitech Gaming Keyboard Widget
*
* This widget uses the WhatPulse Client API to retrieve statistics from the WhatPulse Client
* and display them on a Logitech Gaming Keyboard LCD screen. It also serves as an open example
* of how the Client API can be used.
*
* This has been tested on a G19 and G510. It requires the WhatPulse Client and that the
* client API has been enabled in the Settings tab.
*
* WhatPulse (c) 2016 - http://whatpulse.org
*/
#include "stdafx.h"
#include "WhatPulseLogitechApp.h"
#include "WhatPulseLogitech.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define LCDSAMPLE_MUTEXNAME _T("WhatPulse_Logitech_Widget_0_1")
LPWSTR iniFile = NULL;
BEGIN_MESSAGE_MAP(WhatPulseLogitechApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
WhatPulseLogitechApp::WhatPulseLogitechApp()
{
m_hMutex = NULL;
m_gdiplusToken = NULL;
}
WhatPulseLogitechApp theApp;
WhatPulseLogitech dlg;
BOOL WhatPulseLogitechApp::InitInstance()
{
// If there's a "-delayedstart" in the parameters (on system boot), go to sleep for 30 seconds
// This is primarily to make sure we give the WhatPulse client some time to start
if (StrStrI(AfxGetApp()->m_lpCmdLine, _T("-delayedstart")))
{
::Sleep(30000);
}
// Get current directory for ini file storage and add the ini filename to it, so
// we can reference that path in sections where we use settings
TCHAR szPath[MAX_PATH];
CString csPath;
// Get path for the local application data, user specific
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, szPath)))
{
// Add our own directory to the path
PathAppend(szPath, _T("\\WhatPulse Logitech Widget\\"));
// Check if the directory exists and create it if it doesn't
if (GetFileAttributes(szPath) == INVALID_FILE_ATTRIBUTES) {
CreateDirectory(szPath, NULL);
}
// Add the ini filename
csPath = szPath;
csPath.Append(_T("\\WhatPulseLogitechWidget.ini"));
}
else {
// Backup: local directory
csPath.Empty();
csPath = ".\\WhatPulseLogitechWidget.ini";
}
// Save ini file path
iniFile = csPath.GetBuffer();
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
// Initialize GDI+
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
CWinApp::InitInstance();
m_hMutex = ClaimMutex(LCDSAMPLE_MUTEXNAME, NULL);
if(NULL == m_hMutex)
{
return FALSE;
}
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
INT WhatPulseLogitechApp::ExitInstance()
{
if(NULL != m_hMutex)
{
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
m_hMutex = NULL;
}
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
HANDLE WhatPulseLogitechApp::ClaimMutex(LPCTSTR szMutex, LPCTSTR szWndClassName)
{
// attempt to claim the mutex
HANDLE hMutex = CreateMutex(NULL, TRUE, szMutex);
if (ERROR_ALREADY_EXISTS == GetLastError())
{
if (hMutex)
{
CloseHandle(hMutex);
hMutex = NULL;
}
// bring the existing wnd to the foreground
if (szWndClassName)
{
HWND hExistingWnd = FindWindow(szWndClassName, NULL);
if (hExistingWnd)
{
ShowWindow(hExistingWnd, SW_RESTORE);
SetForegroundWindow(hExistingWnd);
}
}
return NULL;
}
return hMutex;
}