Autohotkey DLLcall для CreateCaret возвращает 0 (функция не выполнена), но A_LastError также равно 0 (функция выполнена успешно) - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь использовать простой AHK DLLCall для функции API user32 CreateCaret . Я хочу, чтобы блокнот был выделен жирным шрифтом.

caretWidth := 10
NULL := 0
Ptr := A_PtrSize ? "Ptr" : "UInt" ; If A_PtrSize is not defined, use UInt instead.
WinHwnd := WinExist("A")
result := Dllcall("CreateCaret", Ptr, WinHwnd, Ptr, NULL, "Int", caretWidth, "Int", 0)
msgbox % "LE " A_lasterror  ; Gives LE 0
msgbox % result  ; Gives 0

Это должно быть эквивалентно следующему вызову c ++:

CreateCaret(0x37072c, NULL, 10, 0);

Умышленное искажение имени функции делает результат пустым, поэтому Я считаю, что функция вызывается правильно. Я просто не знаю, почему он не работает

Использование аналогичного кода для GetCursorBlinkRate возвращает разумное число.

Я также пытался с caretWidth := 0

Подобные вопросы около GetLastError - это вызовы c ++, и AHK предположительно гарантирует, что GetLastError вызывается достаточно своевременно, чтобы убедиться, что A_lasterror установлен правильно. Почему он не показывает код ошибки, когда функция явно не работает?

1 Ответ

1 голос
/ 24 апреля 2020

Вы не можете изменить каркас внешнего процесса.
Если вы, например, попробуете это, вы увидите, что он отлично работает, если вы владеете процессом:

#Persistent
Gui, +hwndHWND
Gui, Add, Edit
Gui, Show

DllCall("CreateCaret", Ptr, HWND, Ptr, 0, Int, 50, Int, 50)
DllCall("ShowCaret", Ptr, HWND)

ESC::
GuiClose:
ExitApp
...