1

Тема: AHK: Деактивация строки ввода

Как сделать, чтобы при нажатии на любую область окна самого скрипта, строка ввода становилась неактивна?(т.е. не мигает палочка в строке ввода).
Пример кода:


Gui, add, edit, Center y75 x45
Gui, show, w200 h200
return
    
Guiclose:
ExitApp
AutoHotkey - 1.1.32.00

2 (изменено: qqlexa, 2018-08-11 01:59:05)

Re: AHK: Деактивация строки ввода

Если вы хотите заблокировать Edit почитайте http://www.script-coding.com/AutoHotkey … .html#edit.

Edit (редактируемое поле ввода)
ReadOnly: не позволяет пользователю изменять содержимое элемента управления. Тем не менее, текст можно прокручивать для просмотра, выделять и копировать в буфер.

3

Re: AHK: Деактивация строки ввода

qqlexa, если так, то заблокировать при нажатии на окно скрипта и снова разблокировать при нажатии на Edit.

AutoHotkey - 1.1.32.00

4

Re: AHK: Деактивация строки ввода

Пока окно активно, фокус обязательно будет на каком-нибудь элементе управления. Можно перевести фокус на какой-нибудь элемент-пустышку.

GUI, Add, Edit, Center y75 x45
GUI, Add, Picture, +HWNDdummy
GUI, Show, w200 h200

F3:: ControlFocus, , ahk_id %dummy%

Остаётся только отследить щелчок по свободной области окна.

5

Re: AHK: Деактивация строки ввода

ypppu, то, что нужно. Спасибо!
qqlexa, если Вы имели ввиду ReadOnly, то он не работает так, как мне нужно.
Спасибо за помощь!

AutoHotkey - 1.1.32.00

6

Re: AHK: Деактивация строки ввода

ypppu,плохо у меня получается отследить положение клика:



GUI, Add, Edit, Center y75 x45 w100 h20
GUI, Add, Picture, +HWNDdummy
GUI, Show, w200 h200

LButton::
{MouseGetPos,x,y
if  x!=45 or x!=46 or x!=47 or x!=48 or x!=49 or x!=50 or x!=51 or x!=52 or x!=53 or x!=54 or x!=55 or x!=56 or x!=57 or x!=58 or x!=59 or x!=60 or x!=61 or x!=62 or x!=63 or x!=64 or x!=65 or x!=66 or x!=67 or x!=68 or x!=69 or x!=70 or x!=71 or x!=72 or x!=73 or x!=74 or x!=75 or x!=76 or x!=77 or x!=78 or x!=79 or x!=80 or x!=81 or x!=82 or x!=83 or x!=84 or x!=85 or x!=86 or x!=87 or x!=88 or x!=89 or x!=90 or x!=91 or x!=92 or x!=93 or x!=94 or x!=95 or x!=96 or x!=97 or x!=98 or x!=99 or x!=100 or x!=101 or x!=102 or x!=103 or x!=104 or x!=105 or x!=106 or x!=107 or x!=108 or x!=109 or x!=110 or x!=111 or x!=112 or x!=113 or x!=114 or x!=115 or x!=116 or x!=117 or x!=118 or x!=119 or x!=120 or x!=121 or x!=122 or x!=123 or x!=124 or x!=125 or x!=126 or x!=127 or x!=128 or x!=129 or x!=130 or x!=131 or x!=132 or x!=133 or x!=134 or x!=135 or x!=136 or x!=137 or x!=138 or x!=139 or x!=140 or x!=141 or x!=142 or x!=143 or x!=144 or x!=145
	{
	if  y!=75 or y!=76 or y!=77 or y!=78 or y!=79 or y!=80 or y!=81 or y!=82 or y!=83 or y!=84 or y!=85 or y!=86 or y!=87 or y!=88 or y!=89 or y!=90 or y!=91 or y!=92 or y!=93 or y!=94 or y!=95
		{
		ControlFocus, , ahk_id %dummy%
		}
	else 
		Click
	}
}
return

F10::ExitApp

Guiclose:
ExitApp

Вычислил положения Edit1, и если клик произошёл не на нём, он фокусируется на пустышку, а если на нём... то должен был быть Click, но он не происходит.
Как же быть?

AutoHotkey - 1.1.32.00

7

Re: AHK: Деактивация строки ввода

Чтобы проверить все значения из интервала на равенство, не обязательно их все перечислять, достаточно узнать, находится ли искомое внутри него, указав для сравнения границы интервала, например:


x := 45
if (x > 44 && x < 146)
	MsgBox, x внутри диапазона
else
	MsgBox, x вне диапазона 

Полю Edit нужно присвоить переменную, тогда при клике в него "A_GuiControl" будет содержать её имя, а значит, если "A_GuiControl" не равно этому имени, а ещё лучше, пустое, то фокусироваться на пустышке, хендл которой нужно объявить глобальным, чтобы к нему можно было обращаться из тела функции DummyClick():


Global dummy
GUI, Add, Edit, Center y75 x45 w100 h20 vmyEdit
GUI, Add, Picture, +HWNDdummy
GUI, Add, Button, gNBTTN, knopka
GUI, Show, w200 h200
OnMessage(0x202, "DummyClick")
ControlFocus, , ahk_id %dummy%
Return
NBTTN:
	MsgBox,,Title, Knopka
Return
DummyClick() {
	if (A_GuiControl == "")
		ControlFocus, , ahk_id %dummy%
}

8

Re: AHK: Деактивация строки ввода

В вашем примере получится, что если будет Edit без переменной, то его нельзя будет активировать, то есть надо назначать переменные для всех контролов.

Может проще смотреть клик в окно или в заголовок, и в этом случае фокусировать пустышку.


GUI, +HWNDhGui
GUI, Add, Edit, Center w100 h20  
GUI, Add, Edit, Center xp y+5 wp hp     
GUI, Add, Edit, Center xp y+5 wp-22 hp
GUI, Add, Text, xp y+5 wp hp border
GUI, Add, Text, w0 h0 Hidden +HWNDhDummy
GUI, Add, Button, , knopka
GUI, Show 
OnMessage(0x201, "DummyClick")  ;	WM_LBUTTONDOWN 
OnMessage(0x202, "DummyClick")  ;	WM_LBUTTONUP 
OnMessage(0xA1, "DummyClick")  ;	WM_NCLBUTTONDOWN   
ControlFocus, , ahk_id %hDummy%
Return 

DummyClick(wParam, lParam, msg, hwnd) { 
	Global
	if (hwnd = hGui || msg = 0xA1)  ;	0xA1 := WM_NCLBUTTONDOWN
		ControlFocus, , ahk_id %hDummy% 
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: serzh82saratov, 2018-08-12 00:43:57)

Re: AHK: Деактивация строки ввода

Проще так:

Gui, Add, Edit, Center w100 h20  
Gui, Add, Edit, Center xp y+5 wp hp     
Gui, Add, Edit, Center xp y+5 wp-22 hp
Gui, Add, Text, xp y+5 wp hp border
Gui, Add, Text, w0 h0 Hidden +HWNDhDummy
Gui, Add, Button, , knopka
Gui, Show

for, k, v in {WM_LBUTTONDOWN:0x201,WM_LBUTTONUP:0x202,WM_NCLBUTTONDOWN:0xA1} 
	fn := Func("DummyClick"), OnMessage(v, fn) 
	
ControlFocus, , ahk_id %hDummy%
Return 

DummyClick(wParam, lParam, msg, hwnd) { 
	Global
	if !DllCall("GetParent", Ptr, hwnd)
		ControlFocus, , ahk_id %hDummy%
	Else
		ControlFocus, , ahk_id %hwnd%
} 

Всё таки надо добавить Else ControlFocus, , ahk_id %hwnd%, так как Static может иметь метку перехода, и быть видимым для кликов, но не перехватывать фокус.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Деактивация строки ввода

Всем большое спасибо за ответы. Всё получилось!

AutoHotkey - 1.1.32.00

11

Re: AHK: Деактивация строки ввода

А можно узнать, почему у вас возник такой вопрос?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: Gutalin, 2018-08-11 17:40:07)

Re: AHK: Деактивация строки ввода

serzh82saratov, используя Ваш код, возникла проблема со сменой языка в окне скрипта. Вот надо мне не "я", a "z", или наоборот, а изменить нельзя т.к. строка ввода остаётся активной и shift+alt перехватывает скрипт.

AutoHotkey - 1.1.32.00

13

Re: AHK: Деактивация строки ввода

Кстати самому это не нравилось, добавил опционально, так как это не стандартное поведение. Ищите в описании "KillFocus".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Деактивация строки ввода

serzh82saratov, как бы я не вставлял

Hotkey_Arr("KillFocus", true)

перед созданием контроллов, у меня это не работает. Или я что-то не так делаю?
Беру пример из поста, после первого return вставляю библиотеку и перед созданием edit'ов вставляю эту строку

Hotkey_Arr("KillFocus", true)
Gui, Add, Edit, Center w300 r1 hwndhMyHotkey1 gWriteIni, % Hotkey_Read("MyHotkey1", "Section", PathIni)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey2 gWriteIni, % Hotkey_Read("MyHotkey2", "Section", PathIni)
AutoHotkey - 1.1.32.00

15

Re: AHK: Деактивация строки ввода

Да, неправильно. Задайте вопрос по ссылке "Тема для обсуждения" из того топика, а то здесь уже совсем оффтоп.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Деактивация строки ввода

ypppu пишет:

Пока окно активно, фокус обязательно будет на каком-нибудь элементе управления

А в хроме не так.
Окно активно, контрол присутствует, но  фокус пустой.
Видимо зависит от того, в каком фреймворке создавать.

17

Re: AHK: Деактивация строки ввода

Я говорил про "любую область окна самого скрипта". В GUI используются стандартные элементы управления, в хроме наверно какие-то свои.

18 (изменено: Malcev, 2018-08-18 19:44:10)

Re: AHK: Деактивация строки ввода

Со стандартными, при создании окна тоже можно убрать фокус:

GUI +0x10000000 ; WS_VISIBLE
Gui, add, edit, Center y75 x45
Gui, show, w200 h200
return

Полагаю, что можно провернуть это дело и по горячей кнопке.

19

Re: AHK: Деактивация строки ввода

Проще так:

Gui, Show, w200 h200
Gui, Add, Edit
return

Но, имхо, это не вариант.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: Malcev, 2018-08-20 17:50:09)

Re: AHK: Деактивация строки ввода

Может дело в том, что gui ahk показывается как Dialog Box, а не как Client Object (если смотреть через MSAA).
Например, в этом коде при каждой активации окна в фокусе находится Client:

;[updated: 2017-04-19]

#SingleInstance force
#KeyHistory 0
#UseHook
#NoEnv
ListLines, Off
Menu, Tray, Click, 1
AutoTrim, Off

#Persistent
DetectHiddenWindows, On
;SplitPath, A_ScriptName,,,, vScriptNameNoExt
;Menu, Tray, Tip, % vScriptNameNoExt

;AHK v1.1 script
;remake by jeeswg of:
;[tutorial] Creating windows without GUI commands - Scripts and Functions - AutoHotkey Community
;https://autohotkey.com/board/topic/21124-tutorial-creating-windows-without-gui-commands/

hFont := JEE_FontCreate("Courier New", 10)
JEE_ConstantsWinStyles()

vText := " ;continuation section
(LTrim
	Volume in drive C has no label.
	Volume Serial Number is B857-7430

	Directory of C:\Documents and Settings\mmilic

	07.09.2007  16:18    <DIR>          .
	07.09.2007  16:18    <DIR>          ..
	07.09.2007  10:12    <DIR>          Desktop
	19.01.2007  16:01    <DIR>          Favorites
	28.08.2007  15:28    <DIR>          My Documents
	07.09.2007  16:18               532 out
	14.02.2007  16:57    <DIR>          Start Menu
	1 File(s)            532 bytes
	6 Dir(s)  180.445.904.896 bytes free
)"

;DT_EDITCONTROL := 0x2000 ;DT_NOPREFIX := 0x800
;DT_CALCRECT := 0x400 ;DT_NOCLIP := 0x100
;DT_EXPANDTABS := 0x40 ;DT_SINGLELINE := 0x20
;DT_WORDBREAK := 0x10
vLimW := 500, vLimH := 500
JEE_StrGetDim(vText, hFont, vTextW, vTextH, 0x2D50, vLimW, vLimH)

;==================================================

;create window class e.g. AutoHotkeyGUI
;hIcon := LoadPicture(A_AhkPath, "", vType) ;AHK icon
;hIconSm := LoadPicture(A_AhkPath, "w16 h16", vType) ;AHK icon
;hIcon := LoadPicture(A_AhkPath, "Icon-160", vType) ;AHK file icon
;hIconSm := LoadPicture(A_AhkPath, "w16 h16 Icon-160", vType) ;AHK file icon
hIcon := hIconSm := 0
JEE_RegisterClassExCFI("JEEClass", "MyWndProc", hIcon, hIconSm)

;==================================================

;create window
;SplitPath, A_ScriptName,,,, vScriptNameNoExt
SysGet, vCaptionH, 31 ;SM_CYSIZE

vWinClass := "JEEClass"
vWinText := A_ScriptName ;window title
vWinStyle := WS_SYSMENU ;start off hidden with WS_VISIBLE off
vWinExStyle := WS_EX_DLGMODALFRAME | WS_EX_ACCEPTFILES
vPosX := 100, vPosY := 100
vPosW := vTextW+40, vPosH := vTextH+vCaptionH+80
hWndParent := 0, hMenu := 0, hInstance := 0, vParam := 0
hGui := JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)

;==================================================

;create Static control
;SS_EDITCONTROL := 0x2000 ;SS_NOPREFIX := 0x80

vWinClass := "Static"
vWinText := vText
vWinStyle := WS_VISIBLE | WS_CHILD | 0x2080
vWinExStyle := 0
vPosX := 0, vPosY := 0, vPosW := vTextW, vPosH := vTextH
hWndParent := hGui, hMenu := 0, hInstance := 0, vParam := 0
hStatic := JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)

SendMessage, 0x30, % hFont, 1,, % "ahk_id " hStatic ;WM_SETFONT := 0x30

;pStaticProc := RegisterCallback("MyStaticProc", "")
;GWL_WNDPROC := -4
;vSfx := (A_PtrSize=8) ? "Ptr" : ""
;pStaticProcOld := DllCall("SetWindowLong" vSfx, Ptr,hStatic, Int,-4, Ptr,pStaticProc, Ptr)

;==================================================

;create Button control
vWinClass := "Button"
vWinText := "OK"
vWinStyle := WS_VISIBLE | WS_CHILD
vWinExStyle := 0
vPosX := 10, vPosY := vTextH+30, vPosW := 50, vPosH := 25
hWndParent := hGui, hMenu := 0, hInstance := 0, vParam := 0
hBtn := JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)

pBtnProc := RegisterCallback("MyBtnProc", "")
;GWL_WNDPROC := -4
vSfx := (A_PtrSize=8) ? "Ptr" : ""
pBtnProcOld := DllCall("SetWindowLong" vSfx, Ptr,hBtn, Int,-4, Ptr,pBtnProc, Ptr)

;==================================================

ControlFocus,, % "ahk_id " hBtn
WinShow, % "ahk_id " hGui
WinActivate, % "ahk_id " hGui
return

;==================================================

MyWndProc(hWnd, uMsg, wParam, lParam)
{
	DetectHiddenWindows, On
	global hGui, hBtn

	;VK_ESCAPE := 0x1B ;VK_RETURN := 0xD
	if (uMsg = 0x102) ;WM_CHAR := 0x102
	&& ((wParam = 0x1B) || (wParam = 0xD))
	&& (hWnd = hGui)
		DllCall("DestroyWindow", Ptr,hWnd)

	;BN_CLICKED := 0
	if (uMsg = 0x111) ;WM_COMMAND := 0x111
	&& (wParam >> 16 = 0) && (lParam = hBtn)
		DllCall("DestroyWindow", Ptr,hWnd)

	return DllCall("DefWindowProc", Ptr,hWnd, UInt,uMsg, UPtr,wParam, Ptr,lParam, Ptr)
}

;==================================================

MyBtnProc(hWnd, uMsg, wParam, lParam)
{
	global pBtnProcOld, hGui

	;VK_ESCAPE := 0x1B ;VK_RETURN := 0xD
	if (uMsg = 0x102) ;WM_CHAR := 0x102
	&& ((wParam = 0x1B) || (wParam = 0xD))
		DllCall("DestroyWindow", Ptr,hGui)

	return DllCall("CallWindowProc", Ptr,pBtnProcOld, Ptr,hWnd, UInt,uMsg, UPtr,wParam, Ptr,lParam)
}

;==================================================

;;;FUNCTIONS

;JEE_FontCreate
;JEE_ConstantsWinStyles
;JEE_StrGetDim
;JEE_RegisterClassExCFI
;JEE_DCCreateWindowEx

;==================================================

;JEE_WinStylesInit
JEE_ConstantsWinStyles()
{
	global
	WS_OVERLAPPED := 0x0
	WS_TABSTOP := 0x10000
	WS_MAXIMIZEBOX := 0x10000
	WS_MINIMIZEBOX := 0x20000
	WS_GROUP := 0x20000
	WS_THICKFRAME := 0x40000
	WS_SYSMENU := 0x80000
	WS_HSCROLL := 0x100000
	WS_VSCROLL := 0x200000
	WS_DLGFRAME := 0x400000
	WS_BORDER := 0x800000
	WS_CAPTION := 0xC00000
	WS_OVERLAPPEDWINDOW := 0xCF0000
	WS_MAXIMIZE := 0x1000000
	WS_CLIPCHILDREN := 0x2000000
	WS_CLIPSIBLINGS := 0x4000000
	WS_DISABLED := 0x8000000
	WS_VISIBLE := 0x10000000
	WS_MINIMIZE := 0x20000000
	WS_CHILD := 0x40000000
	WS_POPUP := 0x80000000
	WS_POPUPWINDOW := 0x80880000

	WS_EX_LEFT := 0x0
	WS_EX_LTRREADING := 0x0
	WS_EX_RIGHTSCROLLBAR := 0x0
	WS_EX_DLGMODALFRAME := 0x1
	WS_EX_NOPARENTNOTIFY := 0x4
	WS_EX_TOPMOST := 0x8
	WS_EX_ACCEPTFILES := 0x10
	WS_EX_TRANSPARENT := 0x20
	WS_EX_MDICHILD := 0x40
	WS_EX_TOOLWINDOW := 0x80
	WS_EX_WINDOWEDGE := 0x100
	WS_EX_CLIENTEDGE := 0x200
	WS_EX_CONTEXTHELP := 0x400
	WS_EX_RIGHT := 0x1000
	WS_EX_RTLREADING := 0x2000
	WS_EX_LEFTSCROLLBAR := 0x4000
	WS_EX_CONTROLPARENT := 0x10000
	WS_EX_STATICEDGE := 0x20000
	WS_EX_APPWINDOW := 0x40000
	WS_EX_OVERLAPPEDWINDOW := 0x300
	WS_EX_PALETTEWINDOW := 0x188
}

;==================================================

JEE_DCCreateWindowEx(vWinExStyle, vWinClass, vWinText, vWinStyle, vPosX, vPosY, vPosW, vPosH, hWndParent, hMenu, hInstance, vParam)
{
	return DllCall("CreateWindowEx",UInt,vWinExStyle,Str,vWinClass,Str,vWinText,UInt,vWinStyle,Int,vPosX,Int,vPosY,Int,vPosW,Int,vPosH, Ptr,hWndParent, Ptr,hMenu,Ptr,hInstance,Ptr,vParam,Ptr)
}

;==================================================

;e.g. hFont := JEE_FontCreate("Arial", 12, "bius")

;JEE_CreateFont
JEE_FontCreate(vName, vSize, vFontStyle="", vWeight="")
{
	vHeight := -DllCall("kernel32\MulDiv", Int,vSize, Int,A_ScreenDPI, Int,72)
	vWidth := 0
	vEscapement := 0
	vOrientation := 0
	vWeight := (InStr(vFontStyle, "b") && (vWeight="")) ? 700 : 400
	vItalic := InStr(vFontStyle, "i") ? 1 : 0
	vUnderline := InStr(vFontStyle, "u") ? 1 : 0
	vStrikeOut := InStr(vFontStyle, "s") ? 1 : 0
	vCharSet := 0
	vOutPrecision := 0
	vClipPrecision := 0
	vQuality := 0
	vPitchAndFamily := 0
	vFaceName := vName
	vOutPrecision := 3
	vClipPrecision := 2
	vQuality := 1
	vPitchAndFamily := 34
	return DllCall("CreateFont", Int,vHeight, Int,vWidth, Int,vEscapement, Int,vOrientation, Int,vWeight, UInt,vItalic, UInt,vUnderline,UInt,vStrikeOut, UInt,vCharSet, UInt,vOutPrecision,UInt,vClipPrecision,UInt,vQuality,UInt,vPitchAndFamily,Str,vFaceName,Ptr)
}

;==================================================

JEE_RegisterClassExCFI(vWinClass, vFunc, hIcon=0, hIconSm="")
{
	pWndProc := RegisterCallback(vFunc, "F")
	hCursor := DllCall("LoadCursor", Ptr,0, Ptr,32512, Ptr) ;IDC_ARROW := 32512
	if (hIconSm = "")
		hIconSm := hIcon

	vPIs64 := (A_PtrSize=8)
	vSize := vPIs64?80:48
	VarSetCapacity(WNDCLASSEX, vSize, 0)
	NumPut(vSize, WNDCLASSEX, 0, "UInt") ;cbSize
	NumPut(3, WNDCLASSEX, 4, "UInt") ;style
	NumPut(pWndProc, WNDCLASSEX, 8, "Ptr") ;lpfnWndProc
	NumPut(0, WNDCLASSEX, vPIs64?16:12, "Int") ;cbClsExtra
	NumPut(0, WNDCLASSEX, vPIs64?20:16, "Int") ;cbWndExtra
	NumPut(0, WNDCLASSEX, vPIs64?24:20, "Ptr") ;hInstance
	NumPut(hIcon, WNDCLASSEX, vPIs64?32:24, "Ptr") ;hIcon
	NumPut(hCursor, WNDCLASSEX, vPIs64?40:28, "Ptr") ;hCursor
	NumPut(16, WNDCLASSEX, vPIs64?48:32, "Ptr") ;hbrBackground
	NumPut(0, WNDCLASSEX, vPIs64?56:36, "Ptr") ;lpszMenuName
	NumPut(&vWinClass, WNDCLASSEX, vPIs64?64:40, "Ptr") ;lpszClassName
	NumPut(hIconSm, WNDCLASSEX, vPIs64?72:44, "Ptr") ;hIconSm
	return DllCall("RegisterClassEx", Ptr,&WNDCLASSEX, UShort)
}

;==================================================

;JEE DrawText
JEE_StrGetDim(vText, hFont, ByRef vTextW, ByRef vTextH, vDTFlags:=0x400, vLimW:="", vLimH:="")
{
	;DT_EDITCONTROL := 0x2000 ;DT_NOPREFIX := 0x800
	;DT_CALCRECT := 0x400 ;DT_NOCLIP := 0x100
	;DT_EXPANDTABS := 0x40 ;DT_SINGLELINE := 0x20
	;DT_WORDBREAK := 0x10

	;HWND_DESKTOP := 0
	hDC := DllCall("user32\GetDC", Ptr,0, Ptr)
	hFontOld := DllCall("gdi32\SelectObject", Ptr,hDC, Ptr,hFont)
	VarSetCapacity(SIZE, 8, 0)
	vTabLengthText := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
	DllCall("GetTextExtentPoint32", Ptr,hDC, Str,vTabLengthText, Int,52, Ptr,&SIZE)
	vTabLength := NumGet(SIZE, 0, "Int")
	vTabLength := Floor((vTabLength/52)+0.5)
	vTabLength := Round(vTabLength*(72/A_ScreenDPI))
	vLen := StrLen(vText)

	VarSetCapacity(DRAWTEXTPARAMS, 20, 0)
	NumPut(20, DRAWTEXTPARAMS, 0, "UInt") ;cbSize
	NumPut(vTabLength, DRAWTEXTPARAMS, 4, "Int") ;iTabLength
	;NumPut(0, DRAWTEXTPARAMS, 8, "Int") ;iLeftMargin
	;NumPut(0, DRAWTEXTPARAMS, 12, "Int") ;iRightMargin
	NumPut(vLen, DRAWTEXTPARAMS, 16, "UInt") ;uiLengthDrawn

	VarSetCapacity(RECT, 16, 0)
	if !(vLimW = "")
		NumPut(vLimW, RECT, 8, "Int")
	if !(vLimH = "")
		NumPut(vLimH, RECT, 12, "Int")
	DllCall("user32\DrawTextEx", Ptr,hDC, Str,vText, Int,vLen, Ptr,&RECT, UInt,vDTFlags, Ptr,&DRAWTEXTPARAMS)
	DllCall("gdi32\SelectObject", Ptr,hDC, Ptr,hFontOld)
	DllCall("user32\ReleaseDC", Ptr,0, Ptr,hDC)

	vTextW := NumGet(RECT, 8, "Int")
	vTextH := NumGet(RECT, 12, "Int")
}

;==================================================