2

AppBar API を使用して、画面の上部にアプリケーション バーとしてインストールする Windows アプリがあります (Windows タスク バー自体に似ています)。これはうまく機能し、それに応じてデスクトップのサイズが調整されるため、アプリケーションは常に表示されます。

ただし、ユーザーが [デスクトップの表示] (Windows + D) を選択すると、アプリケーションが非表示になります。「デスクトップの表示」をトラップしてアプリケーションが表示されたままになるようにする方法を知っている人はいますか (Windows はすべてのトップレベル ウィンドウを列挙し、ShowWindow(SW_HIDE) で非表示にすると仮定します)。

4

4 に答える 4

1

次のコードを使用して、フォームの読み込み中にウィンドウ ハンドルを関数に渡します。うまくいけば、これで問題が解決します。

public void SetFormOnDesktop(IntPtr hwnd)
{
    IntPtr hwndf = hwnd;
    IntPtr hwndParent = FindWindow("ProgMan", null);
    SetParent(hwndf, hwndParent);
}
于 2010-01-05T12:34:09.983 に答える
0

( SetWindowPosおよび HWND_TOPMOST フラグを使用して)ウィンドウを最上位ウィンドウとして設定すると、デスクトップがウィンドウを覆うことができないという印象を受けました。Windows+D は、すべてのウィンドウを最小化してから、デスクトップを z オーダーで上げることによって最小化できないウィンドウを覆い隠します (とにかく、ある時点ではそうでした)。WS_MINIMIZEBOX を CreateWindowEx に渡さないか、WS_EX_TOOLWINDOW を使用することで、ウィンドウを最小化できないようにできると思いますが、その部分については 100% ではありません。

SetWindowsHookEx と KeyboardProc を使用してグローバル キーボードをフックするのは、より手間のかかる方法です。これは、ユーザー エクスペリエンスに悪影響を及ぼします。


私が話していることの本当に簡単な例をコード化しました。次のコードは、最小化されていないか、ユーザーが Windows+D を押したときに覆われていないウィンドウを作成します。Windows 7 では、デスクトップ上のガジェットを引き続きその上に移動できることに注意してください。私には本当に説明できません。

#include <windows.h>
#include <tchar.h>

#define WIN_TITLE _T("Resists Win+D Window")
#define WIN_CLASS _T("Resists Win+D Class")

LRESULT CALLBACK CustomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    //Special behavior goes here

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = CustomWndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = WIN_CLASS;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
        exit(1);
    }

    HWND hWnd = CreateWindowEx(
        WS_EX_TOOLWINDOW,
        WIN_CLASS,
        WIN_TITLE,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        500,
        100,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    if (!hWnd)
    {
        exit(1);
    }

    return hWnd;
}

/*
  Main entry point
*/
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hwnd = CreateMainWindow(hInstance);

    ShowWindow(hwnd, nCmdShow);
    SetWindowPos(hwnd, HWND_TOPMOST, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOSIZE);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}
于 2009-05-22T03:43:07.433 に答える