代码拉取完成,页面将自动刷新
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C) 2015 Stefan Sundin *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 or later. *
* Modified By Raymond Gillibert in 2021 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "hooks.h"
// Messages
#define SWM_TOGGLE (WM_APP+1)
#define SWM_HIDE (WM_APP+2)
#define SWM_ELEVATE (WM_APP+3)
#define SWM_CONFIG (WM_APP+4)
#define SWM_ABOUT (WM_APP+5)
#define SWM_EXIT (WM_APP+6)
#define SWM_FIND (WM_APP+7)
#define SWM_HELP (WM_APP+8)
#define SWM_SAVEZONES (WM_APP+9)
#define SWM_TESTWIN (WM_APP+10)
#define SWM_OPENINIFILE (WM_APP+11)
#define SWM_SNAPLAYOUT (WM_APP+12)
#define SWM_SNAPLAYOUTEND (WM_APP+22)
#define SWM_EDITLAYOUT (WM_APP+30)
#define SWM_CLOSEZONES (WM_APP+31)
// Boring stuff
static HINSTANCE g_hinst = NULL;
static HWND g_hwnd = NULL;
static UINT WM_TASKBARCREATED = 0;
static TCHAR inipath[MAX_PATH];
static HWND g_dllmsgHKhwnd = NULL;
// Cool stuff
HINSTANCE hinstDLL = NULL;
HHOOK keyhook = NULL;
static DWORD ACMenuItems=-1;
static char elevated = 0;
static char ScrollLockState = 0;
static char SnapGap = 0;
static BYTE WinVer = 0;
#define WIN2K (WinVer >= 5)
#define VISTA (WinVer >= 6)
#define WIN10 (WinVer >= 10)
#define ENABLED() (!!keyhook)
#define GetWindowRectL(hwnd, rect) GetWindowRectLL(hwnd, rect, SnapGap)
static void UpdateSettings();
// Include stuff
#include "languages.c"
#include "tray.c"
#include "config.c"
static HINSTANCE LoadHooksDLL()
{
// Load library
TCHAR path[MAX_PATH];
DWORD ret = GetModuleFileName(NULL, path, ARR_SZ(path));
if(!ret || ret == ARR_SZ(path))
return NULL;
PathRemoveFileSpecL(path);
lstrcat_s(path, ARR_SZ(path), TEXT("\\hooks.dll"));
return LoadLibrary(path);
}
static void FreeHooksDLL()
{
if (hinstDLL) {
FreeLibrary(hinstDLL);
hinstDLL = NULL;
}
}
/////////////////////////////////////////////////////////////////////////////
int HookSystem()
{
if (keyhook) return 1; // System already hooked
LOG("Going to Hook the system...");
if (!hinstDLL) {
hinstDLL = LoadHooksDLL();
if (!hinstDLL) {
LOG("Could not load HOOKS.DLL!!!");
return 1;
}
}
HWND (WINAPI *Load)(HWND, const TCHAR *) = (HWND (WINAPI *)(HWND, const TCHAR*))GetProcAddress(hinstDLL, LOAD_PROC);
if(Load) {
g_dllmsgHKhwnd = Load(g_hwnd, inipath);
}
LOG("HOOKS.DLL Loaded");
// Load keyboard hook
HOOKPROC procaddr;
if (!keyhook) {
// Get address to keyboard hook (beware name mangling)
procaddr = (HOOKPROC) GetProcAddress(hinstDLL, LOW_LEVEL_KB_PROC);
if (procaddr == NULL) {
LOG("Could not find "LOW_LEVEL_KB_PROC" entry point in HOOKS.DLL");
return 1;
}
// Set up the keyboard hook
keyhook = SetWindowsHookEx(WH_KEYBOARD_LL, procaddr, hinstDLL, 0);
if (keyhook == NULL) {
LOG("Keyboard HOOK could not be set");
return 1;
}
}
LOG("Keyboard HOOK set");
// Reading some config options...
UseZones = GetPrivateProfileInt(TEXT("Zones"), TEXT("UseZones"), 0, inipath);
SnapGap = CLAMP(-128, GetPrivateProfileInt(TEXT("Advanced"), TEXT("SnapGap"), 0, inipath), 127);
ACMenuItems = GetPrivateProfileInt(TEXT("Advanced"), TEXT("ACMenuItems"), -1, inipath);
UpdateTray();
return 0;
}
/////////////////////////////////////////////////////////////////////////////
int showerror = 1;
int UnhookSystem()
{
LOG("Going to UnHook the system...");
if (!keyhook) { // System not hooked
return 1;
} else if (!UnhookWindowsHookEx(keyhook) && showerror) {
MessageBox(NULL, l10n->unhook_error, TEXT(APP_NAMEA),
MB_ICONINFORMATION|MB_OK|MB_TOPMOST|MB_SETFOREGROUND);
}
keyhook = NULL;
// Tell dll file that we are unloading
void (WINAPI *Unload)() = (void (WINAPI *)()) GetProcAddress(hinstDLL, UNLOAD_PROC);
if (Unload) {
Unload();
// Zero out the message hwnd from DLL.
g_dllmsgHKhwnd = NULL;
}
FreeHooksDLL();
// Success
UpdateTray();
return 0;
}
/////////////////////////////////////////////////////////////////////////////
void ToggleState()
{
if (ENABLED()) {
UnhookSystem();
} else {
// SendMessage(g_hwnd, WM_UPDATESETTINGS, 0, 0);
HookSystem();
}
}
/////////////////////////////////////////////////////////////////////////////
static void UpdateSettings()
{
//PostMessage(g_hwnd, WM_UPDATESETTINGS, 0, 0);
if (ENABLED()) {
UnhookSystem();
HookSystem();
}
}
/////////////////////////////////////////////////////////////////////////////
//
void ShowSClickMenu(HWND hwnd, LPARAM param)
{
POINT pt;
if (param&LP_CURSORPOS) {
// Use cursor position to place menu.
GetCursorPos(&pt);
} else {
// Use the pointed window
RECT rc;
HWND clickhwnd = (HWND)SendMessage(hwnd, WM_GETCLICKHWND, 0, 0);
GetWindowRect(clickhwnd, &rc);
pt.x = rc.left + GetSystemMetricsForWin(SM_CXSIZEFRAME, clickhwnd);
pt.y = rc.top + GetSystemMetricsForWin(SM_CYSIZEFRAME, clickhwnd)
+ GetSystemMetricsForWin(SM_CYCAPTION, clickhwnd);
}
HMENU menu = CreatePopupMenu();
UCHAR show_oriclick = (param&LP_NOALTACTION)? AC_ORICLICK: 0xFF;
#define CHK(LP_FLAG) MF_STRING|((param&LP_FLAG)?MF_CHECKED:MF_UNCHECKED)
const struct {
UCHAR action; WORD mf; TCHAR *str;
} mnlst[] = {
/* hide, action, MF_FLAG/CHECKED, menu string */
{ AC_ALWAYSONTOP, CHK(LP_TOPMOST), l10n->input_actions_alwaysontop },
{ AC_BORDERLESS, CHK(LP_BORDERLESS), l10n->input_actions_borderless },
{ AC_CENTER, MF_STRING, l10n->input_actions_center},
{ AC_ROLL, CHK(LP_ROLLED), l10n->input_actions_roll},
{ AC_LOWER, MF_STRING, l10n->input_actions_lower},
{ AC_MAXHV, MF_STRING, l10n->input_actions_maximizehv},
{ AC_MINALL, MF_STRING, l10n->input_actions_minallother},
{ AC_SIDESNAP, MF_STRING, l10n->input_actions_sidesnap},
{ 0, MF_SEPARATOR, NULL }, /* ------------------------ */
{ AC_MAXIMIZE, CHK(LP_MAXIMIZED), l10n->input_actions_maximize},
{ AC_MINIMIZE, MF_STRING, l10n->input_actions_minimize},
{ AC_CLOSE, MF_STRING, l10n->input_actions_close},
{ 0, MF_SEPARATOR, NULL }, /* ------------------------ */
{ AC_KILL, MF_STRING, l10n->input_actions_kill},
{ 0, MF_SEPARATOR, NULL }, /* ------------------------ */
{ AC_MOVEONOFF, CHK(LP_MOVEONOFF), l10n->input_actions_moveonoff},
{ 0, MF_SEPARATOR, NULL }, /* ------------------------ */
{ show_oriclick, MF_STRING, l10n->input_actions_oriclick},
{ AC_NONE, MF_STRING, l10n->input_actions_nothing},
};
#undef CHK
#undef K
unsigned i;
for (i=0; i < ARR_SZ(mnlst); i++) {
if ( (ACMenuItems>>i)&1 && mnlst[i].action != 0xFF) // Put the action in the HIWORD of wParam
AppendMenu(menu, mnlst[i].mf, mnlst[i].action<<16, mnlst[i].str);
}
TrackPopupMenu(menu, GetSystemMetrics(SM_MENUDROPALIGNMENT), pt.x, pt.y, 0, hwnd, NULL);
DestroyMenu(menu);
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
// To get the caret position in screen coordinate.
// We first try to get the carret rect
#include <oleacc.h>
//static const GUID my_IID_IAccessible = { 0x618736e0, 0x3c3d, 0x11cf, {0x81, 0x0c, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} };
static void GetKaretPos(POINT *pt)
{
GUITHREADINFO gui;
gui.cbSize = sizeof(GUITHREADINFO);
gui.hwndCaret = NULL;
if (GetGUIThreadInfo(0, &gui)) {
pt->x = (gui.rcCaret.right + gui.rcCaret.left)>>1;
pt->y = (gui.rcCaret.top + gui.rcCaret.bottom)>>1;
if (gui.hwndCaret) {
ClientToScreen(gui.hwndCaret, pt);
return;
// } else if (gui.hwndFocus) {
// IAccessible *pacc = NULL;
// if ( S_OK==AccessibleObjectFromWindow(gui.hwndFocus, OBJID_CARET, &my_IID_IAccessible, (void**)&pacc) ) {
// // MessageBox(NULL, NULL, NULL, 0);
// LONG x=0, y=0, w=0, h=0;
// VARIANT varCaret;
// varCaret.vt = VT_I4;
// varCaret.lVal = CHILDID_SELF;
// if (S_OK == pacc->lpVtbl->accLocation(pacc, &x, &y, &w, &h, varCaret)) {
// pt->x = x+w/2;
// pt->y = y+h/2;
// pacc->lpVtbl->Release(pacc);
// return;
// }
// }
}
}
GetCursorPos(pt);
}
static void ShowUnikeyMenu(HWND hwnd, LPARAM param)
{
UCHAR vkey = LOBYTE(LOWORD(param));
UCHAR capital = HIBYTE(LOWORD(param));
TCHAR *const* const ukmap = &l10n->a; //EXTRAKEYS_MAP;
HMENU menu = CreatePopupMenu();
if (!menu) return;
const TCHAR *kl, *keylist = ukmap[vkey - 0x41];
UCHAR i;
for (kl = keylist, i='A'; *kl; kl++) {
if(*kl==L'%') {
AppendMenu(menu, MF_SEPARATOR, 0, NULL);
continue;
}
TCHAR unichar = *kl;
if (kl[1] == L'|') {
kl+=2;
if (capital) unichar = *kl;
} else if (capital) {
unichar = (TCHAR)(LONG_PTR)CharUpper((TCHAR *)(LONG_PTR)*kl);
}
if (i > 'Z') i = '1';
TCHAR mwstr[6];
mwstr[0] = L'&';
mwstr[1] = i++;
mwstr[2] = L'\t';
DWORD utf16c;
if (IS_SURROGATE_PAIR(unichar, kl[1])) {
utf16c =*(DWORD*)kl;
mwstr[3] = LOWORD(utf16c);
mwstr[4] = HIWORD(utf16c);
mwstr[5] = L'\0';
kl++; // skip high surrogate
} else {
mwstr[3] = utf16c = unichar;
mwstr[4] = L'\0';
}
if (!AppendMenu(menu, MF_STRING, utf16c, mwstr))
break;
}
if (kl > keylist) {
POINT pt;
GetKaretPos(&pt);
TrackPopupMenu(menu, GetSystemMetrics(SM_MENUDROPALIGNMENT), pt.x, pt.y, 0, hwnd, NULL);
}
DestroyMenu(menu);
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (!msg) {
// In case some messages are not registered.
} else if(wParam && msg == WM_ERASEBKGND) {
return 1;
} else if (wParam && (msg == WM_PAINT || msg == WM_NCPAINT)) {
return 0;
} else if (msg == WM_TRAY) {
if (lParam == WM_LBUTTONDOWN || lParam == WM_LBUTTONDBLCLK) {
ToggleState();
if (lParam == WM_LBUTTONDBLCLK) {
SendMessage(hwnd, WM_OPENCONFIG, 0, 0);
}
} else if (lParam == WM_MBUTTONDOWN) {
SendMessage(hwnd, WM_COMMAND, SWM_OPENINIFILE, 0);
} else if (lParam == WM_RBUTTONUP) {
ShowContextMenu(hwnd);
}
} else if (msg == WM_SCLICK && wParam) {
ShowSClickMenu((HWND)wParam, lParam);
} else if (msg == WM_UNIKEYMENU) {
ShowUnikeyMenu((HWND)wParam, lParam);
} else if (msg == WM_UPDATESETTINGS) {
// Reload hooks
UpdateSettings();
} else if (msg == WM_ADDTRAY) {
hide = 0;
UpdateTray();
} else if (msg == WM_UPDATETRAY) {
UpdateTray();
} else if (msg == WM_HIDETRAY) {
hide = 1;
RemoveTray();
} else if (msg == WM_OPENCONFIG && (lParam || !hide)) {
OpenConfig(wParam);
} else if (msg == WM_CLOSECONFIG) {
CloseConfig();
} else if (msg == WM_TASKBARCREATED) {
// Try to add the tray icon because explorer started.
tray_added = 0;
UpdateTray();
} else if (msg == WM_COMMAND) {
int wmId = LOWORD(wParam); // int wmEvent = HIWORD(wParam);
if (wmId == SWM_TOGGLE) {
ToggleState();
} else if (wmId == SWM_HIDE) {
hide = 1;
RemoveTray();
} else if (wmId == SWM_ELEVATE) {
ElevateNow(0);
} else if (wmId == SWM_CONFIG) {
SendMessage(hwnd, WM_OPENCONFIG, 0, 0);
} else if (wmId == SWM_ABOUT) {
SendMessage(hwnd, WM_OPENCONFIG, 5, 0);
} else if (wmId == SWM_OPENINIFILE) {
ShellExecute(NULL, TEXT("open"), inipath, NULL, NULL, SW_SHOWNORMAL);
} else if (wmId == SWM_EXIT) {
DestroyWindow(hwnd);
} else if (wmId == SWM_SAVEZONES) {
TCHAR txt[256];
lstrcpy_s(txt, ARR_SZ(txt), l10n->zone_confirmation);
lstrcat_s(txt, ARR_SZ(txt), TEXT("\n\n"));
catFullLayoutName(txt, ARR_SZ(txt), LayoutNumber);
int ret = MessageBox(NULL, txt, TEXT(APP_NAMEA), MB_OKCANCEL);
if (ret == IDOK) {
UnhookSystem();
SaveCurrentLayout();
WriteCurrentLayoutNumber();
HookSystem();
}
} else if (wmId == SWM_CLOSEZONES) {
CloseAllTestWindows();
} else if (wmId == SWM_TESTWIN) {
NewTestWindow();
} else if (SWM_SNAPLAYOUT <= wmId && wmId <= SWM_SNAPLAYOUTEND) {
// Inform hooks.dll that the snap layout changed
LayoutNumber = wmId-SWM_SNAPLAYOUT;
if(g_dllmsgHKhwnd)
PostMessage(g_dllmsgHKhwnd, WM_SETLAYOUTNUM, LayoutNumber, 0);
// Save new value in the .ini file
WriteCurrentLayoutNumber();
} else if (wmId == SWM_EDITLAYOUT) {
if (g_dllmsgHKhwnd) {
unsigned len = SendMessage(g_dllmsgHKhwnd, WM_GETZONESLEN, LayoutNumber, 0);
if (!len) {
// Empty layout, Let's open a new Test Window
return !NewTestWindow();
}
RECT *zones = (RECT*)malloc(len * sizeof(RECT));
if(!zones) return 0;
SendMessage(g_dllmsgHKhwnd, WM_GETZONES, LayoutNumber, (LPARAM)zones);
// Open them from bottom to top to ensure
// the windows are in the correct order.
while (len--) {
const RECT *rc = &zones[len];
NewTestWindowAt(rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top);
}
free(zones);
}
}
} else if (msg == WM_QUERYENDSESSION) {
showerror = 0;
UnhookSystem();
} else if (msg == WM_DESTROY) {
UnhookSystem();
RemoveTray();
PostQuitMessage(0);
} else if (msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN || msg == WM_RBUTTONDOWN) {
// Hide cursorwnd if clicked on, this might happen if
// it wasn't hidden by hooks.c for some reason
ShowWindow(hwnd, SW_HIDE);
return 0;
} else if (msg == WM_DISPLAYCHANGE || (msg == WM_SETTINGCHANGE && wParam == SPI_SETWORKAREA)) {
LOG("WM_DISPLAYCHANGE %d:%d, %dbpp in WindowProc", LOWORD(lParam), HIWORD(lParam), wParam );
if (g_dllmsgHKhwnd) {
int bestlayout = SendMessage(g_dllmsgHKhwnd, WM_GETBESTLAYOUT, 0, 0);
if( bestlayout != LayoutNumber
&& 0 <= bestlayout && bestlayout < MaxLayouts ) {
LayoutNumber = bestlayout;
PostMessage(g_dllmsgHKhwnd, WM_SETLAYOUTNUM, LayoutNumber, 0);
}
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
/////////////////////////////////////////////////////////////////////////////
int WINAPI tWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, TCHAR *params, int iCmdShow)
{
g_hinst = hInst;
// Get ini path
LOG("\n\nALTSNAP STARTED");
GetModuleFileName(NULL, inipath, ARR_SZ(inipath));
inipath[MAX_PATH-1] = '\0';
lstrcpy_s(&inipath[lstrlen(inipath)-3], 4, TEXT("ini"));
if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(inipath)
&& GetEnvironmentVariable(TEXT("APPDATA"), NULL, 0)) {
// .ini file is not in current directorry, and APPDATA exists
// we should look for %APPDATA%\AltSnap\AltSnap.ini
TCHAR userini[MAX_PATH];
GetEnvironmentVariable(TEXT("APPDATA"), userini, ARR_SZ(userini));
lstrcat_s(userini, ARR_SZ(userini), TEXT("\\AltSnap"));
if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(userini)) {
CreateDirectory(userini, NULL);
LOG("CreateDirectory(%S)", userini);
}
// Full user ini name.
lstrcat_s(userini, ARR_SZ(userini), TEXT("\\AltSnap.ini"));
if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(userini)) {
// Copy AltSnap.dni (Default ini file) if no ini present
lstrcpy_s(&inipath[lstrlen(inipath)-3], 4, TEXT("dni"));
CopyFile(inipath, userini, FALSE); // AltSnap.dni -> AltSnap.ini
LOG("CopyFile(%S -> %S)", inipath, userini);
}
lstrcpy_s(inipath, ARR_SZ(inipath), userini);
}
LOG("ini file: %S", inipath);
// Read parameters on command line
int help = !!lstrstr(params, TEXT("-help"))
|| !!lstrstr(params, TEXT("/?"))
|| !!lstrstr(params, TEXT("-?"));
if (help) {
static const TCHAR *txthelp =
TEXT("AltSnap command line options:\n\n")
TEXT("--help\tShow this help!\n")
TEXT("-h\tHide the tray icon\n")
TEXT("-q\tQuiet mode\n")
TEXT("-m\tMultiple instances allowed\n")
TEXT("-c\tOpen Config dialog\n")
TEXT("-e\tElevate AltSnap\n")
TEXT("-r\tRelaod AltSnap settings\n")
TEXT("-lX\tSelect Snap Layout number X\n")
TEXT("-afX\tExecute action X for the foreground window\n")
TEXT("-apX\tExecute action X for the pointed window\n");
MessageBox(NULL, txthelp, TEXT(APP_NAMEA)TEXT(" Usage"), MB_OK|MB_ICONINFORMATION);
return 0;
}
hide = !!lstrstr(params, TEXT("-h"));
int quiet = !!lstrstr(params, TEXT("-q"));
int elevate = !!lstrstr(params, TEXT("-e"));
int multi = !!lstrstr(params, TEXT("-m"));
int config = !!lstrstr(params, TEXT("-c"));
int rlini = !!lstrstr(params, TEXT("-r"));
// Check if elevated if in >= WinVer
WinVer = LOBYTE(LOWORD(GetVersion()));
LOG("Running with Windows version %lX", GetVersion());
#ifndef NO_VISTA
if (WinVer >= 6) { // Vista +
HANDLE token=NULL;
TOKEN_ELEVATION elevation={0};
DWORD len=0;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &token)
&& GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &len)) {
elevated = elevation.TokenIsElevated;
CloseHandle(token);
}
LOG("Process started %s elevated", elevated? "already": "non");
}
#endif // NO_VISTA
LOG("Command line parameters read, hide=%d, quiet=%d, elevate=%d, multi=%d, config=%d"
, hide, quiet, elevate, multi, config);
// Look for previous instance
if (!multi && !GetPrivateProfileInt(TEXT("Advanced"), TEXT("MultipleInstances"), 0, inipath)){
if (quiet) return 0;
HWND previnst = FindWindow(TEXT(APP_NAMEA), TEXT(""));
if (previnst) {
// Ask old HotKey window to perform an action.
const TCHAR *actionstr = lstrstr(params, TEXT("-a"));
if (actionstr && actionstr[2] && actionstr[3] && actionstr[4]) {
enum action action = MapActionW(&actionstr[3]);
HWND msghwnd;
if ((msghwnd = FindWindow( TEXT(APP_NAMEA)TEXT("-HotKeys"), TEXT("")))) {
PostMessage(msghwnd, WM_HOTKEY, (actionstr[2] == 'p')*0x1000+action, 0);
return 0;
}
}
// Change layout if asked...
#define isUDigit(x) ( TEXT('0') <= (x) && (x) <= TEXT('9') )
const TCHAR *layout = lstrstr(params, TEXT("-l"));
if (layout && isUDigit(layout[2])) {
TCHAR numstr[3] = { layout[2], layout[3], TEXT('\0') };
if (!isUDigit(numstr[1]))
numstr[1] = TEXT('\0');
//MessageBox(NULL, NULL, NULL, 0);
int layoutnumber = CLAMP(0, strtoi(numstr)-1, 9);
PostMessage(previnst, WM_COMMAND, SWM_SNAPLAYOUT+layoutnumber, 0);
return 0;
}
// Update old instance if no action to be made.
LOG("Previous instance found and no -multi mode");
if(hide) PostMessage(previnst, WM_CLOSECONFIG, 0, 0);
if(config) PostMessage(previnst, WM_OPENCONFIG, 0, 0);
if(rlini) PostMessage(previnst, WM_UPDATESETTINGS, 0, 0);
PostMessage(previnst, hide? WM_HIDETRAY : WM_ADDTRAY, 0, 0);
LOG("Updated old instance and NORMAL EXIT");
return 0;
}
LOG("No previous instance found");
}
// Check AlwaysElevate (Vista+ only)
if (WinVer >= 6 && !elevated) {
if(!elevate) elevate = GetPrivateProfileInt(TEXT("Advanced"), TEXT("AlwaysElevate"), 0, inipath);
// Handle request to elevate to administrator privileges
if (elevate) {
LOG("Elevation requested");
TCHAR path[MAX_PATH];
GetModuleFileName(NULL, path, ARR_SZ(path));
HINSTANCE ret = ShellExecute(NULL, TEXT("runas"), path, (hide? TEXT("-h"): NULL), NULL, SW_SHOWNORMAL);
if ((DorQWORD)ret > 32) {
LOG("Elevation Faild => Not cool NORMAL EXIT");
return 0;
}
LOG("Elevation sucess");
} else {
LOG("No Elevation requested");
}
}
// Language
UpdateLanguage(); LOG("Language updated");
// Create window
WNDCLASSEX wnd =
{ sizeof(WNDCLASSEX), 0
, WindowProc, 0, 0, hInst, NULL, NULL
, NULL, NULL, TEXT(APP_NAMEA), NULL };
RegisterClassEx(&wnd);
g_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST| WS_EX_TRANSPARENT
, wnd.lpszClassName , NULL , WS_POPUP
, 0, 0, 0, 0, NULL, NULL, hInst, NULL);
LOG("Create main APP Window: %s", g_hwnd? "Sucess": "Failed");
if (elevated) {
// AltSnap was started elevated!
// Allow some messages to be sent from non-elevated instance
// so that user can do AltSnap.exe -c/r/h/l
UINT i;
for (i = WM_UPDATETRAY; i <= WM_HIDETRAY; i++)
ChangeWindowMessageFilterExL(g_hwnd, i, /*MSGFLT_ALLOW*/1, NULL);
}
// Tray icon
InitTray();
UpdateTray();
// Hook system
HookSystem();
// Add tray if hook failed, even though -hide was supplied
if (hide && !keyhook) {
hide = 0;
UpdateTray();
}
// Open config if -config was supplied
if (config) {
PostMessage(g_hwnd, WM_OPENCONFIG, 0, 0);
}
// Message loop
LOG("Starting "APP_NAMEA" message loop...");
BOOL ret;
MSG msg;
while ((ret = GetMessage( &msg, NULL, 0, 0 )) != 0) {
if (ret == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnhookSystem();
FreeHooksDLL();
DestroyWindow(g_hwnd);
LOG("GOOD NORMAL EXIT");
return msg.wParam;
}
static pure const TCHAR *ParamsFromCmdline(const TCHAR *cmdl)
{
/* in case it starts with " we need to go to the next " */
if (cmdl[0] == TEXT('"')) {
do {
cmdl++;
} while(*cmdl && *cmdl != TEXT('"'));
} else {
while(*cmdl && *cmdl != TEXT(' ') && *cmdl != TEXT('\t')) {
cmdl++;
}
}
cmdl += !!*cmdl; // Skip the " or the ' '
while(*cmdl == TEXT(' ') || *cmdl == TEXT('\t')) cmdl++;
return cmdl;
}
/////////////////////////////////////////////////////////////////////////////
// Use -nostdlib and -e_unfuckMain@0 to use this main, -eunfuckMain for x64.
#ifdef _MSC_VER
#pragma comment(linker, "/entry:\"unfuckWinMain\"")
#endif
void noreturn WINAPI unfuckWinMain(void)
{
HINSTANCE hInst;
HINSTANCE hPrevInstance = NULL;
const TCHAR *szCmdLine;
int iCmdShow = 0;
hInst = GetModuleHandle(NULL);
szCmdLine = ParamsFromCmdline(GetCommandLine());
ExitProcess(tWinMain(hInst, hPrevInstance, (TCHAR *)szCmdLine, iCmdShow));
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。