From 11d6086779ef72f75ed38d74da1097b81a2210d6 Mon Sep 17 00:00:00 2001 From: Shridhar Kumar <45252729+shriprem@users.noreply.github.com> Date: Sat, 19 Sep 2026 03:12:17 -0400 Subject: [PATCH 1/3] Use random key simulations roster --- StayAwake/SelectKeyCodesDlg.cpp | 102 ++++++++++++++++++++++++++++ StayAwake/SelectKeyCodesDlg.h | 32 +++++++++ StayAwake/StayAwake.h | 2 +- StayAwake/StayAwake.rc | Bin 14716 -> 18424 bytes StayAwake/StayAwake.vcxproj | 4 +- StayAwake/StayAwake.vcxproj.filters | 12 ++-- StayAwake/StayAwakeDlg.cpp | 91 ++++++++++++++++++------- StayAwake/StayAwakeDlg.h | 16 +++-- StayAwake/resource.h | 35 ++++++++-- 9 files changed, 251 insertions(+), 43 deletions(-) create mode 100644 StayAwake/SelectKeyCodesDlg.cpp create mode 100644 StayAwake/SelectKeyCodesDlg.h diff --git a/StayAwake/SelectKeyCodesDlg.cpp b/StayAwake/SelectKeyCodesDlg.cpp new file mode 100644 index 0000000..185078e --- /dev/null +++ b/StayAwake/SelectKeyCodesDlg.cpp @@ -0,0 +1,102 @@ +// CSelectKeyCodesDlg.cpp : implementation file +// + +#include "pch.h" +#include "StayAwake.h" +#include "afxdialogex.h" +#include "SelectKeyCodesDlg.h" +#include "StayAwakeDlg.h" + + +// CSelectKeyCodesDlg dialog + +IMPLEMENT_DYNAMIC(CSelectKeyCodesDlg, CDialogEx) + +CSelectKeyCodesDlg::CSelectKeyCodesDlg(CWnd* pParent /*=nullptr*/) + : CDialogEx(IDD_SELECT_KEYCODES_DIALOG, pParent) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +CSelectKeyCodesDlg::~CSelectKeyCodesDlg() +{ +} + +void CSelectKeyCodesDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CSelectKeyCodesDlg, CDialogEx) + ON_BN_CLICKED(IDC_KEY_SELECT_APPLY_BTN, &CSelectKeyCodesDlg::OnBnClickedApply) + ON_BN_CLICKED(IDC_KEY_SELECT_ALL_BTN, &CSelectKeyCodesDlg::OnClickedKeySelectAllBtn) + ON_BN_CLICKED(IDC_KEY_SELECT_NONE_BTN, &CSelectKeyCodesDlg::OnClickedKeySelectNoneBtn) +END_MESSAGE_MAP() + + +BOOL CSelectKeyCodesDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + CheckAllBoxes(CStayAwakeDlg::GetSelectedKeyCodes()); + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CSelectKeyCodesDlg::OnBnClickedApply() +{ + wstring sSelectedKeyCodes{}; + + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_SCROLL_LOCK)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_VOLUME_UP_DOWN)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_1)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_2)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_3)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_4)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_5)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_6)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_7)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_8)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_9)) ? L"1" : L"0"; + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_10)) ? L"1" : L"0"; + + if (sSelectedKeyCodes == L"000000000000") + { + MessageBox(L"Please select at least one Key Simulation", L"Select Key Simulations", MB_ICONERROR); + return; + } + + CStayAwakeDlg::SaveSelectedKeyCodes(sSelectedKeyCodes); + + CDialogEx::OnOK(); +} + +void CSelectKeyCodesDlg::CheckAllBoxes(const wstring& sSelectedKeyCodes) +{ + CheckDlgButton(IDC_KEY_SCROLL_LOCK, sSelectedKeyCodes.substr(0, 1) == L"1"); + CheckDlgButton(IDC_KEY_VOLUME_UP_DOWN, sSelectedKeyCodes.substr(1, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_1, sSelectedKeyCodes.substr(2, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_2, sSelectedKeyCodes.substr(3, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_3, sSelectedKeyCodes.substr(4, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_4, sSelectedKeyCodes.substr(5, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_5, sSelectedKeyCodes.substr(6, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_6, sSelectedKeyCodes.substr(7, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_7, sSelectedKeyCodes.substr(8, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_8, sSelectedKeyCodes.substr(9, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_9, sSelectedKeyCodes.substr(10, 1) == L"1"); + CheckDlgButton(IDC_KEY_UNASSIGNED_10, sSelectedKeyCodes.substr(11, 1) == L"1"); +} + +void CSelectKeyCodesDlg::OnClickedKeySelectAllBtn() +{ + CheckAllBoxes(L"111111111111"); +} + +void CSelectKeyCodesDlg::OnClickedKeySelectNoneBtn() +{ + CheckAllBoxes(L"000000000000"); +} diff --git a/StayAwake/SelectKeyCodesDlg.h b/StayAwake/SelectKeyCodesDlg.h new file mode 100644 index 0000000..24ba14a --- /dev/null +++ b/StayAwake/SelectKeyCodesDlg.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Utils.h" + +class CSelectKeyCodesDlg : public CDialogEx +{ + DECLARE_DYNAMIC(CSelectKeyCodesDlg) + +public: + CSelectKeyCodesDlg(CWnd* pParent = nullptr); // standard constructor + virtual ~CSelectKeyCodesDlg(); + +// Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_SELECT_KEYCODES_DIALOG }; +#endif + +protected: + HICON m_hIcon; + + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + virtual BOOL OnInitDialog(); + afx_msg void OnClickedKeySelectAllBtn(); + afx_msg void OnClickedKeySelectNoneBtn(); + afx_msg void OnBnClickedApply(); + + DECLARE_MESSAGE_MAP() + +private: + void CheckAllBoxes(const wstring& sSelectedKeyCodes); +}; diff --git a/StayAwake/StayAwake.h b/StayAwake/StayAwake.h index 6ce67bc..47531e0 100644 --- a/StayAwake/StayAwake.h +++ b/StayAwake/StayAwake.h @@ -6,7 +6,7 @@ #include "resource.h" -#define LAST_CODE_UPDATE_TIME "Sep 17 2026 - 22:09:25" +#define LAST_CODE_UPDATE_TIME "Sep 19 2026 - 10:11:12" class CStayAwakeApp : public CWinApp { diff --git a/StayAwake/StayAwake.rc b/StayAwake/StayAwake.rc index 5bb70ceba8e994b162d59750d0292ce8e556208d..07b2518137f531dd40eafe034a3d835c9886ea31 100644 GIT binary patch delta 2102 zcmbVNO>Yum5T2%&>OrgvRG>zJVWkNKmTzogveNnyKKik4n;sMilBOw@3O4G!M~#Px zm)?5Oi-}F}4|wxr;@|KW5YvOtzFWdVN$HZ!&d$Escb<7>W}o-8)%`Se(sl8XCzLp# zee#n`1*+3~cpB}{9vx7Fs`LhalU`99>n(U~tkkK+e{M?r!tIV|v`j_Zd3s6}dH`Fd zFe#J}HZE+2a^jifV{f$cVeV*ps>t8HgDPg0EI#m$0^Jbj^a95NKv4(G&x7O-KAH`rihdZTNM138dc4+ySmK z5>rQP6+AU?e*}LSh!uQm#Y>*&cnQ3?4LnSug?Aw(0|E@H+8VrB?2F%ieC4aDpaVrrs3=4>EB znFsoqKF?7f_vb74_hU9N4VfQAHM`jF<=5G$ra@u)8ZARZ40Ro)YJ+ExdZwlQv&d9X zSU&c7_{VHub2xSx`e`WI_~>P*rJ-Tgv(Ai<>FC8Tsi??4t_Jjfd`uNOyo#*1Mnp}C zsEdm-&V?#+tcj}hW2(p|k9>;aq%bov)yAA1g_8U;BJtngx6ZZOU#{@UT`!-8ynH=0 a&(9a;`C-U?;i0-4Qu%k#**RS3I{pK6r(Pid delta 252 zcmey-&-kZk!w=EP=fssJ#|VgUt1);pq%u@8C@>UHHWU+Pw3;j{ttjcu;K~rm5YOPl z;K<+vWcx7aFc^aHWLpVoPG<&x24A4K|K#@$;*%4^Wl|C9JsE--LcppG7>vL)h_qxd z0JDvOq%%-wFwkrlh9ICh0YKWHA)LVvXa_{E0z(bZHQ``2VL;Lutj>qQXL6&W^yEY0 zdYf;E&0^mCLCS)8vV+Nn%^AAOI49pRm0&cOTxcLVna|v0vYnY2l$T{DGda#&X7e|5 GCIJAA&p6fq diff --git a/StayAwake/StayAwake.vcxproj b/StayAwake/StayAwake.vcxproj index 702da02..c9cac35 100644 --- a/StayAwake/StayAwake.vcxproj +++ b/StayAwake/StayAwake.vcxproj @@ -211,6 +211,7 @@ + @@ -220,6 +221,7 @@ + @@ -238,9 +240,7 @@ - - diff --git a/StayAwake/StayAwake.vcxproj.filters b/StayAwake/StayAwake.vcxproj.filters index f1f6329..20383b7 100644 --- a/StayAwake/StayAwake.vcxproj.filters +++ b/StayAwake/StayAwake.vcxproj.filters @@ -39,6 +39,9 @@ Header Files + + Header Files + @@ -56,6 +59,9 @@ Source Files + + Source Files + @@ -71,12 +77,6 @@ Resource Files - - Resource Files - - - Resource Files - Resource Files diff --git a/StayAwake/StayAwakeDlg.cpp b/StayAwake/StayAwakeDlg.cpp index ba45d76..e1c014b 100644 --- a/StayAwake/StayAwakeDlg.cpp +++ b/StayAwake/StayAwakeDlg.cpp @@ -2,10 +2,14 @@ #include "framework.h" #include "StayAwake.h" #include "StayAwakeDlg.h" +#include "SelectKeyCodesDlg.h" #include "StayAwakeAboutDlg.h" #include "afxdialogex.h" #include "Utils.h" +#include +#include + #ifdef _DEBUG #define new DEBUG_NEW #endif @@ -22,6 +26,39 @@ void CStayAwakeDlg::DoDataExchange(CDataExchange* pDX) CDialogEx::DoDataExchange(pDX); } +wstring CStayAwakeDlg::GetSelectedKeyCodes() +{ + const int bufSize{ LEN_SELECTED_KEYCODES + 1 }; + wstring sBuf(bufSize, '\0'); + + GetPrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, DEF_SELECTED_KEYCODES, sBuf.data(), bufSize, PREF_INI_FILE); + + // Remove \0s from buffer string + wstring sKeyCodes{ sBuf.c_str() }; + + if (!CheckSelectedKeyCodes(sKeyCodes)) + { + sKeyCodes = DEF_SELECTED_KEYCODES; + SaveSelectedKeyCodes(sKeyCodes); + } + + return sKeyCodes; +} + +BOOL CStayAwakeDlg::CheckSelectedKeyCodes(wstring sKeyCodes) +{ + return (sKeyCodes.length() == LEN_SELECTED_KEYCODES && + sKeyCodes != L"000000000000" && + regex_match(sKeyCodes, std::wregex(L"(0|1){12}"))); +} + +BOOL CStayAwakeDlg::SaveSelectedKeyCodes(wstring sKeyCodes) +{ + if (!CheckSelectedKeyCodes(sKeyCodes)) return FALSE; + + return WritePrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, sKeyCodes.c_str(), PREF_INI_FILE); +} + BEGIN_MESSAGE_MAP(CStayAwakeDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_MESSAGE(WM_POST_OPEN, &CStayAwakeDlg::OnPostOpen) @@ -35,11 +72,11 @@ BEGIN_MESSAGE_MAP(CStayAwakeDlg, CDialogEx) ON_WM_TIMER() ON_BN_CLICKED(IDC_MINIMIZE, &CStayAwakeDlg::OnMinimize) ON_BN_CLICKED(IDC_EXIT, &CStayAwakeDlg::OnExit) + ON_BN_CLICKED(IDC_STAYAWAKE_KEY_SELECT_BTN, &CStayAwakeDlg::OnClickedStayawakeKeySelectBtn) ON_BN_CLICKED(IDC_STAYAWAKE_SET_INTERVAL_BTN, &CStayAwakeDlg::OnSetInterval) ON_EN_KILLFOCUS(IDC_STAYAWAKE_INTERVAL_MIN, &CStayAwakeDlg::OnKillfocusIntervalMin) ON_EN_KILLFOCUS(IDC_STAYAWAKE_INTERVAL_MAX, &CStayAwakeDlg::OnKillfocusIntervalMax) ON_BN_CLICKED(IDC_ABOUT_BUTTON, &CStayAwakeDlg::OnClickedAboutButton) - ON_CBN_SELCHANGE(IDC_STAYAWAKE_KEY_LIST, &CStayAwakeDlg::OnStayawakeKeyChange) ON_BN_CLICKED(IDC_STAYAWAKE_PAUSE_RESUME_BTN, &CStayAwakeDlg::OnPauseResume) ON_BN_CLICKED(IDC_START_MINIMIZED, &CStayAwakeDlg::OnStartMinimized) END_MESSAGE_MAP() @@ -76,19 +113,6 @@ BOOL CStayAwakeDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon - // Init KeyCodes List - SendDlgItemMessage(IDC_STAYAWAKE_KEY_LIST, CB_ADDSTRING, NULL, (LPARAM)L"Scroll Lock cycling"); - SendDlgItemMessage(IDC_STAYAWAKE_KEY_LIST, CB_ADDSTRING, NULL, (LPARAM)L"Volume Down & Up"); - - for (int i{ 1 }; i <= 10; i++) { - SendDlgItemMessage(IDC_STAYAWAKE_KEY_LIST, CB_ADDSTRING, NULL, (LPARAM)(L"Unassigned Key #" + to_wstring(i)).c_str()); - } - - m_AwakeKeyCode = GetPrivateProfileInt(PREF_DEFAULTS, PREF_AWAKE_KEYCODE, m_AwakeKeyCode, PREF_INI_FILE); - m_AwakeKeyCode %= 12; - - SendDlgItemMessage(IDC_STAYAWAKE_KEY_LIST, CB_SETCURSEL, m_AwakeKeyCode, NULL); - InitIntervals(); SetDlgItemInt(IDC_STAYAWAKE_INTERVAL_MIN, m_IntervalMinSeconds, FALSE); SetDlgItemInt(IDC_STAYAWAKE_INTERVAL_MAX, m_IntervalMaxSeconds, FALSE); @@ -205,6 +229,13 @@ void CStayAwakeDlg::OnKillfocusIntervalMax() } +void CStayAwakeDlg::OnClickedStayawakeKeySelectBtn() +{ + CSelectKeyCodesDlg dlgSelectKeyCodes; + dlgSelectKeyCodes.DoModal(); + SimulateAwakeKeyPress(); +} + void CStayAwakeDlg::OnTimer(UINT_PTR nIDEvent) { SimulateAwakeKeyPress(); @@ -298,9 +329,26 @@ void CStayAwakeDlg::OnDestroy() void CStayAwakeDlg::SimulateAwakeKeyPress() { - switch (m_AwakeKeyCode) + wstring sSelectedKeyCodes{ GetSelectedKeyCodes() }; + + std::vector vKeys{}; + vKeys.resize(LEN_SELECTED_KEYCODES); + + int nIndex{}; + + for (int i{}; i < LEN_SELECTED_KEYCODES; i++) + { + if (sSelectedKeyCodes.substr(i, 1) == L"1") + vKeys[nIndex++] = i; + } + + UINT nAwakeKeyCode{ vKeys[rand() % nIndex] }; + wstring sAwakeKeyCode{}; + + switch (nAwakeKeyCode) { case 1: + sAwakeKeyCode = L"Volume Down && Up"; keybd_event(VK_VOLUME_DOWN, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(VK_VOLUME_DOWN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); Sleep(10); @@ -318,18 +366,21 @@ void CStayAwakeDlg::SimulateAwakeKeyPress() case 9: case 10: { - BYTE keycode{ static_cast(VK_UNASSIGNED_01 + m_AwakeKeyCode - 2) }; + sAwakeKeyCode = L"Unassigned Key #" + to_wstring(nAwakeKeyCode - 1); + BYTE keycode{ static_cast(VK_UNASSIGNED_01 + nAwakeKeyCode - 2) }; keybd_event(keycode, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(keycode, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); break; } case 11: + sAwakeKeyCode = L"Unassigned Key #10"; keybd_event(VK_UNASSIGNED_10, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(VK_UNASSIGNED_10, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); break; default: + sAwakeKeyCode = L"Scroll Lock cycling"; keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); Sleep(10); @@ -352,6 +403,7 @@ void CStayAwakeDlg::SimulateAwakeKeyPress() GetSystemTime(&nextTime); Utils::addSecondsToTime(nextTime, nTimerSeconds); SetDlgItemText(IDC_STAYAWAKE_NEXT_EVENT, Utils::formatSystemTime(nextTime, L"Next StayAwake event").c_str()); + SetDlgItemText(IDC_STAYAWAKE_NEXT_KEYCODE, (L"[" + sAwakeKeyCode + L"]").c_str()); } @@ -383,13 +435,6 @@ void CStayAwakeDlg::OnClickedAboutButton() dlgAbout.DoModal(); } -void CStayAwakeDlg::OnStayawakeKeyChange() -{ - m_AwakeKeyCode = static_cast(SendDlgItemMessage(IDC_STAYAWAKE_KEY_LIST, CB_GETCURSEL, 0, 0)); - m_AwakeKeyCode %= 12; - WritePrivateProfileString(PREF_DEFAULTS, PREF_AWAKE_KEYCODE, to_wstring(m_AwakeKeyCode).c_str(), PREF_INI_FILE); -} - void CStayAwakeDlg::OnPauseResume() { if (IsTimerPaused()) diff --git a/StayAwake/StayAwakeDlg.h b/StayAwake/StayAwakeDlg.h index 61eb87d..8dc4a8e 100644 --- a/StayAwake/StayAwakeDlg.h +++ b/StayAwake/StayAwakeDlg.h @@ -14,6 +14,7 @@ constexpr auto BTN_TEXT_RESUME = L"&Resume"; constexpr auto PREF_INI_FILE = L".\\StayAwake.ini"; constexpr auto PREF_DEFAULTS = L"Defaults"; constexpr auto PREF_AWAKE_KEYCODE = L"AwakeKeyCode"; +constexpr auto PREF_SELECTED_KEYCODES = L"SelectedKeyCodes"; constexpr auto PREF_AWAKE_PAUSED = L"AwakePaused"; constexpr auto PREF_START_MINIMIZED = L"StartMinimized"; constexpr auto PREF_MULTI_INSTANCE = L"MultipleInstancesAllowed"; @@ -22,8 +23,11 @@ constexpr auto PREF_INTERVAL_MINIMUM = L"MinimumIntervalInSeconds"; constexpr auto PREF_INTERVAL_MAXIMUM = L"MaximumIntervalInSeconds"; constexpr auto MIN_PERIOD{ 10 }; -constexpr auto DEF_PERIOD{ 240 }; constexpr auto MAX_PERIOD{ 9990 }; +constexpr auto DEF_PERIOD{ 240 }; + +constexpr auto LEN_SELECTED_KEYCODES{ 12 }; +constexpr auto DEF_SELECTED_KEYCODES{ L"001111111111" }; const wstring MIN_MAX_PERIOD = to_wstring(MIN_PERIOD) + L" and " + to_wstring(MAX_PERIOD); const wstring INTERVAL_TOOLTIP = L"Number between " + MIN_MAX_PERIOD; @@ -39,10 +43,15 @@ class CStayAwakeDlg : public CDialogEx enum { IDD = IDD_STAYAWAKE_DIALOG }; #endif - protected: +protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support +public: + static wstring GetSelectedKeyCodes(); + static BOOL CheckSelectedKeyCodes(wstring sKeyCodes); + static BOOL SaveSelectedKeyCodes(wstring sKeyCodes); + protected: HICON m_hIcon; @@ -53,7 +62,6 @@ class CStayAwakeDlg : public CDialogEx private: bool m_bMinimized{}; UINT_PTR m_TimerID{42}; - UINT m_AwakeKeyCode{ 0 }; UINT m_IntervalMinSeconds{}; UINT m_IntervalMaxSeconds{}; NOTIFYICONDATA m_TrayData{}; @@ -62,10 +70,10 @@ class CStayAwakeDlg : public CDialogEx afx_msg LRESULT OnPostOpen(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnRestoreDialog(WPARAM wParam, LPARAM lParam); + afx_msg void OnClickedStayawakeKeySelectBtn(); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnKillfocusIntervalMin(); afx_msg void OnKillfocusIntervalMax(); - afx_msg void OnStayawakeKeyChange(); afx_msg void OnSetInterval(); afx_msg void OnPauseResume(); afx_msg void OnMinimize() { MinimizeToTray(); }; diff --git a/StayAwake/resource.h b/StayAwake/resource.h index 8e00494..9c63835 100644 --- a/StayAwake/resource.h +++ b/StayAwake/resource.h @@ -6,27 +6,48 @@ #define IDD_ABOUTBOX 100 #define IDS_ABOUTBOX 101 #define IDD_STAYAWAKE_DIALOG 102 +#define IDD_SELECT_KEYCODES_DIALOG 103 #define IDR_MENU1 130 #define IDI_ICON1 133 #define IDR_MAINFRAME 133 #define IDB_ABOUT_BITMAP 134 + #define IDC_STAYAWAKE_KEY_LABEL 1001 -#define IDC_STAYAWAKE_KEY_LIST 1002 +#define IDC_STAYAWAKE_KEY_SELECT_BTN 1002 #define IDC_STAYAWAKE_INTERVAL_MIN 1011 #define IDC_STAYAWAKE_INTERVAL_MAX 1012 #define IDC_STAYAWAKE_SET_INTERVAL_BTN 1013 #define IDC_STAYAWAKE_LAST_EVENT 1014 #define IDC_STAYAWAKE_NEXT_EVENT 1015 +#define IDC_STAYAWAKE_NEXT_KEYCODE 1016 #define IDC_STAYAWAKE_PAUSE_RESUME_BTN 1021 #define IDC_MINIMIZE 1022 #define IDC_EXIT 1023 #define IDC_START_MINIMIZED 1024 #define IDC_ABOUT_BUTTON 1025 -#define IDC_ABOUT_NAME 1031 -#define IDC_ABOUT_VERSION 1032 -#define IDC_ABOUT_BUILD_TIME 1033 -#define IDC_ABOUT_ATTRIBUTION 1034 -#define IDC_ABOUT_PROD_URL 1035 + +#define IDC_KEY_SCROLL_LOCK 1051 +#define IDC_KEY_VOLUME_UP_DOWN 1052 +#define IDC_KEY_UNASSIGNED_1 1053 +#define IDC_KEY_UNASSIGNED_2 1054 +#define IDC_KEY_UNASSIGNED_3 1055 +#define IDC_KEY_UNASSIGNED_4 1056 +#define IDC_KEY_UNASSIGNED_5 1057 +#define IDC_KEY_UNASSIGNED_6 1058 +#define IDC_KEY_UNASSIGNED_7 1059 +#define IDC_KEY_UNASSIGNED_8 1060 +#define IDC_KEY_UNASSIGNED_9 1061 +#define IDC_KEY_UNASSIGNED_10 1062 +#define IDC_KEY_SELECT_ALL_BTN 1071 +#define IDC_KEY_SELECT_NONE_BTN 1072 +#define IDC_KEY_SELECT_APPLY_BTN 1073 + +#define IDC_ABOUT_NAME 1101 +#define IDC_ABOUT_VERSION 1102 +#define IDC_ABOUT_BUILD_TIME 1103 +#define IDC_ABOUT_ATTRIBUTION 1104 +#define IDC_ABOUT_PROD_URL 1105 + #define IDM_EXIT 32771 #define IDM_RESTORE 32772 @@ -37,6 +58,6 @@ #define _APS_NEXT_RESOURCE_VALUE 135 #define _APS_NEXT_COMMAND_VALUE 32773 #define _APS_NEXT_CONTROL_VALUE 1026 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_SYMED_VALUE 106 #endif #endif From f2223b58f0b04259cf1e723996b404462d1f3a2a Mon Sep 17 00:00:00 2001 From: Shridhar Kumar <45252729+shriprem@users.noreply.github.com> Date: Sat, 19 Sep 2026 13:39:45 -0400 Subject: [PATCH 2/3] Use random key simulations roster: Review & Optimize R1 --- StayAwake/SelectKeyCodesDlg.cpp | 42 ++++----------- StayAwake/SelectKeyCodesDlg.h | 2 +- StayAwake/StayAwake.h | 2 +- StayAwake/StayAwake.rc | Bin 18424 -> 8932 bytes StayAwake/StayAwakeDlg.cpp | 88 +++++++++++++++++++------------- StayAwake/StayAwakeDlg.h | 18 ++++--- StayAwake/resource.h | 27 +++++----- 7 files changed, 90 insertions(+), 89 deletions(-) diff --git a/StayAwake/SelectKeyCodesDlg.cpp b/StayAwake/SelectKeyCodesDlg.cpp index 185078e..6224f4c 100644 --- a/StayAwake/SelectKeyCodesDlg.cpp +++ b/StayAwake/SelectKeyCodesDlg.cpp @@ -29,7 +29,7 @@ void CSelectKeyCodesDlg::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CSelectKeyCodesDlg, CDialogEx) - ON_BN_CLICKED(IDC_KEY_SELECT_APPLY_BTN, &CSelectKeyCodesDlg::OnBnClickedApply) + ON_BN_CLICKED(IDC_KEY_SELECT_APPLY_BTN, &CSelectKeyCodesDlg::OnOK) ON_BN_CLICKED(IDC_KEY_SELECT_ALL_BTN, &CSelectKeyCodesDlg::OnClickedKeySelectAllBtn) ON_BN_CLICKED(IDC_KEY_SELECT_NONE_BTN, &CSelectKeyCodesDlg::OnClickedKeySelectNoneBtn) END_MESSAGE_MAP() @@ -47,26 +47,16 @@ BOOL CSelectKeyCodesDlg::OnInitDialog() return TRUE; // return TRUE unless you set the focus to a control } -void CSelectKeyCodesDlg::OnBnClickedApply() +void CSelectKeyCodesDlg::OnOK() { wstring sSelectedKeyCodes{}; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_SCROLL_LOCK)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_VOLUME_UP_DOWN)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_1)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_2)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_3)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_4)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_5)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_6)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_7)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_8)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_9)) ? L"1" : L"0"; - sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_UNASSIGNED_10)) ? L"1" : L"0"; - - if (sSelectedKeyCodes == L"000000000000") + for (int i{}; i < LEN_KEYCODES_ROSTER; i++) + sSelectedKeyCodes += (IsDlgButtonChecked(IDC_KEY_SCROLL_LOCK + i)) ? L"1" : L"0"; + + if (sSelectedKeyCodes == wstring(LEN_KEYCODES_ROSTER, L'0')) { - MessageBox(L"Please select at least one Key Simulation", L"Select Key Simulations", MB_ICONERROR); + MessageBox(L"Please select at least one Key Simulation", L"Select multiple Key Codes", MB_ICONERROR); return; } @@ -77,26 +67,16 @@ void CSelectKeyCodesDlg::OnBnClickedApply() void CSelectKeyCodesDlg::CheckAllBoxes(const wstring& sSelectedKeyCodes) { - CheckDlgButton(IDC_KEY_SCROLL_LOCK, sSelectedKeyCodes.substr(0, 1) == L"1"); - CheckDlgButton(IDC_KEY_VOLUME_UP_DOWN, sSelectedKeyCodes.substr(1, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_1, sSelectedKeyCodes.substr(2, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_2, sSelectedKeyCodes.substr(3, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_3, sSelectedKeyCodes.substr(4, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_4, sSelectedKeyCodes.substr(5, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_5, sSelectedKeyCodes.substr(6, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_6, sSelectedKeyCodes.substr(7, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_7, sSelectedKeyCodes.substr(8, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_8, sSelectedKeyCodes.substr(9, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_9, sSelectedKeyCodes.substr(10, 1) == L"1"); - CheckDlgButton(IDC_KEY_UNASSIGNED_10, sSelectedKeyCodes.substr(11, 1) == L"1"); + for (int i{}; i < LEN_KEYCODES_ROSTER; i++) + CheckDlgButton(IDC_KEY_SCROLL_LOCK + i, sSelectedKeyCodes.at(i) == L'1'); } void CSelectKeyCodesDlg::OnClickedKeySelectAllBtn() { - CheckAllBoxes(L"111111111111"); + CheckAllBoxes(wstring(LEN_KEYCODES_ROSTER, L'1')); } void CSelectKeyCodesDlg::OnClickedKeySelectNoneBtn() { - CheckAllBoxes(L"000000000000"); + CheckAllBoxes(wstring(LEN_KEYCODES_ROSTER, L'0')); } diff --git a/StayAwake/SelectKeyCodesDlg.h b/StayAwake/SelectKeyCodesDlg.h index 24ba14a..ac6cc26 100644 --- a/StayAwake/SelectKeyCodesDlg.h +++ b/StayAwake/SelectKeyCodesDlg.h @@ -23,7 +23,7 @@ class CSelectKeyCodesDlg : public CDialogEx virtual BOOL OnInitDialog(); afx_msg void OnClickedKeySelectAllBtn(); afx_msg void OnClickedKeySelectNoneBtn(); - afx_msg void OnBnClickedApply(); + afx_msg void OnOK(); DECLARE_MESSAGE_MAP() diff --git a/StayAwake/StayAwake.h b/StayAwake/StayAwake.h index 47531e0..1bc8e1b 100644 --- a/StayAwake/StayAwake.h +++ b/StayAwake/StayAwake.h @@ -6,7 +6,7 @@ #include "resource.h" -#define LAST_CODE_UPDATE_TIME "Sep 19 2026 - 10:11:12" +#define LAST_CODE_UPDATE_TIME "Sep 19 2026 - 13:33:42" class CStayAwakeApp : public CWinApp { diff --git a/StayAwake/StayAwake.rc b/StayAwake/StayAwake.rc index 07b2518137f531dd40eafe034a3d835c9886ea31..8d85390928d237a006442e37e85e096dcb898520 100644 GIT binary patch literal 8932 zcmc&)eQ%pc6aU|zVjn75t&VfRFL8W2orGcIB4e;vaFa)o5V1*uiopWhHm830n_XUQ zNNS%Fo!hi#*`3$l%71eM|EGdSr-8$rUF*P&-Yv1rg zCAqjjvr^QDINGB0$wL;tu~c2wYz3o!sX;FKLkMD4GOGH@m}8};Q|iW#Ui!_8sZt-j zaN|GJ-ntJzKxy`>v;xeHlX%UH@P-OfOYaY*ZCLcpO^R^%82HH(`e=tf1pr9_2g#?> zj0rf}e?b4soW1!dUEhGCiD8>Eb`(wfgns@+^_P}p&K#`UpE{bP&unRi5&Z%~GfgF* zc|`1KeZa8^W6|oSw>58upc-5#raEFBK%FU`sd@*&r-t@Bf$Lyh>2&%p%>^4Bx-JLW zU3?dE8M!KqxH{&z`V$3biSk@?%0G;qitc}+^1;KxJ2Ql$1eRscl zy?EW{ID{Y%g;Dr>YcBORERKp)nY7c*y&115Ir;&Tz$V_0xG=%f4z^osq>6QF0l-?}l6`a*wHr!QHSsZMQbHeS5qN5BStt{7 zU#fU0fp}gd96$nW%MmZ|)+yTVgVf&z9_r4$XC#BW67+JZa=JHW(;32q8l$ZTHO zZjNt>V;Y1Ov#A9z9Izl7Q_wR%n#Up3UHBo8+ai|j5%C~RZju}pMI7>j5ibe=R7L|U zv|3h?m`7~xK2-&I8hMyZ0VDk*^(n1v2%~d2C3Uy^STzi=^k}hKnb^s$Dl0&wJogLnzU6voT z*jal;ocwSF8^3D<8aZzG zth-x458|HEbeH^baq;M6Z_zHvqkWOLYHy)FWsm zWk5&42j*14FgMe$1z5(>X1`7w61TF*C%&RRwFRjtNq#6%}mjJv2UVHZX%!Q>b|$ zWMNNkLW7(~;}ZR*I{RD>i&xpnk4}f~MsxPmfTqu)7@uThn1Se$w&uqx0v)jK3xiUo zLoVX5U%HolVQgB@6E83;y!c=AI%!`%YXdo&bPJ8nvh7*5I`TGAb86*4p*l*H?a~wG zzYA;^UbxS-fNm!=Q$@sDs+F`^^Yu8%RqrWS=n~b!3&fdTl14Gjv27n!SDJxlD4FJ6>#QkINOSm9jAl1?cXuvr%lGcLyZ4eX+c6-^y$?Jl zCxMo?K7&?>hHLu^6>b{Jh^vG|T=(eWfHp?5AU#MkzrLY;+if5C^QGHN(DDsG)MkM7 zU)<;q%KNG8M*rvrvUy!u{$fILqj_*i*?8NynrzHyUP!*dojBbifSqfs5>Q=wFPdp-1ULpb|AalwcVzDF7H|B4Qn1jFwqqO;p9i4vw Df1>Yv literal 18424 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 bB)z8&qfY0ijDd5{=!7H@{|z%+MNj_&g%JH) diff --git a/StayAwake/StayAwakeDlg.cpp b/StayAwake/StayAwakeDlg.cpp index e1c014b..4982f03 100644 --- a/StayAwake/StayAwakeDlg.cpp +++ b/StayAwake/StayAwakeDlg.cpp @@ -7,9 +7,6 @@ #include "afxdialogex.h" #include "Utils.h" -#include -#include - #ifdef _DEBUG #define new DEBUG_NEW #endif @@ -28,15 +25,27 @@ void CStayAwakeDlg::DoDataExchange(CDataExchange* pDX) wstring CStayAwakeDlg::GetSelectedKeyCodes() { - const int bufSize{ LEN_SELECTED_KEYCODES + 1 }; - wstring sBuf(bufSize, '\0'); + const int bufSize{ LEN_KEYCODES_ROSTER + 1 }; + wchar_t sBuf[bufSize]{}; + + GetPrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, L"N/A", sBuf, bufSize, PREF_INI_FILE); - GetPrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, DEF_SELECTED_KEYCODES, sBuf.data(), bufSize, PREF_INI_FILE); + wstring sKeyCodes{ sBuf }; - // Remove \0s from buffer string - wstring sKeyCodes{ sBuf.c_str() }; + if (sKeyCodes == L"N/A") { + UINT nLegacyKeyCode = GetPrivateProfileInt(PREF_DEFAULTS, PREF_LEGACY_KEYCODE, 99, PREF_INI_FILE); - if (!CheckSelectedKeyCodes(sKeyCodes)) + if (nLegacyKeyCode == 99) + sKeyCodes = DEF_SELECTED_KEYCODES; + else + { + sKeyCodes = wstring(LEN_KEYCODES_ROSTER, L'0'); + sKeyCodes.replace(nLegacyKeyCode % 12, 1, L"1"); + } + + SaveSelectedKeyCodes(sKeyCodes); + } + else if (!CheckSelectedKeyCodes(sKeyCodes)) { sKeyCodes = DEF_SELECTED_KEYCODES; SaveSelectedKeyCodes(sKeyCodes); @@ -45,18 +54,17 @@ wstring CStayAwakeDlg::GetSelectedKeyCodes() return sKeyCodes; } -BOOL CStayAwakeDlg::CheckSelectedKeyCodes(wstring sKeyCodes) +bool CStayAwakeDlg::CheckSelectedKeyCodes(wstring sKeyCodes) { - return (sKeyCodes.length() == LEN_SELECTED_KEYCODES && - sKeyCodes != L"000000000000" && - regex_match(sKeyCodes, std::wregex(L"(0|1){12}"))); + return (sKeyCodes.length() == LEN_KEYCODES_ROSTER && + sKeyCodes != wstring(LEN_KEYCODES_ROSTER, L'0') && + sKeyCodes.find_first_not_of(L"01") == std::string::npos); } -BOOL CStayAwakeDlg::SaveSelectedKeyCodes(wstring sKeyCodes) +void CStayAwakeDlg::SaveSelectedKeyCodes(wstring sKeyCodes) { - if (!CheckSelectedKeyCodes(sKeyCodes)) return FALSE; - - return WritePrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, sKeyCodes.c_str(), PREF_INI_FILE); + if (CheckSelectedKeyCodes(sKeyCodes)) + WritePrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, sKeyCodes.c_str(), PREF_INI_FILE); } BEGIN_MESSAGE_MAP(CStayAwakeDlg, CDialogEx) @@ -72,7 +80,7 @@ BEGIN_MESSAGE_MAP(CStayAwakeDlg, CDialogEx) ON_WM_TIMER() ON_BN_CLICKED(IDC_MINIMIZE, &CStayAwakeDlg::OnMinimize) ON_BN_CLICKED(IDC_EXIT, &CStayAwakeDlg::OnExit) - ON_BN_CLICKED(IDC_STAYAWAKE_KEY_SELECT_BTN, &CStayAwakeDlg::OnClickedStayawakeKeySelectBtn) + ON_BN_CLICKED(IDC_STAYAWAKE_KEYS_ROSTER_BTN, &CStayAwakeDlg::OnSetupKeyCodesRosterClicked) ON_BN_CLICKED(IDC_STAYAWAKE_SET_INTERVAL_BTN, &CStayAwakeDlg::OnSetInterval) ON_EN_KILLFOCUS(IDC_STAYAWAKE_INTERVAL_MIN, &CStayAwakeDlg::OnKillfocusIntervalMin) ON_EN_KILLFOCUS(IDC_STAYAWAKE_INTERVAL_MAX, &CStayAwakeDlg::OnKillfocusIntervalMax) @@ -229,11 +237,15 @@ void CStayAwakeDlg::OnKillfocusIntervalMax() } -void CStayAwakeDlg::OnClickedStayawakeKeySelectBtn() +void CStayAwakeDlg::OnSetupKeyCodesRosterClicked() { CSelectKeyCodesDlg dlgSelectKeyCodes; - dlgSelectKeyCodes.DoModal(); - SimulateAwakeKeyPress(); + + if (dlgSelectKeyCodes.DoModal() == IDOK) + { + InitRoster(); + SimulateAwakeKeyPress(); + } } void CStayAwakeDlg::OnTimer(UINT_PTR nIDEvent) @@ -263,8 +275,22 @@ void CStayAwakeDlg::InitIntervals() m_IntervalMaxSeconds = (nIntervalMin >= nIntervalMax) ? nIntervalMin : nIntervalMax; } +void CStayAwakeDlg::InitRoster() +{ + wstring sSelectedKeyCodes{ GetSelectedKeyCodes() }; + + m_RosterLength = 0; + + for (int i{}; i < LEN_KEYCODES_ROSTER; i++) + { + if (sSelectedKeyCodes.at(i) == L'1') + m_RosterKeyCodes[m_RosterLength++] = i; + } +} + void CStayAwakeDlg::InitAwakes() { + InitRoster(); SimulateAwakeKeyPress(); SetDlgItemText(IDC_STAYAWAKE_PAUSE_RESUME_BTN, BTN_TEXT_PAUSE); @@ -329,20 +355,9 @@ void CStayAwakeDlg::OnDestroy() void CStayAwakeDlg::SimulateAwakeKeyPress() { - wstring sSelectedKeyCodes{ GetSelectedKeyCodes() }; + if (!m_RosterLength) return; - std::vector vKeys{}; - vKeys.resize(LEN_SELECTED_KEYCODES); - - int nIndex{}; - - for (int i{}; i < LEN_SELECTED_KEYCODES; i++) - { - if (sSelectedKeyCodes.substr(i, 1) == L"1") - vKeys[nIndex++] = i; - } - - UINT nAwakeKeyCode{ vKeys[rand() % nIndex] }; + UINT nAwakeKeyCode{ m_RosterKeyCodes[rand() % m_RosterLength] }; wstring sAwakeKeyCode{}; switch (nAwakeKeyCode) @@ -392,6 +407,7 @@ void CStayAwakeDlg::SimulateAwakeKeyPress() SYSTEMTIME lastTime{}; GetLocalTime(&lastTime); SetDlgItemText(IDC_STAYAWAKE_LAST_EVENT, Utils::formatSystemTime(lastTime, L"Last StayAwake event").c_str()); + SetDlgItemText(IDC_STAYAWAKE_LAST_KEYCODE, (L"[" + sAwakeKeyCode + L"]").c_str()); UINT nTimerSeconds{ m_IntervalMinSeconds }; if (m_IntervalMinSeconds != m_IntervalMaxSeconds) @@ -403,7 +419,6 @@ void CStayAwakeDlg::SimulateAwakeKeyPress() GetSystemTime(&nextTime); Utils::addSecondsToTime(nextTime, nTimerSeconds); SetDlgItemText(IDC_STAYAWAKE_NEXT_EVENT, Utils::formatSystemTime(nextTime, L"Next StayAwake event").c_str()); - SetDlgItemText(IDC_STAYAWAKE_NEXT_KEYCODE, (L"[" + sAwakeKeyCode + L"]").c_str()); } @@ -425,7 +440,8 @@ void CStayAwakeDlg::OnSetInterval() WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MINIMUM, to_wstring(m_IntervalMinSeconds).c_str(), PREF_INI_FILE); WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MAXIMUM, to_wstring(m_IntervalMaxSeconds).c_str(), PREF_INI_FILE); - InitAwakes(); + InitRoster(); + SimulateAwakeKeyPress(); } diff --git a/StayAwake/StayAwakeDlg.h b/StayAwake/StayAwakeDlg.h index 8dc4a8e..8c0e7db 100644 --- a/StayAwake/StayAwakeDlg.h +++ b/StayAwake/StayAwakeDlg.h @@ -13,7 +13,7 @@ constexpr auto BTN_TEXT_PAUSE = L"&Pause"; constexpr auto BTN_TEXT_RESUME = L"&Resume"; constexpr auto PREF_INI_FILE = L".\\StayAwake.ini"; constexpr auto PREF_DEFAULTS = L"Defaults"; -constexpr auto PREF_AWAKE_KEYCODE = L"AwakeKeyCode"; +constexpr auto PREF_LEGACY_KEYCODE = L"AwakeKeyCode"; constexpr auto PREF_SELECTED_KEYCODES = L"SelectedKeyCodes"; constexpr auto PREF_AWAKE_PAUSED = L"AwakePaused"; constexpr auto PREF_START_MINIMIZED = L"StartMinimized"; @@ -26,8 +26,8 @@ constexpr auto MIN_PERIOD{ 10 }; constexpr auto MAX_PERIOD{ 9990 }; constexpr auto DEF_PERIOD{ 240 }; -constexpr auto LEN_SELECTED_KEYCODES{ 12 }; -constexpr auto DEF_SELECTED_KEYCODES{ L"001111111111" }; +constexpr auto LEN_KEYCODES_ROSTER{ 12 }; +constexpr auto DEF_SELECTED_KEYCODES = L"001111111111"; const wstring MIN_MAX_PERIOD = to_wstring(MIN_PERIOD) + L" and " + to_wstring(MAX_PERIOD); const wstring INTERVAL_TOOLTIP = L"Number between " + MIN_MAX_PERIOD; @@ -49,8 +49,8 @@ class CStayAwakeDlg : public CDialogEx public: static wstring GetSelectedKeyCodes(); - static BOOL CheckSelectedKeyCodes(wstring sKeyCodes); - static BOOL SaveSelectedKeyCodes(wstring sKeyCodes); + static bool CheckSelectedKeyCodes(wstring sKeyCodes); + static void SaveSelectedKeyCodes(wstring sKeyCodes); protected: HICON m_hIcon; @@ -62,15 +62,20 @@ class CStayAwakeDlg : public CDialogEx private: bool m_bMinimized{}; UINT_PTR m_TimerID{42}; + + UINT m_RosterKeyCodes[LEN_KEYCODES_ROSTER]{}; + UINT m_RosterLength{}; + UINT m_IntervalMinSeconds{}; UINT m_IntervalMaxSeconds{}; + NOTIFYICONDATA m_TrayData{}; CMenu m_menu; afx_msg LRESULT OnPostOpen(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnRestoreDialog(WPARAM wParam, LPARAM lParam); - afx_msg void OnClickedStayawakeKeySelectBtn(); + afx_msg void OnSetupKeyCodesRosterClicked(); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnKillfocusIntervalMin(); afx_msg void OnKillfocusIntervalMax(); @@ -86,6 +91,7 @@ class CStayAwakeDlg : public CDialogEx afx_msg void OnStartMinimized(); void InitIntervals(); + void InitRoster(); void InitAwakes(); void InitTrayIcon(); void MinimizeToTray(); diff --git a/StayAwake/resource.h b/StayAwake/resource.h index 9c63835..2a41e31 100644 --- a/StayAwake/resource.h +++ b/StayAwake/resource.h @@ -12,19 +12,18 @@ #define IDR_MAINFRAME 133 #define IDB_ABOUT_BITMAP 134 -#define IDC_STAYAWAKE_KEY_LABEL 1001 -#define IDC_STAYAWAKE_KEY_SELECT_BTN 1002 -#define IDC_STAYAWAKE_INTERVAL_MIN 1011 -#define IDC_STAYAWAKE_INTERVAL_MAX 1012 -#define IDC_STAYAWAKE_SET_INTERVAL_BTN 1013 -#define IDC_STAYAWAKE_LAST_EVENT 1014 -#define IDC_STAYAWAKE_NEXT_EVENT 1015 -#define IDC_STAYAWAKE_NEXT_KEYCODE 1016 -#define IDC_STAYAWAKE_PAUSE_RESUME_BTN 1021 -#define IDC_MINIMIZE 1022 -#define IDC_EXIT 1023 -#define IDC_START_MINIMIZED 1024 -#define IDC_ABOUT_BUTTON 1025 +#define IDC_STAYAWAKE_KEYS_ROSTER_BTN 1001 +#define IDC_STAYAWAKE_INTERVAL_MIN 1002 +#define IDC_STAYAWAKE_INTERVAL_MAX 1003 +#define IDC_STAYAWAKE_SET_INTERVAL_BTN 1004 +#define IDC_STAYAWAKE_LAST_EVENT 1005 +#define IDC_STAYAWAKE_NEXT_EVENT 1006 +#define IDC_STAYAWAKE_LAST_KEYCODE 1007 +#define IDC_STAYAWAKE_PAUSE_RESUME_BTN 1011 +#define IDC_MINIMIZE 1012 +#define IDC_EXIT 1013 +#define IDC_START_MINIMIZED 1014 +#define IDC_ABOUT_BUTTON 1015 #define IDC_KEY_SCROLL_LOCK 1051 #define IDC_KEY_VOLUME_UP_DOWN 1052 @@ -52,7 +51,7 @@ #define IDM_RESTORE 32772 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 135 From 62ae917b18b3166e4efd45322b254eb05b6cb51c Mon Sep 17 00:00:00 2001 From: Shridhar Kumar <45252729+shriprem@users.noreply.github.com> Date: Sat, 19 Sep 2026 17:22:35 -0400 Subject: [PATCH 3/3] Use random key simulations roster: Review & Optimize R2 --- StayAwake/SelectKeyCodesDlg.cpp | 17 ++++++---- StayAwake/SelectKeyCodesDlg.h | 4 ++- StayAwake/StayAwake.cpp | 2 +- StayAwake/StayAwake.h | 3 +- StayAwake/StayAwake.rc | 6 ++-- StayAwake/StayAwakeDlg.cpp | 58 +++++++++++++++++++++------------ StayAwake/StayAwakeDlg.h | 10 +++--- 7 files changed, 64 insertions(+), 36 deletions(-) diff --git a/StayAwake/SelectKeyCodesDlg.cpp b/StayAwake/SelectKeyCodesDlg.cpp index 6224f4c..3106e01 100644 --- a/StayAwake/SelectKeyCodesDlg.cpp +++ b/StayAwake/SelectKeyCodesDlg.cpp @@ -5,15 +5,16 @@ #include "StayAwake.h" #include "afxdialogex.h" #include "SelectKeyCodesDlg.h" -#include "StayAwakeDlg.h" +static_assert(IDC_KEY_UNASSIGNED_10 - IDC_KEY_SCROLL_LOCK + 1 == LEN_KEYCODES_ROSTER, "Roster checkbox IDs must be consecutive"); // CSelectKeyCodesDlg dialog IMPLEMENT_DYNAMIC(CSelectKeyCodesDlg, CDialogEx) -CSelectKeyCodesDlg::CSelectKeyCodesDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_SELECT_KEYCODES_DIALOG, pParent) +CSelectKeyCodesDlg::CSelectKeyCodesDlg(CStayAwakeDlg* pCaller) + : CDialogEx(IDD_SELECT_KEYCODES_DIALOG, pCaller) + , m_pCaller(pCaller) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } @@ -42,7 +43,7 @@ BOOL CSelectKeyCodesDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon - CheckAllBoxes(CStayAwakeDlg::GetSelectedKeyCodes()); + CheckAllBoxes(m_pCaller->GetSelectedKeyCodes()); return TRUE; // return TRUE unless you set the focus to a control } @@ -56,11 +57,15 @@ void CSelectKeyCodesDlg::OnOK() if (sSelectedKeyCodes == wstring(LEN_KEYCODES_ROSTER, L'0')) { - MessageBox(L"Please select at least one Key Simulation", L"Select multiple Key Codes", MB_ICONERROR); + MessageBox(L"Please select at least one Key Code", L"Select multiple Key Codes", MB_ICONEXCLAMATION); return; } - CStayAwakeDlg::SaveSelectedKeyCodes(sSelectedKeyCodes); + if (!m_pCaller->SaveSelectedKeyCodes(sSelectedKeyCodes)) + { + MessageBox(L"Unable to save to the StayAwake.ini file.", L"Select multiple Key Codes", MB_ICONEXCLAMATION); + return; + } CDialogEx::OnOK(); } diff --git a/StayAwake/SelectKeyCodesDlg.h b/StayAwake/SelectKeyCodesDlg.h index ac6cc26..2a23998 100644 --- a/StayAwake/SelectKeyCodesDlg.h +++ b/StayAwake/SelectKeyCodesDlg.h @@ -1,13 +1,14 @@ #pragma once #include "Utils.h" +#include "StayAwakeDlg.h" class CSelectKeyCodesDlg : public CDialogEx { DECLARE_DYNAMIC(CSelectKeyCodesDlg) public: - CSelectKeyCodesDlg(CWnd* pParent = nullptr); // standard constructor + explicit CSelectKeyCodesDlg(CStayAwakeDlg* pCaller); virtual ~CSelectKeyCodesDlg(); // Dialog Data @@ -16,6 +17,7 @@ class CSelectKeyCodesDlg : public CDialogEx #endif protected: + CStayAwakeDlg* m_pCaller; HICON m_hIcon; virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support diff --git a/StayAwake/StayAwake.cpp b/StayAwake/StayAwake.cpp index 4b3438b..05b9caf 100644 --- a/StayAwake/StayAwake.cpp +++ b/StayAwake/StayAwake.cpp @@ -36,7 +36,7 @@ BOOL CStayAwakeApp::InitInstance() CStayAwakeDlg dlg; m_pMainWnd = &dlg; - INT_PTR nResponse = dlg.DoModal(); + dlg.DoModal(); #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) ControlBarCleanUp(); diff --git a/StayAwake/StayAwake.h b/StayAwake/StayAwake.h index 1bc8e1b..dbb9e9f 100644 --- a/StayAwake/StayAwake.h +++ b/StayAwake/StayAwake.h @@ -6,7 +6,8 @@ #include "resource.h" -#define LAST_CODE_UPDATE_TIME "Sep 19 2026 - 13:33:42" +constexpr auto LAST_CODE_UPDATE_TIME = "Sep 19 2026 - 17:20:42"; + class CStayAwakeApp : public CWinApp { diff --git a/StayAwake/StayAwake.rc b/StayAwake/StayAwake.rc index 8d85390..c75652b 100644 --- a/StayAwake/StayAwake.rc +++ b/StayAwake/StayAwake.rc @@ -75,8 +75,8 @@ CAPTION "About StayAwake" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDR_MAINFRAME,IDC_STATIC,12,14,21,20 - CTEXT "StayAwake via Scroll Lock Toggling",IDC_ABOUT_NAME,39,14,111,8,SS_NOPREFIX - CTEXT "Copyright (C) Shridhar Kumar, 2025",IDC_ABOUT_ATTRIBUTION,18,54,154,8 + CTEXT "StayAwake",IDC_ABOUT_NAME,39,14,111,8,SS_NOPREFIX + CTEXT "Copyright (C) Shridhar Kumar, 2026",IDC_ABOUT_ATTRIBUTION,18,54,154,8 DEFPUSHBUTTON "OK",IDOK,70,81,50,14,WS_GROUP CTEXT "Version 1.0.0.1",IDC_ABOUT_VERSION,39,26,111,8 CTEXT "Last code update:",IDC_ABOUT_BUILD_TIME,19,38,151,8 @@ -96,7 +96,7 @@ BEGIN EDITTEXT IDC_STAYAWAKE_INTERVAL_MAX,102,52,27,13,ES_NUMBER PUSHBUTTON "Set &Timer",IDC_STAYAWAKE_SET_INTERVAL_BTN,132,32,60,34 RTEXT "",IDC_STAYAWAKE_LAST_EVENT,1,74,143,8 - LTEXT "",IDC_STAYAWAKE_LAST_KEYCODE,103,82,95,8 + RTEXT "",IDC_STAYAWAKE_LAST_KEYCODE,1,82,143,8 RTEXT "",IDC_STAYAWAKE_NEXT_EVENT,1,93,143,8 PUSHBUTTON "&Pause",IDC_STAYAWAKE_PAUSE_RESUME_BTN,16,110,50,14 PUSHBUTTON "Minimi&ze",IDC_MINIMIZE,74,110,50,14 diff --git a/StayAwake/StayAwakeDlg.cpp b/StayAwake/StayAwakeDlg.cpp index 4982f03..3947d65 100644 --- a/StayAwake/StayAwakeDlg.cpp +++ b/StayAwake/StayAwakeDlg.cpp @@ -7,6 +7,9 @@ #include "afxdialogex.h" #include "Utils.h" +#include +#pragma comment(lib, "Pathcch.lib") + #ifdef _DEBUG #define new DEBUG_NEW #endif @@ -28,21 +31,22 @@ wstring CStayAwakeDlg::GetSelectedKeyCodes() const int bufSize{ LEN_KEYCODES_ROSTER + 1 }; wchar_t sBuf[bufSize]{}; - GetPrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, L"N/A", sBuf, bufSize, PREF_INI_FILE); + GetPrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, L"N/A", sBuf, bufSize, m_IniFilePath); wstring sKeyCodes{ sBuf }; if (sKeyCodes == L"N/A") { - UINT nLegacyKeyCode = GetPrivateProfileInt(PREF_DEFAULTS, PREF_LEGACY_KEYCODE, 99, PREF_INI_FILE); + UINT nLegacyKeyCode = GetPrivateProfileInt(PREF_DEFAULTS, PREF_LEGACY_KEYCODE, 99, m_IniFilePath); if (nLegacyKeyCode == 99) sKeyCodes = DEF_SELECTED_KEYCODES; else { sKeyCodes = wstring(LEN_KEYCODES_ROSTER, L'0'); - sKeyCodes.replace(nLegacyKeyCode % 12, 1, L"1"); + sKeyCodes.replace(nLegacyKeyCode % LEN_KEYCODES_ROSTER, 1, L"1"); } + WritePrivateProfileString(PREF_DEFAULTS, PREF_LEGACY_KEYCODE, nullptr, m_IniFilePath); SaveSelectedKeyCodes(sKeyCodes); } else if (!CheckSelectedKeyCodes(sKeyCodes)) @@ -61,10 +65,10 @@ bool CStayAwakeDlg::CheckSelectedKeyCodes(wstring sKeyCodes) sKeyCodes.find_first_not_of(L"01") == std::string::npos); } -void CStayAwakeDlg::SaveSelectedKeyCodes(wstring sKeyCodes) +bool CStayAwakeDlg::SaveSelectedKeyCodes(wstring sKeyCodes) { - if (CheckSelectedKeyCodes(sKeyCodes)) - WritePrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, sKeyCodes.c_str(), PREF_INI_FILE); + return CheckSelectedKeyCodes(sKeyCodes) && + WritePrivateProfileString(PREF_DEFAULTS, PREF_SELECTED_KEYCODES, sKeyCodes.c_str(), m_IniFilePath); } BEGIN_MESSAGE_MAP(CStayAwakeDlg, CDialogEx) @@ -121,6 +125,7 @@ BOOL CStayAwakeDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon + InitConfigFilePath(); InitIntervals(); SetDlgItemInt(IDC_STAYAWAKE_INTERVAL_MIN, m_IntervalMinSeconds, FALSE); SetDlgItemInt(IDC_STAYAWAKE_INTERVAL_MAX, m_IntervalMaxSeconds, FALSE); @@ -239,12 +244,12 @@ void CStayAwakeDlg::OnKillfocusIntervalMax() void CStayAwakeDlg::OnSetupKeyCodesRosterClicked() { - CSelectKeyCodesDlg dlgSelectKeyCodes; + CSelectKeyCodesDlg dlgSelectKeyCodes(this); if (dlgSelectKeyCodes.DoModal() == IDOK) { InitRoster(); - SimulateAwakeKeyPress(); + if (!IsTimerPaused()) SimulateAwakeKeyPress(); } } @@ -255,19 +260,33 @@ void CStayAwakeDlg::OnTimer(UINT_PTR nIDEvent) } +void CStayAwakeDlg::InitConfigFilePath() +{ + DWORD size = GetModuleFileNameW(nullptr, m_IniFilePath, MAX_PATH); + + if (size > 0 && size < MAX_PATH && + SUCCEEDED(PathCchRemoveFileSpec(m_IniFilePath, MAX_PATH)) && + SUCCEEDED(PathCchAppend(m_IniFilePath, MAX_PATH, PREF_INI_FILE))) + return; + + wcscpy_s(m_IniFilePath, MAX_PATH, L".\\"); // last resort: working directory + wcscat_s(m_IniFilePath, MAX_PATH, PREF_INI_FILE); +} + + void CStayAwakeDlg::InitIntervals() { int nIntervalLegacy{}, nIntervalMin{}, nIntervalMax{}; - nIntervalLegacy = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_LEGACY, DEF_PERIOD, PREF_INI_FILE); + nIntervalLegacy = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_LEGACY, DEF_PERIOD, m_IniFilePath); if (nIntervalLegacy < MIN_PERIOD || nIntervalLegacy > MAX_PERIOD) nIntervalLegacy = DEF_PERIOD; - nIntervalMin = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_MINIMUM, nIntervalLegacy, PREF_INI_FILE); + nIntervalMin = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_MINIMUM, nIntervalLegacy, m_IniFilePath); if (nIntervalMin < MIN_PERIOD || nIntervalMin > MAX_PERIOD) nIntervalMin = DEF_PERIOD; - nIntervalMax = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_MAXIMUM, nIntervalLegacy, PREF_INI_FILE); + nIntervalMax = GetPrivateProfileInt(PREF_DEFAULTS, PREF_INTERVAL_MAXIMUM, nIntervalLegacy, m_IniFilePath); if (nIntervalMax < MIN_PERIOD || nIntervalMax > MAX_PERIOD) nIntervalMax = DEF_PERIOD; @@ -294,7 +313,7 @@ void CStayAwakeDlg::InitAwakes() SimulateAwakeKeyPress(); SetDlgItemText(IDC_STAYAWAKE_PAUSE_RESUME_BTN, BTN_TEXT_PAUSE); - WritePrivateProfileString(PREF_DEFAULTS, PREF_AWAKE_PAUSED, L"N", PREF_INI_FILE); + WritePrivateProfileString(PREF_DEFAULTS, PREF_AWAKE_PAUSED, L"N", m_IniFilePath); } void CStayAwakeDlg::InitTrayIcon() @@ -355,7 +374,7 @@ void CStayAwakeDlg::OnDestroy() void CStayAwakeDlg::SimulateAwakeKeyPress() { - if (!m_RosterLength) return; + if (!m_RosterLength) InitRoster(); UINT nAwakeKeyCode{ m_RosterKeyCodes[rand() % m_RosterLength] }; wstring sAwakeKeyCode{}; @@ -437,11 +456,10 @@ void CStayAwakeDlg::OnSetInterval() SetDlgItemInt(IDC_STAYAWAKE_INTERVAL_MAX, m_IntervalMaxSeconds, FALSE); } - WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MINIMUM, to_wstring(m_IntervalMinSeconds).c_str(), PREF_INI_FILE); - WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MAXIMUM, to_wstring(m_IntervalMaxSeconds).c_str(), PREF_INI_FILE); + WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MINIMUM, to_wstring(m_IntervalMinSeconds).c_str(), m_IniFilePath); + WritePrivateProfileString(PREF_DEFAULTS, PREF_INTERVAL_MAXIMUM, to_wstring(m_IntervalMaxSeconds).c_str(), m_IniFilePath); - InitRoster(); - SimulateAwakeKeyPress(); + InitAwakes(); } @@ -462,7 +480,7 @@ void CStayAwakeDlg::OnPauseResume() KillTimer(m_TimerID); SetDlgItemText(IDC_STAYAWAKE_PAUSE_RESUME_BTN, BTN_TEXT_RESUME); - WritePrivateProfileString(PREF_DEFAULTS, PREF_AWAKE_PAUSED, L"Y", PREF_INI_FILE); + WritePrivateProfileString(PREF_DEFAULTS, PREF_AWAKE_PAUSED, L"Y", m_IniFilePath); ShowPausedInfo(false); } } @@ -472,7 +490,7 @@ wstring CStayAwakeDlg::GetPreference(wstring key, wstring defaultVal) const int bufSize{ MAX_PATH }; wstring ftBuf(bufSize, '\0'); - GetPrivateProfileString(PREF_DEFAULTS, key.c_str(), defaultVal.c_str(), ftBuf.data(), bufSize, PREF_INI_FILE); + GetPrivateProfileString(PREF_DEFAULTS, key.c_str(), defaultVal.c_str(), ftBuf.data(), bufSize, m_IniFilePath); return wstring{ ftBuf.c_str() }; } @@ -493,5 +511,5 @@ void CStayAwakeDlg::ShowPausedInfo(bool both) void CStayAwakeDlg::OnStartMinimized() { WritePrivateProfileString(PREF_DEFAULTS, PREF_START_MINIMIZED, - (IsDlgButtonChecked(IDC_START_MINIMIZED) == BST_CHECKED) ? L"Y" : L"N", PREF_INI_FILE); + (IsDlgButtonChecked(IDC_START_MINIMIZED) == BST_CHECKED) ? L"Y" : L"N", m_IniFilePath); } diff --git a/StayAwake/StayAwakeDlg.h b/StayAwake/StayAwakeDlg.h index 8c0e7db..06e50eb 100644 --- a/StayAwake/StayAwakeDlg.h +++ b/StayAwake/StayAwakeDlg.h @@ -11,7 +11,7 @@ constexpr auto VK_UNASSIGNED_10 = 0xE8; constexpr auto BTN_TEXT_PAUSE = L"&Pause"; constexpr auto BTN_TEXT_RESUME = L"&Resume"; -constexpr auto PREF_INI_FILE = L".\\StayAwake.ini"; +constexpr auto PREF_INI_FILE = L"StayAwake.ini"; constexpr auto PREF_DEFAULTS = L"Defaults"; constexpr auto PREF_LEGACY_KEYCODE = L"AwakeKeyCode"; constexpr auto PREF_SELECTED_KEYCODES = L"SelectedKeyCodes"; @@ -48,9 +48,9 @@ class CStayAwakeDlg : public CDialogEx public: - static wstring GetSelectedKeyCodes(); - static bool CheckSelectedKeyCodes(wstring sKeyCodes); - static void SaveSelectedKeyCodes(wstring sKeyCodes); + wstring GetSelectedKeyCodes(); + bool CheckSelectedKeyCodes(wstring sKeyCodes); + bool SaveSelectedKeyCodes(wstring sKeyCodes); protected: HICON m_hIcon; @@ -60,6 +60,7 @@ class CStayAwakeDlg : public CDialogEx DECLARE_MESSAGE_MAP() private: + wchar_t m_IniFilePath[MAX_PATH]{}; bool m_bMinimized{}; UINT_PTR m_TimerID{42}; @@ -90,6 +91,7 @@ class CStayAwakeDlg : public CDialogEx afx_msg void OnDestroy(); afx_msg void OnStartMinimized(); + void InitConfigFilePath(); void InitIntervals(); void InitRoster(); void InitAwakes();