Autohotkey DLL 调用 CreateCaret returns 0(函数失败)但 A_LastError 也是 0(函数成功)

Autohotkey DLLcall to CreateCaret returns 0 (The function failed) but A_LastError is also 0 (The function succeeded)

我正在尝试使用简单的 AHK DLLCall 调用 user32 api 函数 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 returns 一个合理的数字。

我也试过 caretWidth := 0

关于 GetLastError 的类似问题是 c++ 调用,AHK 应该确保及时调用 GetLastError 以确保正确设置 A_lasterror。为什么明明函数失败却没有显示错误代码?

您无法更改外部进程的插入符号。
例如,如果您尝试这样做,如果您拥有该流程,您会发现它工作得很好:

#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