8 Commits

Author SHA1 Message Date
ba18587c31 Increased revision. 2022-02-21 17:02:41 +03:00
c6d9f908e5 Fixed donation link. 2022-02-21 16:47:48 +03:00
8fbd6f1bde Cleanup code.
Changed main "ghost" window to a message-only window.
2022-02-21 16:44:06 +03:00
7c73a52f0a Fixed mistake not getting focus when calling manual edit window 2022-02-21 16:10:11 +03:00
05c4ad977b Revert "Fixed warnings"
This reverts commit 7cd58a9a15.
2022-02-21 16:02:40 +03:00
c968b47baf Revert "Added SetForegroundWindow() into WM_INITDIALOG"
This reverts commit 6f6ce164ee.
2022-02-21 16:02:28 +03:00
6f6ce164ee Added SetForegroundWindow() into WM_INITDIALOG 2022-02-19 23:59:24 +03:00
7cd58a9a15 Fixed warnings 2022-02-19 23:12:26 +03:00
15 changed files with 187 additions and 337 deletions

1
.gitignore vendored
View File

@@ -6,7 +6,6 @@
*.user
*.userosscache
*.sln.docstates
[Vv]ersion.h
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

View File

@@ -1,22 +1,12 @@
## wCenterWindow
# wCenterWindow
This program centers the current active window by a ```LCTRL + LWIN + C``` hotkey,
or pressing ```LCTRL + LWIN + MMB``` (Middle Mouse Button).
This program centers the current active window by a `LCTRL + LWIN + C` hotkey,
or pressing `LCTRL + LWIN + MMB` (Middle Mouse Button).
```LCTRL + LWIN + V``` - manual editing of size and position of the window.
`LCTRL + LWIN + V` - manual editing of size and position of the window.
You can use ```LCTRL + LWIN + I``` hotkey for hide/show trayicon.
You can also use commandline option ```/hide``` for hide trayicon at startup.
You can use `LCTRL + LWIN + I` hotkey for hide/show trayicon.
You can also use commandline option `/hide` for hide trayicon at startup.
`Use workarea` option means that the window is centered without a taskbar, otherwise, the full resolution of the monitor will be used.
```Use workarea``` option means that the window is centered without a taskbar, otherwise, the full resolution of the monitor will be used.
If some windows does not centers you should run wCenterWindow with administrative rights.
## Automatic startup
Usually, to start the application when Windows starts, it is enough to put the application's shortcut in the "Startup" folder -\
"C:\Users\[*Your user name*]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup". (The easiest way to get there - press 'WIN + R' and type 'shell:startup').\
However, in this case wCenterWindow will not be able to work with windows that are open with elevated privileges.
And if you enable the "Run as administrator" option in the shortcut, then wCenterWindow will not start. This is related to the security of Windows (maybe only in 10/11, I did not check).\
This behavior can be bypassed by creating a task in the Task Scheduler with the "Run with highest privileges" option.\
**Note:** If you run wCenterWindow via the Task Scheduler, I highly recommend enabling the "Delay task for" option for 15-30 seconds, otherwise you may get an error message "Can't create tray icon".

View File

@@ -1,81 +0,0 @@
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET CURRENT_TIME=%TIME%
SET CURRENT_DATE=%DATE%
SET BUILDTIME=%CURRENT_TIME:~0,8%
SET BUILDDATE=%CURRENT_DATE%
SET BUILD_DATETIME=Build time: %BUILDDATE% %BUILDTIME%
SET CURRENT_YEAR=%CURRENT_DATE:~6,4%
SET BUILDSECS=0
SET GIT_COUNT=0
SET GIT_TIME=0
SET GIT_DATE=0
SET GIT_DATETIME=0
SET VerMajor=0
SET VerMinor=0
SET VerPatch=0
SET INT_NAME=0
SET PN=0
SET VS=0
SET VSF=0
SET PCF=0
SET PYS=0
SET PA=0
CD /D %~dp0
IF NOT EXIST "VersionInfo.h" (
ECHO Can't find file 'VersionInfo.h'
TIMEOUT /T 3
EXIT /B 1
)
COPY /Y "VersionInfo.h" "version.h" >nul
FOR /F "tokens=3" %%A IN ('FINDSTR /I /L /C:"define V_MAJOR" "version.h"') DO (SET "VerMajor=%%A")
FOR /F "tokens=3" %%A IN ('FINDSTR /I /L /C:"define V_MINOR" "version.h"') DO (SET "VerMinor=%%A")
FOR /F "tokens=3" %%A IN ('FINDSTR /I /L /C:"define V_PATCH" "version.h"') DO (SET "VerPatch=%%A")
FOR /F "tokens=3" %%A IN ('FINDSTR /I /L /C:"define PRODUCT_NAME" "version.h"') DO (SET "PN=%%~A")
FOR /F "tokens=3" %%A IN ('FINDSTR /I /L /C:"define PRODUCT_YEAR_START" "version.h"') DO (SET "PYS=%%A")
FOR /F "tokens=2*" %%A IN ('FINDSTR /I /L /C:"define PRODUCT_AUTHORS" "version.h"') DO (SET "PA=%%~B")
FOR /F "tokens=1-4 delims=:., " %%A IN ("%BUILDTIME%") DO (SET /A "BUILDSECS=%%A * 3600 + %%B * 60 + %%C")
FOR /F "delims=" %%A IN ('git rev-list --count HEAD') DO (SET /A GIT_COUNT=%%A)
FOR /F "tokens=1,2 delims= " %%A IN ('git log -1 --date=format:%%d.%%m.%%Y ^| find /I "Date:"') DO (SET "GIT_DATE=%%B")
FOR /F "tokens=2-4 delims=, " %%A IN ('git log -1 --date=format:"%%a,%%d-%%h-%%Y,%%T" ^| find /I "Date:"') DO (
SET "GIT_DATETIME=Git time: %%A, %%B %%C"
SET "GIT_TIME=%%C"
)
SET VSF=%VerMajor%.%VerMinor%.%VerPatch%.%GIT_COUNT%
SET VS=%VerMajor%.%VerMinor%.%VerPatch%
SET VNF=%VerMajor%,%VerMinor%,%VerPatch%,%GIT_COUNT%
SET VN=%VerMajor%,%VerMinor%,%VerPatch%
SET PNF=%PN% v%VS% (C++)
SET PCF=Copyright (C) %PYS%-%CURRENT_YEAR% by %PA%
SET INT_NAME=%PN%C++
SET ORIG_NAME=%PN%.exe
ECHO #define BUILD_DATE "%BUILDDATE%">> version.h
ECHO #define BUILD_TIME "%BUILDTIME%">> version.h
ECHO #define BUILD_DATETIME "%BUILD_DATETIME%">> version.h
ECHO #define GIT_DATE "%GIT_DATE%">> version.h
ECHO #define GIT_TIME "%GIT_TIME%">> version.h
ECHO #define GIT_DATETIME "%GIT_DATETIME%">> version.h
ECHO #define GIT_COUNT %GIT_COUNT% >> version.h
ECHO #define V_SECS %BUILDSECS% >> version.h
ECHO #define INTERNAL_NAME "%INT_NAME%">> version.h
ECHO #define ORIG_FILE_NAME "%ORIG_NAME%">> version.h
ECHO #define PRODUCT_NAME_FULL "%PNF%">> version.h
ECHO #define PRODUCT_COPYRIGHT "%PCF%">> version.h
ECHO #define VERSION_NUM %VN% >> version.h
ECHO #define VERSION_STR "%VS%">> version.h
ECHO #define VERSION_NUM_FULL %VNF% >> version.h
ECHO #define VERSION_STR_FULL "%VSF%">> version.h
ENDLOCAL
EXIT

View File

@@ -1,12 +0,0 @@
// wCenterWindow
// version.h
//
#pragma once
#define V_MAJOR 2
#define V_MINOR 3
#define V_PATCH 4
#define PRODUCT_NAME "wCenterWindow"
#define PRODUCT_AUTHORS "W0LF aka 'dreamforce'"
#define PRODUCT_YEAR_START 2020
#define PRODUCT_DESCRIPTION "Centers windows by hotkey"

View File

@@ -1,61 +1,67 @@
// wCenterWindow
// wCenterWindow, v2.3.3
// Logger.cpp
//
#include "framework.h"
#define TS_LEN 30
#define PATH_LEN 1024
std::ofstream logfile;
std::wofstream logfile;
extern WCHAR szTitle[];
extern LPVOID szBuffer;
namespace fs = std::filesystem;
std::string GetTimeStamp()
std::wstring PrintTitle()
{
wchar_t szWinTitle[2048];
StringCchPrintf(szWinTitle, 2048, L"%s", szBuffer);
return szWinTitle;
}
std::wstring GetTimeStamp()
{
SYSTEMTIME lt;
GetLocalTime(&lt);
CHAR ts[TS_LEN];
StringCchPrintfA(ts, TS_LEN, "%d-%02d-%02d %02d:%02d:%02d.%03d - ", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds);
wchar_t ts[TS_LEN];
StringCchPrintfW(ts, TS_LEN, L"%d-%02d-%02d %02d:%02d:%02d.%03d - ", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds);
return ts;
}
void OpenLogFile()
{
WCHAR lpszPath[MAX_PATH + 1] = { 0 };
DWORD dwPathLength = GetModuleFileNameW(NULL, lpszPath, MAX_PATH);
wchar_t lpszPath[PATH_LEN]{};
DWORD dwPathLength = GetModuleFileNameW(NULL, lpszPath, PATH_LEN);
DWORD dwError = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER == dwError)
{
MessageBoxW(NULL, L"Path to logfile is too long! Working without logging", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
MessageBoxW(NULL, L"Path to logfile is too long! Working without logging.", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
return;
}
if (NULL == dwPathLength)
{
MessageBoxW(NULL, L"Can't get module filename! Working without logging", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
MessageBoxW(NULL, L"Can't get module filename! Working without logging.", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
return;
}
std::filesystem::path log_path = lpszPath;
fs::path log_path = lpszPath;
log_path.replace_extension(L".log");
std::filesystem::path bak_path = log_path;
fs::path bak_path = log_path;
bak_path.replace_extension(L".bak");
if (std::filesystem::exists(log_path)) std::filesystem::rename(log_path, bak_path);
if (fs::exists(log_path)) fs::rename(log_path, bak_path);
#ifdef _DEBUG
log_path = L"d:\\test.log";
#endif
logfile.open(log_path);
if (logfile.is_open())
{
logfile << std::boolalpha;
diag_log("Start logging");
diag_log("Logfile: ", log_path);
diag_log("Logfile was successfully opened");
diag_log(L"Start logging.");
diag_log(L"Logfile:", log_path);
diag_log(log_path, L"successfully opened.");
}
else
{
MessageBoxW(NULL, L"Can't open logfile! Working without logging", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
MessageBoxW(NULL, L"Can't open logfile! Working without logging.", (LPCWSTR)szTitle, MB_OK | MB_ICONWARNING);
}
return;
}
@@ -64,7 +70,7 @@ void CloseLogFile()
{
if (logfile)
{
diag_log("End logging");
diag_log(L"End logging.");
logfile.close();
}
}

View File

@@ -1,11 +1,12 @@
// wCenterWindow
// wCenterWindow, v2.3.3
// Logger.h
//
#pragma once
#include "framework.h"
extern std::ofstream logfile;
std::string GetTimeStamp();
extern std::wofstream logfile;
std::wstring GetTimeStamp();
std::wstring PrintTitle();
template <typename T1>
void diag_log(T1 arg1)
@@ -16,43 +17,43 @@ void diag_log(T1 arg1)
template <typename T1, typename T2>
void diag_log(T1 arg1, T2 arg2)
{
logfile << GetTimeStamp() << arg1 << arg2 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << std::endl;
}
template <typename T1, typename T2, typename T3>
void diag_log(T1 arg1, T2 arg2, T3 arg3)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << std::endl;
}
template <typename T1, typename T2, typename T3, typename T4>
void diag_log(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << arg4 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << std::endl;
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
void diag_log(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << arg4 << arg5 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << ' ' << arg5 << std::endl;
}
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
void diag_log(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << arg4 << arg5 << arg6 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << ' ' << arg5 << ' ' << arg6 << std::endl;
}
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
void diag_log(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << arg4 << arg5 << arg6 << arg7 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << ' ' << arg5 << ' ' << arg6 << ' ' << arg7 << std::endl;
}
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
void diag_log(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
{
logfile << GetTimeStamp() << arg1 << arg2 << arg3 << arg4 << arg5 << arg6 << arg7 << arg8 << std::endl;
logfile << GetTimeStamp() << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << ' ' << arg5 << ' ' << arg6 << ' ' << arg7 << ' ' << arg8 << std::endl;
}
void OpenLogFile();

Binary file not shown.

View File

@@ -1,7 +1,9 @@
// wCenterWindow
// framework.h
// header.h : include file for standard system include files,
// or project specific include files
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
@@ -15,5 +17,10 @@
#include <shellapi.h>
#include <CommCtrl.h>
// C RunTime Header Files
//#include <stdlib.h>
//#include <malloc.h>
//#include <memory.h>
// Project Specific Header Files
#include "Logger.h"

View File

@@ -13,13 +13,12 @@
#define ID_POPUPMENU_EXIT 111
#define IDS_ABOUT 112
#define IDS_ERR_MAIN 113
#define IDS_ERR_CLASS 114
#define IDS_ERR_WND 115
#define IDS_ERR_ICON 116
#define IDS_ERR_MENU 117
#define IDS_ERR_POPUP 118
#define IDS_ERR_HOOK 119
#define IDS_ERR_MAXMIN 120
#define IDS_ERR_WND 114
#define IDS_ERR_ICON 115
#define IDS_ERR_MENU 116
#define IDS_ERR_POPUP 117
#define IDS_ERR_HOOK 118
#define IDS_ERR_MAXMIN 119
#define IDS_RUNNING 121
#define IDR_MAINFRAME 128
#define IDD_MANUAL_EDITING 129

View File

@@ -1,6 +1,9 @@
// wCenterWindow
// wCenterWindow.cpp
// wCenterWindow, v2.3.3
//
// TODO: More verbose logs - partially done.
// TODO: More verbose error messages
// TODO: Window's title in logs (Impossible?)
#include "framework.h"
#include "wCenterWindow.h"
@@ -8,7 +11,7 @@
#define KEY_C 0x43
#define KEY_V 0x56
#define BUF_LEN 1024
#define BUF_LEN 4096
#define MAX_LOADSTRING 50
#define WM_WCW 0x8F00
@@ -19,15 +22,14 @@ WCHAR szClass[MAX_LOADSTRING]; // Window's class
WCHAR szAbout[MAX_LOADSTRING * 12]; // Description text
WCHAR szWinTitle[256];
WCHAR szWinClass[256];
WCHAR szWinCore[] = L"Windows.UI.Core.CoreWindow";
WCHAR szWorkerW[] = L"WorkerW";
WCHAR szWinCore[] = TEXT("Windows.UI.Core.CoreWindow");
HANDLE hHeap = NULL;
HHOOK hMouseHook = NULL, hKbdHook = NULL; // Hook's handles
HICON hIcon = NULL;
HMENU hMenu = NULL, hPopup = NULL;
HWND hWnd = NULL, hFgWnd = NULL, hTaskBar = NULL, hDesktop = NULL, hProgman = NULL;
bool bKPressed = FALSE, bMPressed = FALSE, bShowIcon = TRUE, bWorkArea = TRUE;
bool bLCTRL = FALSE, bLWIN = FALSE, bKEYV = FALSE;
BOOL bKPressed = FALSE, bMPressed = FALSE, bShowIcon = TRUE, bWorkArea = TRUE;
BOOL bLCTRL = FALSE, bLWIN = FALSE, bKEYV = FALSE;
RECT rcFW = { 0 };
NOTIFYICONDATAW nid = { 0 };
@@ -42,26 +44,26 @@ static const GUID guid = { 0x2d7b7f30, 0x4b5f, 0x4380, { 0x98, 0x7, 0x57, 0xd7,
// Forward declarations of functions included in this code module:
VOID HandlingTrayIcon();
VOID ShowError(UINT);
bool IsWindowApprooved(HWND);
BOOL CheckWindow(HWND);
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM);
LRESULT CALLBACK MouseHookProc(int, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
std::string ConvertWideToUtf8(const std::wstring&);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
VOID MoveWindowToMonitorCenter(HWND hwnd, BOOL bWorkArea, BOOL bResize)
{
diag_log("Entering MoveWindowToMonitorCenter(), handle = 0x", hwnd);
//diag_log(L"Entering MoveWindowToMonitorCenter(): hwnd =", hwnd, L"Title:", (LPWSTR)szBuffer);
diag_log(L"Entering MoveWindowToMonitorCenter(): hwnd =", hwnd);
RECT fgwrc = { 0 };
GetWindowRect(hwnd, &fgwrc);
LONG nWidth = fgwrc.right - fgwrc.left;
LONG nHeight = fgwrc.bottom - fgwrc.top;
diag_log("Moving window from x = ", fgwrc.left, ", y = ", fgwrc.top);
diag_log(L"Moving window from x =", fgwrc.left, L"y =", fgwrc.top);
MONITORINFO mi = { 0 };
mi.cbSize = sizeof(MONITORINFO);
@@ -95,14 +97,34 @@ VOID MoveWindowToMonitorCenter(HWND hwnd, BOOL bWorkArea, BOOL bResize)
MoveWindow(hwnd, x, y, nWidth, nHeight, TRUE);
SendMessageW(hwnd, WM_EXITSIZEMOVE, NULL, NULL);
diag_log("Moving window to x = ", x, ", y = ", y);
diag_log("Quiting MoveWindowToMonitorCenter()");
diag_log(L"Moving window to x =", x, L"y =", y);
diag_log(L"Quiting MoveWindowToMonitorCenter()");
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIconW(hInstance, MAKEINTRESOURCE(IDI_TRAYICON));
wcex.hCursor = LoadCursorW(nullptr, IDC_ARROW);
wcex.lpszClassName = szClass;
wcex.hIconSm = wcex.hIcon;
hIcon = wcex.hIcon;
return RegisterClassExW(&wcex);
}
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
OpenLogFile();
diag_log(L"Entering WinMain()");
hInst = hInstance;
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, _countof(szTitle));
@@ -114,25 +136,8 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd
return FALSE;
}
OpenLogFile();
diag_log("Entering WinMain()");
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIconW(hInstance, MAKEINTRESOURCE(IDI_TRAYICON));
wcex.hCursor = LoadCursorW(nullptr, IDC_ARROW);
wcex.lpszClassName = szClass;
wcex.hIconSm = wcex.hIcon;
hIcon = wcex.hIcon;
if (!RegisterClassExW(&wcex))
{
ShowError(IDS_ERR_CLASS);
return FALSE;
}
hWnd = CreateWindowExW(0, szClass, szTitle, 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
MyRegisterClass(hInstance);
hWnd = CreateWindowExW(0, szClass, szTitle, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);
if (!hWnd)
{
ShowError(IDS_ERR_WND);
@@ -141,13 +146,11 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd
int nArgs = 0;
LPWSTR* szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
std::string arg;
diag_log("Arguments: ", nArgs - 1);
diag_log(L"Arguments:", nArgs - 1);
for (int i = 1; i < nArgs; i++)
{
arg = ConvertWideToUtf8(szArglist[i]);
diag_log("Argument #", i, ": ", arg);
diag_log(L"Argument", i, L":", szArglist[i]);
}
(nArgs >= 2 && 0 == lstrcmpiW(szArglist[1], L"/hide")) ? bShowIcon = FALSE : bShowIcon = TRUE;
@@ -183,7 +186,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd
if (hMenu) DestroyMenu(hMenu);
Shell_NotifyIconW(NIM_DELETE, &nid);
diag_log("Quiting WinMain(), msg.wParam = ", (int)msg.wParam);
diag_log(L"Quiting WinMain(), msg.wParam =", (int)msg.wParam);
CloseLogFile();
HeapFree(hHeap, NULL, szBuffer);
@@ -196,24 +199,23 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_CREATE:
{
diag_log("Recived WM_CREATE message");
hMenu = LoadMenuW(hInst, MAKEINTRESOURCE(IDR_MENU));
if (!hMenu)
{
diag_log("Loading context menu failed!");
diag_log(L"Loading context menu failed!");
ShowError(IDS_ERR_MENU);
PostMessageW(hWnd, WM_CLOSE, NULL, NULL);
SendMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
diag_log("Context menu successfully loaded");
diag_log(L"Context menu successfully loaded");
hPopup = GetSubMenu(hMenu, 0);
if (!hPopup)
{
diag_log("Creating popup menu failed!");
diag_log(L"Creating popup menu failed!");
ShowError(IDS_ERR_POPUP);
PostMessageW(hWnd, WM_CLOSE, NULL, NULL);
SendMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
diag_log("Popup menu successfully created");
diag_log(L"Popup menu successfully created");
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_STATE;
@@ -232,25 +234,23 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
nid.dwStateMask = NIS_HIDDEN;
StringCchCopyW(nid.szTip, _countof(nid.szTip), szTitle);
#ifndef _DEBUG
hMouseHook = SetWindowsHookExW(WH_MOUSE_LL, MouseHookProc, hInst, NULL);
if (!hMouseHook)
{
diag_log("Creating mouse hook failed!");
diag_log(L"Creating mouse hook failed!");
ShowError(IDS_ERR_HOOK);
PostMessageW(hWnd, WM_CLOSE, NULL, NULL);
SendMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
diag_log("Mouse hook was successfully set");
#endif // !_DEBUG
diag_log(L"Mouse hook was successfully set");
hKbdHook = SetWindowsHookExW(WH_KEYBOARD_LL, KeyboardHookProc, hInst, NULL);
if (!hKbdHook)
{
diag_log("Creating keyboard hook failed!");
diag_log(L"Creating keyboard hook failed!");
ShowError(IDS_ERR_HOOK);
PostMessageW(hWnd, WM_CLOSE, NULL, NULL);
SendMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
diag_log("Keyboard hook was successfully set");
diag_log(L"Keyboard hook was successfully set");
LoadStringW(hInst, IDS_ABOUT, szAbout, _countof(szAbout));
break;
@@ -258,55 +258,38 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_WCW:
{
if (IDI_TRAYICON == wParam && (WM_RBUTTONDOWN == lParam || WM_LBUTTONDOWN == lParam))
if ((lParam == WM_RBUTTONDOWN || lParam == WM_LBUTTONDOWN) && wParam == IDI_TRAYICON)
{
diag_log("Entering menu handler");
SetForegroundWindow(hWnd);
POINT pt;
GetCursorPos(&pt);
int idMenu = TrackPopupMenu(hPopup, TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL);
if (ID_POPUPMENU_ICON == idMenu)
if (idMenu == ID_POPUPMENU_ICON)
{
diag_log("Pressed 'Hide icon' menuitem");
bShowIcon = FALSE;
HandlingTrayIcon();
}
if (ID_POPUPMENU_AREA == idMenu)
if (idMenu == ID_POPUPMENU_AREA)
{
diag_log("Pressed 'Use workarea' menuitem");
bWorkArea = !bWorkArea;
bWorkArea ? mii.fState = MFS_CHECKED : mii.fState = MFS_UNCHECKED;
SetMenuItemInfoW(hPopup, ID_POPUPMENU_AREA, FALSE, &mii);
diag_log("Changed 'Use workarea' option to ", bWorkArea);
diag_log(L"Changed 'Use workarea' option to", bWorkArea);
}
if (ID_POPUPMENU_ABOUT == idMenu && !bKPressed)
if (idMenu == ID_POPUPMENU_ABOUT && !bKPressed)
{
diag_log("Pressed 'About' menuitem");
bKPressed = TRUE;
diag_log(L"Opening 'About' dialog");
DialogBoxW(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
bKPressed = FALSE;
}
if (ID_POPUPMENU_EXIT == idMenu)
{
diag_log("Pressed 'Exit' menuitem");
PostMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
diag_log("Quiting menu handler");
if (idMenu == ID_POPUPMENU_EXIT) SendMessageW(hWnd, WM_CLOSE, NULL, NULL);
}
break;
}
case WM_QUERYENDSESSION:
{
diag_log("Recieved WM_QUERYENDSESSION message, lParam = ", lParam);
CloseLogFile();
return TRUE;
break;
}
case WM_DESTROY:
{
diag_log("Recived WM_DESTROY message");
PostQuitMessage(0);
break;
}
@@ -319,13 +302,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (WM_MBUTTONUP == wParam) bMPressed = FALSE;
if (WM_MBUTTONDOWN == wParam && bLCTRL && bLWIN && !bMPressed)
if (wParam == WM_MBUTTONUP) bMPressed = FALSE;
if (wParam == WM_MBUTTONDOWN && bLCTRL && bLWIN && !bMPressed)
{
diag_log("Pressed LCTRL + LWIN + MMB");
diag_log(L"Pressed LCTRL + LWIN + MMB");
bMPressed = TRUE;
hFgWnd = GetForegroundWindow();
if (IsWindowApprooved(hFgWnd)) MoveWindowToMonitorCenter(hFgWnd, bWorkArea, FALSE);
BOOL bApproved = CheckWindow(hFgWnd);
if (bApproved) MoveWindowToMonitorCenter(hFgWnd, bWorkArea, FALSE);
else hFgWnd = NULL;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
@@ -335,45 +319,47 @@ LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
pkhs = (KBDLLHOOKSTRUCT*)lParam;
if (WM_KEYUP == wParam)
if (wParam == WM_KEYUP)
{
if (VK_LCONTROL == pkhs->vkCode) bLCTRL = FALSE;
if (VK_LWIN == pkhs->vkCode) bLWIN = FALSE;
if (pkhs->vkCode == VK_LCONTROL) bLCTRL = FALSE;
if (pkhs->vkCode == VK_LWIN) bLWIN = FALSE;
bKPressed = FALSE;
}
if (WM_KEYDOWN == wParam)
if (wParam == WM_KEYDOWN)
{
if (VK_LCONTROL == pkhs->vkCode) bLCTRL = TRUE;
if (VK_LWIN == pkhs->vkCode) bLWIN = TRUE;
if (pkhs->vkCode == VK_LCONTROL) bLCTRL = TRUE;
if (pkhs->vkCode == VK_LWIN) bLWIN = TRUE;
if (KEY_I == pkhs->vkCode && bLCTRL && bLWIN && !bKPressed) // 'I' key
if (bLCTRL && bLWIN && pkhs->vkCode == KEY_I && !bKPressed) // 'I' key
{
diag_log("Pressed LCTRL + LWIN + I");
diag_log(L"Pressed LCTRL + LWIN + I");
bKPressed = TRUE;
bShowIcon = !bShowIcon;
HandlingTrayIcon();
return TRUE;
}
if (KEY_C == pkhs->vkCode && bLCTRL && bLWIN && !bKPressed && !bKEYV) // 'C' key
if (bLCTRL && bLWIN && pkhs->vkCode == KEY_C && !bKPressed && !bKEYV) // 'C' key
{
diag_log("Pressed LCTRL + LWIN + C");
diag_log(L"Pressed LCTRL + LWIN + C");
bKPressed = TRUE;
hFgWnd = GetForegroundWindow();
if (IsWindowApprooved(hFgWnd)) MoveWindowToMonitorCenter(hFgWnd, bWorkArea, FALSE);
BOOL bApproved = CheckWindow(hFgWnd);
if (bApproved) MoveWindowToMonitorCenter(hFgWnd, bWorkArea, FALSE);
else hFgWnd = NULL;
return TRUE;
}
if (KEY_V == pkhs->vkCode && bLCTRL && bLWIN && !bKPressed && !bKEYV) // 'V' key
if (bLCTRL && bLWIN && pkhs->vkCode == KEY_V && !bKPressed && !bKEYV) // 'V' key
{
diag_log("Pressed LCTRL + LWIN + V");
diag_log(L"Pressed LCTRL + LWIN + V");
bKPressed = TRUE; bKEYV = TRUE;
hFgWnd = GetForegroundWindow();
if (IsWindowApprooved(hFgWnd))
BOOL bApproved = CheckWindow(hFgWnd);
if (bApproved)
{
diag_log("Opening 'Manual editing' dialog");
diag_log(L"Opening 'Manual editing' dialog");
DialogBoxW(hInst, MAKEINTRESOURCE(IDD_MANUAL_EDITING), hFgWnd, (DLGPROC)DlgProc);
SetForegroundWindow(hFgWnd);
}
@@ -392,7 +378,6 @@ BOOL CALLBACK DlgProc(HWND hDlg, UINT dlgmsg, WPARAM wParam, LPARAM lParam)
{
case WM_INITDIALOG:
{
diag_log("Initializing 'Manual editing' dialog");
SetWindowTextW(hDlg, szTitle);
GetWindowTextW(hFgWnd, szWinTitle, _countof(szWinTitle));
GetClassNameW(hFgWnd, szWinClass, _countof(szWinClass));
@@ -410,13 +395,11 @@ BOOL CALLBACK DlgProc(HWND hDlg, UINT dlgmsg, WPARAM wParam, LPARAM lParam)
UpdateWindow(hDlg);
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_SET:
{
diag_log("Pressed 'Set' button");
x = GetDlgItemInt(hDlg, IDC_EDIT_X, NULL, TRUE);
y = GetDlgItemInt(hDlg, IDC_EDIT_Y, NULL, TRUE);
w = GetDlgItemInt(hDlg, IDC_EDIT_WIDTH, NULL, FALSE);
@@ -424,15 +407,14 @@ BOOL CALLBACK DlgProc(HWND hDlg, UINT dlgmsg, WPARAM wParam, LPARAM lParam)
SendMessageW(hFgWnd, WM_ENTERSIZEMOVE, NULL, NULL);
MoveWindow(hFgWnd, x, y, w, h, TRUE);
SendMessageW(hFgWnd, WM_EXITSIZEMOVE, NULL, NULL);
diag_log("Window with handle 0x", hFgWnd, " was moved to x = ", x, ", y = ", y);
return TRUE;
break;
}
case IDCANCEL:
case IDC_BUTTON_CLOSE:
{
diag_log("Closing 'Manual editing' dialog");
EndDialog(hDlg, LOWORD(wParam));
diag_log(L"Closing 'Manual editing' dialog");
break;
}
}
@@ -440,46 +422,43 @@ BOOL CALLBACK DlgProc(HWND hDlg, UINT dlgmsg, WPARAM wParam, LPARAM lParam)
return FALSE;
}
bool IsWindowApprooved(HWND hFW)
BOOL CheckWindow(HWND hFW)
{
diag_log("Entering IsWindowApprooved(), handle = 0x", hFW);
bool bApprooved = FALSE;
diag_log(L"Entering CheckWindow(), hwnd=", hFW);
GetClassNameW(hFW, szWinClass, _countof(szWinClass));
if (hFW)
{
GetClassNameW(hFW, szWinClass, _countof(szWinClass));
if (GetWindowTextW(hFW, (LPWSTR)szBuffer, BUF_LEN - sizeof(WCHAR))) diag_log("Title: '", ConvertWideToUtf8((LPWSTR)szBuffer), "'");
if (IsIconic(hFW)) diag_log("Window is iconic");
if (IsZoomed(hFW)) diag_log("Window is maximized");
if ((wcscmp(szWinClass, szWinCore) != 0) &&
(wcscmp(szWinClass, szWorkerW) != 0) &&
(hFW != hDesktop && hFW != hTaskBar && hFW != hProgman))
if (wcscmp(szWinClass, szWinCore) != 0)
{
if (!IsIconic(hFW) && !IsZoomed(hFW))
if (hFW != hDesktop && hFW != hTaskBar && hFW != hProgman)
{
diag_log("Window is approved");
bApprooved = TRUE;
if (!IsIconic(hFW) && !IsZoomed(hFW))
{
GetWindowTextW(hFW, (LPWSTR)szBuffer, BUF_LEN - sizeof(WCHAR));
diag_log(L"Window with hwnd=", hFW, L"is approved");
return TRUE;
}
else ShowError(IDS_ERR_MAXMIN);
}
else ShowError(IDS_ERR_MAXMIN);
}
else diag_log("The window belongs to the Windows environment");
}
if (!bApprooved) diag_log("Window is not approved!");
diag_log("Quiting IsWindowApprooved()");
return bApprooved;
diag_log(L"Window with hwnd=", hFW, L"is not approved!");
diag_log(L"Quiting CheckWindow()");
return FALSE;
}
VOID HandlingTrayIcon()
{
diag_log("Entering HandlingTrayIcon(), bShowIcon = ", bShowIcon);
diag_log(L"Entering HandlingTrayIcon(), bShowIcon =", bShowIcon);
if (bShowIcon)
{
bool bResult1 = Shell_NotifyIconW(NIM_ADD, &nid);
diag_log("Shell_NotifyIconW(NIM_ADD): ", bResult1);
bool bResult2 = Shell_NotifyIconW(NIM_SETVERSION, &nid);
diag_log("Shell_NotifyIconW(NIM_SETVERSION): ", bResult2);
BOOL bResult1 = Shell_NotifyIconW(NIM_ADD, &nid);
diag_log(L"Shell_NotifyIconW(NIM_ADD):", bResult1);
BOOL bResult2 = Shell_NotifyIconW(NIM_SETVERSION, &nid);
diag_log(L"Shell_NotifyIconW(NIM_SETVERSION):", bResult2);
if (!bResult1 || !bResult2)
{
diag_log("Error creating trayicon!");
diag_log(L"Error creating trayicon.");
ShowError(IDS_ERR_ICON);
bShowIcon = FALSE;
}
@@ -488,14 +467,14 @@ VOID HandlingTrayIcon()
{
Shell_NotifyIconW(NIM_DELETE, &nid);
}
diag_log("Quiting HandlingTrayIcon()");
diag_log(L"Quiting HandlingTrayIcon()");
}
VOID ShowError(UINT uID)
{
WCHAR szErrorText[MAX_LOADSTRING]; // Error's text
LoadStringW(hInst, uID, szErrorText, _countof(szErrorText));
MessageBoxW(NULL, szErrorText, szTitle, MB_OK | MB_ICONERROR | MB_TOPMOST);
MessageBoxW(hWnd, szErrorText, szTitle, MB_OK | MB_ICONERROR | MB_TOPMOST);
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
@@ -509,7 +488,6 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_INITDIALOG:
{
diag_log("Initializing 'About' dialog");
SetDlgItemTextW(hDlg, IDC_ABOUTHELP, szAbout);
return (INT_PTR)TRUE;
break;
@@ -523,30 +501,20 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
PNMLINK pNMLink = (PNMLINK)pNMHdr;
LITEM item = pNMLink->item;
ShellExecuteW(NULL, L"open", item.szUrl, NULL, NULL, SW_SHOW);
diag_log("Pressed donation link");
diag_log(L"Pressed donation link");
return (INT_PTR)TRUE;
}
break;
}
case WM_COMMAND:
{
if (IDOK == LOWORD(wParam) || IDCANCEL == LOWORD(wParam))
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
diag_log("Closing 'About' dialog");
diag_log(L"Closing 'About' dialog");
return (INT_PTR)TRUE;
}
break;
}
}
return (INT_PTR)FALSE;
}
std::string ConvertWideToUtf8(const std::wstring& wstr)
{
int count = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL);
std::string str(count, 0);
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], count, NULL, NULL);
return str;
}

View File

@@ -1,4 +1,3 @@
// wCenterWindow
// wCenterWindow.h
#pragma once
#include "resource.h"

View File

@@ -2,15 +2,22 @@
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<description>Centers windows by hotkey (C++)</description>
<assemblyIdentity
version="2.3.3.0"
processorArchitecture="x86"
name="W0LF.wCenterWindow.C++"
type="win32">
</assemblyIdentity>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="Win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
type="Win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
@@ -25,18 +32,11 @@
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--ID Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--ID Windows 10/11 -->
<!--ID Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware> </windowsSettings>
<windowsSettings> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness> </windowsSettings>
<windowsSettings> <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> </windowsSettings>
<windowsSettings> <heapType xmlns="http://schemas.microsoft.com/SMI/2020/WindowsSettings">SegmentHeap</heapType> </windowsSettings>
</application>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>

Binary file not shown.

View File

@@ -98,13 +98,8 @@
<AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Manifest>
<AdditionalManifestFiles>%(AdditionalManifestFiles)</AdditionalManifestFiles>
<ManifestFromManagedAssembly>
</ManifestFromManagedAssembly>
<AdditionalManifestFiles>$(ProjectName).manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PreBuildEvent>
<Command>"$(SolutionDir)Update_version.bat"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
@@ -125,11 +120,8 @@
<AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Manifest>
<AdditionalManifestFiles>%(AdditionalManifestFiles)</AdditionalManifestFiles>
<AdditionalManifestFiles>$(ProjectName).manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PreBuildEvent>
<Command>"$(SolutionDir)Update_version.bat"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
@@ -144,12 +136,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Manifest>
<AdditionalManifestFiles>%(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PreBuildEvent>
<Command>"$(SolutionDir)Update_version.bat"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
@@ -169,12 +155,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Manifest>
<AdditionalManifestFiles>%(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PreBuildEvent>
<Command>"$(SolutionDir)Update_version.bat"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
@@ -195,10 +175,7 @@
<Image Include="wCenterWindow.ico" />
</ItemGroup>
<ItemGroup>
<Manifest Include="wCenterWindow.exe.manifest" />
</ItemGroup>
<ItemGroup>
<None Include="..\README.md" />
<Manifest Include="wCenterWindow.manifest" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@@ -53,11 +53,8 @@
</Image>
</ItemGroup>
<ItemGroup>
<Manifest Include="wCenterWindow.exe.manifest">
<Manifest Include="wCenterWindow.manifest">
<Filter>Resource Files</Filter>
</Manifest>
</ItemGroup>
<ItemGroup>
<None Include="..\README.md" />
</ItemGroup>
</Project>