^WheelDown::
^WheelUp:: ChangeNotepadeFont(InStr(A_ThisHotkey, "Up"), true) ; если второй параметр true, новый размер шрифта будет сохранён в реестре
ChangeNotepadeFont(UpDown, save) {
static LOGPIXELSY := 90, IsUnicode := 1, szLF := 28 + 32 * (IsUnicode ? 2 : 1)
, WM_GETFONT := 0x31, WM_SETFONT := 0x30, ANTIALIASED_QUALITY := 4, DRAFT_QUALITY := 1
, MEM_COMMIT := 0x1000, MEM_RELEASE := 0x8000, PAGE_READWRITE := 0x4, INFINITE := 0xFFFFFFFF
Critical
if !hProc := Verification()
Return
SendMessage, WM_GETFONT
hCurrentFont := ErrorLevel
VarSetCapacity(LOGFONT, szLF, 0)
DllCall("GetObject", Ptr, hCurrentFont, Int, szLF, Ptr, &LOGFONT)
height := NumGet(LOGFONT, "Int")
hDC := DllCall("GetDC", Ptr, hwnd, Ptr)
CurrentFontSize := -DllCall("MulDiv", Int, height, Int, 72, Int, DeviceCaps := DllCall("GetDeviceCaps", Ptr, hDC, Int, LOGPIXELSY))
if UpDown
NewFontSize := CurrentFontSize + (CurrentFontSize >= 14 ? 2 : 1)
else
NewFontSize := CurrentFontSize - (CurrentFontSize <= 14 ? 1 : 2)
(NewFontSize < 2 && NewFontSize := 2)
height := -DllCall("MulDiv", Int, NewFontSize, Int, DeviceCaps, Int, 72)
DllCall("ReleaseDC", Ptr, hwnd, Ptr, hDC)
NumPut(height, LOGFONT, "Int")
NumPut(NewFontSize > 18 ? ANTIALIASED_QUALITY : DRAFT_QUALITY, &LOGFONT + 26, "Char")
remotePtr := DllCall("VirtualAllocEx", UInt, hProc, UInt, 0, UInt, szLF, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr)
DllCall("WriteProcessMemory", Ptr, hProc, Ptr, remotePtr, Ptr, &LOGFONT, UInt, szLF, UInt, 0)
pFunc := DllCall("GetProcAddress", Ptr, DllCall("GetModuleHandle", "str", "Gdi32.dll", Ptr), AStr, "CreateFontIndirectW", Ptr)
hThrd := DllCall("CreateRemoteThread", Ptr, hProc, Ptr, 0, Ptr, 0, Ptr, pFunc, Ptr, remotePtr, UInt, 0, UInt, 0)
DllCall("WaitForSingleObject", Ptr, hThrd, UInt, INFINITE)
DllCall("GetExitCodeThread", Ptr, hThrd, UIntP, hFont)
DllCall("CloseHandle", Ptr, hThrd)
DllCall("VirtualFreeEx", Ptr, hProc, Ptr, remotePtr, UInt, 0, UInt, MEM_RELEASE)
DllCall("CloseHandle", Ptr, hProc)
SendMessage, WM_SETFONT, hFont, 1
WinGetPos, X, Y
CoordMode, ToolTip
ToolTip, % NewFontSize, X, Y, 19
SetTimer, DelToolTip, -1000
if save
RegWrite, REG_DWORD, HKCU\Software\Microsoft\Notepad, iPointSize, % NewFontSize * 10
}
DelToolTip() {
ToolTip,,,, 19
}
Verification() {
static SYNCHRONIZE := 0x100000, STANDARD_RIGHTS_REQUIRED := 0xF0000
, PROCESS_ALL_ACCESS := (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF)
WinGetClass, winClass, A
if (winClass != "Notepad")
Return
ControlGet, hwnd, hwnd,, Edit1, A
WinWait, ahk_id %hwnd%
WinGet, PID, PID
hProc := DllCall("OpenProcess", UInt, PROCESS_ALL_ACCESS, Int, 0, UInt, PID, Ptr)
if A_Is64bitOS {
DllCall("IsWow64Process", Ptr, hProc, UIntP, bool)
if (bool) ^ (A_PtrSize = 4) {
MsgBox, Процессы скрипта и блокнота имеют разную разрядность, скрипт не будет работать!
DllCall("CloseHandle", Ptr, hProc)
Return
}
}
Return hProc
}
Блокнот и скрипт должны быть одной и той же разрядности. Если используете 32-битный AHK на 64-битной системе, запускайте блокнот из C:\Windows\SysWOW64\notepad.exe.
Код экспериментальный, возможно, не очень корректный. 