コード署名なしでオーバーレイWindowsStoreアプリ(UWP)


免責事項:この投稿はmy own blog

導入
私は発見するには、単にオーバーレイメトロ/UWP/Windowsストアのアプリ(または何かは、これらの日と呼ばれる)トップウィンドウで常に使用することはできません.
それが可能である間、私は学びました、プログラムを働かせるためにuiAccess=True -フラグがマニフェストに設定され、署名されなければならない.
それはもちろん、任意の趣味や小さなオープンソースプロジェクトのための良いニュースではなく、コード署名証明書のお金の費用です.
しかし、別の方法があります.
まず最初に、フルスクリーンストアのアプリを実行している間、どんな古い「常にトップ」ウィンドウにもフォーカスしようとするとどうなるか見ましょう.
それが起こるならば、それは「フルスクリーン」モードでWindows Storeアプリを引き起こします.
にもかかわらず、ストアのアプリは本当に排他的なフルスクリーンで実行することはありません!

しかし、いくつかのプログラムは完全にこれを行うことができます.Windows Taskbar自体またはDisplayFusions中間ロードウィンドウのように.

私はDisplayFusionの開発者に彼らがそれをしている方法を尋ねました、そして、彼らは私と秘密を共有しました:上記uiAccess=True -署名付き実行可能ファイルと一緒にフラグを設定します.
For my endless quest 取得でSteam Input to work with stuff it normally doesn't , Windowsストアアプリのオーバーレイは本当の恩恵になるだろう.
しかし、無料のプロジェクトのために1年につき100ドルを費やすこと、私が適切に維持して、支持するためにあまりに少しの時間があるということは、あまりにも魅力的に見えません.
幸いにも、少しのハッキングで、文書化されていないWindows APIを使用して、私はそれがうまく動作するようになった.
私は全体のプロセスはかなり興味深いと思うので、私はあなたとそれを共有したい.

ウィンドウzオーダー
Windows 10(win 8からのアップ)におけるZ順序付けはいわゆる「窓バンド」で動作する
(いくつかの)バンドの順番は、最低から最高まで、以下の通りです.
  • デスクトップ
  • ZidCity没入型の背景
  • アピクローム
  • シビッツェマジョウモゴ
  • リトルビッグプラネット
  • Zidchen InvesiveLes通知
  • シビッツェイマージュ
  • ZidCityシステムツール
  • ZidBlock lock ( win 10 )
  • <高橋潤子>
  • シビケントイマーム
  • ウィンドウズZidchen
  • Zidchen Uiaccess

  • あなたがなぜ前に「窓バンド」のことを聞いたかについて疑問に思っているならば、それはあなたが通常彼らを使用するようにならないという理由です(明示的に).
    すべてのAPIは文書化されていなくて、マイクロソフトによって公的に利用できません.
    しかし、我々はそれに着きます.
    通常の古いウィンドウはZBID_DESKTOP そして、そこに残ります.
    常にウィンドウを設定するSetWindowPos(...) だけで内部の順序を変更しますZBID_DESKTOP -バンド.
    これに対する期待は、例えば前述のuiAccess=True -フラッグ
    符号付き実行可能ファイルを持つ.で、ウィンドウはZBID_UIACCESS-バンド.
    もしZBID_DESKTOP -“フルスクリーン”-モードでは、店のアプリを実行している間、ウィンドウは“触れ”を取得、ストアアプリケーションが最小化されます.
    他のバンドは必ずしもその行動を起こすわけではない.

    他のウィンドウバンドの使用

    コード
    開花
    enum ZBID
    {
        ZBID_DEFAULT = 0,
        ZBID_DESKTOP = 1,
        ZBID_UIACCESS = 2,
        ZBID_IMMERSIVE_IHM = 3,
        ZBID_IMMERSIVE_NOTIFICATION = 4,
        ZBID_IMMERSIVE_APPCHROME = 5,
        ZBID_IMMERSIVE_MOGO = 6,
        ZBID_IMMERSIVE_EDGY = 7,
        ZBID_IMMERSIVE_INACTIVEMOBODY = 8,
        ZBID_IMMERSIVE_INACTIVEDOCK = 9,
        ZBID_IMMERSIVE_ACTIVEMOBODY = 10,
        ZBID_IMMERSIVE_ACTIVEDOCK = 11,
        ZBID_IMMERSIVE_BACKGROUND = 12,
        ZBID_IMMERSIVE_SEARCH = 13,
        ZBID_GENUINE_WINDOWS = 14,
        ZBID_IMMERSIVE_RESTRICTED = 15,
        ZBID_SYSTEM_TOOLS = 16,
            // Win10
        ZBID_LOCK = 17,
        ZBID_ABOVELOCK_UX = 18,
    };
    
    CreateWindowInband
    と同じCreateWindowEx もう一つのパラメータを除いてdwBand ウィンドウを指定する場所.
    HWND WINAPI CreateWindowInBand(
         DWORD dwExStyle,
         LPCWSTR lpClassName,
         LPCWSTR lpWindowName,
         DWORD dwStyle,
         int x,
         int y,
         int nWidth,
         int nHeight,
         HWND hWndParent,
         HMENU hMenu,
         HINSTANCE hInstance,
         LPVOID lpParam,
         DWORD dwBand);
    
    シートネーションバンド
    と同じSetWindowPos もう一つのパラメータを除いてdwBand
    BOOL WINAPI SetWindowBand(
         HWND hWnd, 
         HWND hwndInsertAfter, 
         DWORD dwBand);
    
    ジオバンド
    BOOL WINAPI GetWindowBand(
         HWND hWnd, 
         PDWORD pdwBand);
    

    APIを呼び出す?
    これらのすべての関数はuser32.dll , だからあなたはGetProcAdress それらを得るために.
    しかし、マイクロソフトは彼らの使用を防ぐいくつかのチェックを実装しました.
  • GetWindowBand 常に動作します.
  • CreateWindowInBand/Ex あなたが通るならば、働くだけですZBID_DEFAULT or ZBID_DESKTOP ZBID_UIACCESS は、uiAccess=True -フラグセットとコード署名.
  • SetWindowBand は動作しません.

  • とにかく呼び出すこと.
    CreateWindowInband
    使うCreateWindowInBand 任意のZPIDを使用すると、aを注入する必要があります.没入型のプロセスへのDLLProcessExplorer ) そこから電話してください.
    setwindowinbandSetWindowBand もう少し面白い.そのためには、aを注入しなければなりません.へのexplorer.exe フックSetWindowBand トランポリンで.
    StartMenuが開き、新しいウィンドウが作成されると、その関数が呼び出されます.
    今、あなたは2回、元の関数を呼び出すことができます.
    一度、別のhwndとzbidとし、元のパラメータを使用します.
    これの完全な例は見つかりますhere

    結論
    ウィンドウズストアアプリの導入により、マイクロソフトはウィンドウの順序付けをより詳細に制御するためにウィンドウバンドの概念も導入した.
    多くのバンドが利用可能ですが、それらを明示的に使用することはできません.
    ハッキングのビットで、しかし、それは完全に自由に任意のウィンドウバンドを活用することが可能です.
    などGloSC/GlosSI ( SteamInputのツールを一緒に扱いました).

    クレジット/ソース:adltax