gpt4 book ai didi

winapi - 调试 WIN32 焦点错误

转载 作者:行者123 更新时间:2023-12-02 07:43:22 25 4
gpt4 key购买 nike

我正在开发一个包含一个主窗口和许多子窗口的 WIN32/C++ 应用程序,我正在寻找可以帮助我追踪焦点错误的工具。

特别是,我想要一个可以突出显示当前具有焦点的控件(或者告诉我当前没有控件具有焦点)的工具。此外,我在某处读到使用远程调试器可能有助于解决此类错误。知道怎么做吗?

更新:Jeffrey Richter 在 1997 年写了一篇文章,其中包含一个用于寻找焦点的工具:http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

最佳答案

Spy++ 消息日志将提供焦点更改的完整记录,但试图从日志中解码发生的事情是一件苦差事。 Spy++ 令人讨厌的 UI 无济于事。

远程调试很有用,因为调试器不会干扰应用程序的激活和焦点,但我不确定是否有一种简单的方法可以从调试器确定焦点窗口。这里有一个couplearticles在配置它。提示:如果它不起作用,请仔细检查您的 DCOM 和防火墙设置。

显然,最好找到一个能完全满足您需求的工具,但我找不到,而且我很无聊,所以我编写了这段代码。它创建一个半透明的蓝色窗口,位于焦点控件的顶部。它对点击是透明的,因此不应干扰您的应用的使用。

要初始化它,只需在程序初始化代码的某处创建一个计时器:

// Check the focus ten times a second
// Change hwndMain to your main application window
// Note that this won't work if you have multiple UI threads
::SetTimer(hwndMain, 1, 100, HighlightTimerProc);

并添加以下代码:

LRESULT CALLBACK HighlightWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NCHITTEST:
return HTTRANSPARENT;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

VOID CALLBACK HighlightTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// static locals are bad
static bool initialised = false;
static HWND hwndHighlight = 0;

if (!initialised)
{
HINSTANCE hInstance = 0;

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = HighlightWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = 0;
wcex.hbrBackground = (HBRUSH)(COLOR_HIGHLIGHTTEXT);
wcex.lpszMenuName = 0;
wcex.lpszClassName = L"HighlightWindowClasss";
wcex.hIconSm = 0;

ATOM atomHighlightClass = RegisterClassEx(&wcex);

hwndHighlight = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW,
(LPCTSTR)atomHighlightClass, L"", WS_POPUP,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

// Set opacity to 200/255
SetLayeredWindowAttributes(hwndHighlight, 0, 200, LWA_ALPHA);

initialised = true;
}

static HWND hwndCurrentHighlight = 0;

HWND hwndFocus = GetFocus();
if (hwndFocus != hwndCurrentHighlight)
{
if (hwndFocus == 0)
{
ShowWindow(hwndHighlight, SW_HIDE);
}
else
{
RECT rect;
GetWindowRect(hwndFocus, &rect);
MoveWindow(hwndHighlight, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, false);
ShowWindow(hwndHighlight, SW_SHOW);
}
hwndCurrentHighlight = hwndFocus;
}
}

关于winapi - 调试 WIN32 焦点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8868710/

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