ソフトウェア開発 Win32プログラミング

別のデスクトップを作成する

戻る


仮に公共の施設にタッチパネルで操作できるコンピュータ端末を設置し、 その端末でWebブラウザ プログラムを常に起動しておく場合を考えてみよう。

そういうときはタスクバーやタイトルバーを 表示しない「キオスクモード」という状態にしたいかも知れない。

ただ、WS_EX_TOPMOST拡張スタイルで表示させたいウィンドウを最前面に表示させても、 Windowsのセキュリティの通知やウイルス対策ソフトなどで、 突然、バルーンやタスクバー、ポップアップウィンドウなどが出てきたりすることがある。

それを防ぐためには、別にデスクトップを作成してウィンドウを 別の画面に切り替えておくとよい。そのコード例を以下に示す。

#include <windows.h>

VOID TestDesktop(VOID)
{
    HDESK hNewDesk, hOldDesk, hInputDesk;
    CONST DWORD Access = DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
        DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS |
        DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK |
        DESKTOP_JOURNALRECORD;
 
    hOldDesk = GetThreadDesktop(GetCurrentThreadId());
    if (hOldDesk == NULL)
    {
        MessageBox(NULL, TEXT("ERROR: GetThreadDesktop"), NULL, 0);
        return;
    }
 
    hInputDesk = OpenInputDesktop(0, FALSE, Access);
    if (hInputDesk == NULL)
    {
        MessageBox(NULL, TEXT("ERROR: OpenInputDesktop"), NULL, 0);
        return;
    }
 
    hNewDesk = CreateDesktop(TEXT("NewDesktop"), NULL, NULL, 0, Access, NULL);
 
    if(hNewDesk == NULL) {
        MessageBox(NULL, TEXT("ERROR: CreateDesktop"), NULL, 0);
        CloseDesktop(hInputDesk);
        return;
    }
 
    SetThreadDesktop(hNewDesk);
    SwitchDesktop(hNewDesk);
 
    MessageBox(NULL, TEXT("新しいデスクトップです。"), TEXT("TestDesktop"), 0);
 
    SwitchDesktop(hInputDesk);
    SetThreadDesktop(hOldDesk);
    
    CloseDesktop(hNewDesk);
    CloseDesktop(hInputDesk);
}
 
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    TestDesktop();
    return 0;
}

このサンプルは、新しく作成したデスクトップに切り替えてメッセージボックスを表示し、 メッセージボックスが閉じられた後、また元のデスクトップに戻る。

なお、このコードは、Windows NT系でしか動かないので注意しよう。

ソース: desktop.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system