- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
什么会导致 ShowCaret
和 SetCaretPos
失败并返回 ERROR_ACCESS_DENIED
?
我在 WM_CREATE
中创建插入符号并在 WM_COMMAND
中显示插入符号。我检查了一下,CreateCaret
正在成功执行。
它们应该在同一个线程中运行。
在调用 ShowCaret
更新窗口内容之前,我使用了 SetScrollInfo
和 InvalidateRect
。但我不认为这些会导致 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/
什么会导致 ShowCaret 和 SetCaretPos 失败并返回 ERROR_ACCESS_DENIED? 我在 WM_CREATE 中创建插入符号并在 WM_COMMAND 中显示插入符号。我
我是一名优秀的程序员,十分优秀!