0

当我运行我的 Win32 应用程序时,Windows 语言栏(在所有其他应用程序中可见)在大约 5 秒后消失。如果我退出我的应用程序或 alt-tab 到另一个应用程序,它会重新出现。如果我 alt-tab 回到我的应用程序,它会在五秒钟后再次消失。切换键也不起作用。

似乎系统以某种方式得出结论认为我的应用程序不“支持”语言栏。

我需要做些什么来启用语言栏吗?或者我不应该做的事情会导致它消失?

该应用程序有一个自定义窗口(我在其中绘制 DirectX 图形)。我查看了我处理的参数CreateWindowRegisterClass窗口消息(而不是传递给DefWindowProc),但似乎没有任何内容与语言栏直接相关。

我只在 Windows 7 上测试过。

[更新]

这是一个简约的例子。当我编译并运行它时,语言栏会在五秒钟后消失:

#include <windows.h>

LRESULT CALLBACK wndproc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
    return DefWindowProcW(hwnd, umsg, wparam, lparam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSW wc;
    wc.style = CS_DBLCLKS;
    wc.lpfnWndProc = wndproc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = GetModuleHandle(nullptr);
    wc.hIcon = 0;
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground = 0;
    wc.lpszMenuName = 0;
    wc.lpszClassName = L"main_window";

    ATOM atom = RegisterClassW(&wc);

    DWORD win_style = WS_OVERLAPPEDWINDOW;

    RECT winrect;
    winrect.top = 100; winrect.bottom = 200; winrect.left = 100; winrect.right = 200;
    AdjustWindowRect(&winrect, win_style, false);

    HWND _hwnd = CreateWindowW(L"main_window", L"Application", win_style,
        winrect.left, winrect.top, winrect.right-winrect.left, winrect.bottom - winrect.top,
        0, 0, GetModuleHandle(0), 0);

    SetFocus(_hwnd);
    ShowWindow(_hwnd, SW_SHOW);
    UpdateWindow(_hwnd);

    MSG msg;
    while (true) {
        PeekMessage(&msg, _hwnd, 0, 0, PM_REMOVE);
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
4

1 回答 1

1

该片段正在过滤消息:它只会处理发送给您刚刚创建的窗口的消息,而不是发送给您的程序需要或使用的任何其他窗口的消息。查看 Raymond Chen 的“过滤窗口消息的危险”,网址为http://blogs.msdn.com/b/oldnewthing/archive/2005/02/09/369804.aspx

于 2013-11-05T18:16:37.380 回答