gpt4 book ai didi

c++ - ShowCaret 和 SetCaretPos 因 ERROR_ACCESS_DENIED 而失败

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:46 25 4
gpt4 key购买 nike

什么会导致 ShowCaretSetCaretPos 失败并返回 ERROR_ACCESS_DENIED

我在 WM_CREATE 中创建插入符号并在 WM_COMMAND 中显示插入符号。我检查了一下,CreateCaret 正在成功执行。

它们应该在同一个线程中运行。

在调用 ShowCaret 更新窗口内容之前,我使用了 SetScrollInfoInvalidateRect。但我不认为这些会导致 ShowCaret 失败..

相关代码:

#define CHAR_WIDTH  7
#define CHAR_HEIGHT 12

case WM_CREATE:
CreateCaret(hWnd, NULL, CHAR_WIDTH, 2);
UpdateScrollbar(hWnd); // calls SetScrollInfo. initially nMin and nMax are both 0
return 0;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_OPENFILE:
if (DoOpenFile(hWnd))
{
InvalidateRect(hWnd, NULL, TRUE);
UpdateScrollbar(hWnd);

if (SetCaretPos(CHAR_WIDTH * 12, CHAR_HEIGHT - 1) == 0)
{
char ss[33];
sprintf_s(ss, "DEBUG 2: %d\n", GetLastError());
OutputDebugString(ss);
}

if (ShowCaret(hWnd) == 0)
{
char ss[33];
sprintf_s(ss, "DEBUG 3: %d\n", GetLastError());
OutputDebugString(ss);
}
}
break;
}
return 0;

最佳答案

是的,您没有正确执行此操作。每个消息队列(换句话说,每个线程)只有一个插入符号。当另一个窗口已经有插入符号时,您不能创建插入符号,最有可能的情况是编辑框。在您的窗口接收到焦点 WM_SETFOCUS 消息之前,您不得创建插入符号或显示它。当窗口失去焦点时,您必须销毁它,WM_KILLFOCUS 消息。

您使用 GetLastError() 的方式也很危险,尽管您现在可能已经摆脱了它。在 C 或 C++ 中评估参数的顺序是不确定的。您冒着其中一个参数表达式更改错误代码的风险。在调用其他任何东西之前始终获取错误代码,并将其存储在局部变量中。

并且从不跳过错误检查,至少你必须 assert() 返回值。 CreateCaret() 调用现在可能会失败,因为刚刚创建的窗口永远不会获得焦点。

关于c++ - ShowCaret 和 SetCaretPos 因 ERROR_ACCESS_DENIED 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com