【发布时间】:2019-01-18 18:03:06
【问题描述】:
什么可能导致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;
【问题讨论】:
-
窗口是你的窗口吗?由调用
ShowCaret和SetCaretPos的进程创建?可能的故障模式是受密码保护的屏幕保护程序。哪个版本的操作系统? -
@DavidHeffernan 是的,我的窗口。 Windows 7 x64
-
该代码对我来说看起来不错。我现在没有主意了。