RocketDockがVistaで最小化アニメーションをリダイレクトして、ウィンドウがドックに最小化されるのを見てきましたが、これがどのように行われたのか興味があります。実際の最小化アニメーションはドックにリダイレクトされますか、それともWindowsがウィンドウを最小化するのを防ぐフックのようなもので、ウィンドウが最小化されたときにRocketDockにカスタムアニメーションがありますか?
3 に答える
私は「OpenMMT」と呼ばれるオープンソースのマルチモニタータスクバープロジェクトに取り組んでいます。私は最近(多くの頭痛の種を通して)これを達成する方法を発見しました。
以下の説明は、RegisterShellHookWindowの使用方法を理解していることを前提としています。
シェルフックを受け取るウィンドウプロシージャで、HSHELL_GETMINRECTを探します。
さて、これからは私が問題を抱えていたところです。MSDNによると、渡されたlparamメンバーには、「SHELLHOOK」オブジェクトへのポインターが含まれています。ただし、その構造の「rc」メンバーがWindowsヘッダーファイルの実際のRECT構造とは異なるRECTであるという単純な事実のために、これを機能させることはできませんでした。ヘッダーファイルのRECTは、メンバーにLONGを使用します。ここにあるように、SHORTが必要です。
とにかく、これが私がこれをどのように達成したかについての抜粋です。
定義する構造:
typedef struct {
SHORT left;
SHORT top;
SHORT right;
SHORT bottom;
} REALRECT, *LPREALRECT;
typedef struct {
HWND hWnd;
REALRECT rc;
} DOCUMENT_ME_RIGHT_MICROSOFT, *LPDOCUMENT_ME_RIGHT_MICROSOFT;
次に、ウィンドウ手順で:
case HSHELL_GETMINRECT:
{
LPDOCUMENT_ME_RIGHT_MICROSOFT lpShellHook = (LPDOCUMENT_ME_RIGHT_MICROSOFT)lParam;
// lpShellHook now contains all the info. If you want to change the location
// of the animation, simply change the lpShellHook->rc members to point
// to the right coordinates and then return TRUE;
return TRUE;
}
アプリケーションからプログラムを最小化すると、アニメーションがデフォルトで元のアニメーションに戻る場合がありました。私は次のようにそれらを最小化することによってこれを解決しました:
void MinimizeApp(HWND hWnd) {
SetForegroundWindow(hWnd);
ShowWindowAsync(hWnd, SW_MINIMIZE);
}
私のプロジェクトに関する詳細情報が必要な場合、またはソースを確認したい場合は、https://github.com/Fafson/OpenMMTでお気軽に行ってください。
構造体のptMinPosition
メンバーはWINDOWPLACEMENT
、ウィンドウが最小化されたときのウィンドウの座標を指定するため、SetWindowPlacement
関数を使用してその効果を得ることができます。ただし、一部のテストでは、ウィンドウにタスクバーボタンを配置してはいけないことが示されています(つまり、no WS_EX_APPWINDOW
)。
RocketDockがどのように機能するかはわかりませんが、これはグローバルWH_CBT
フックをインストールし、通知に基づいて(ex_styleを設定してから最小化された座標を設定する)実行することで実現できると思いHCBT_MINMAX
ます。
AnimateWindow API関数を使用して、それを渡すことができます(例:AW_HOR_POSITIVE | AW_VER_POSITIVEを使用して、斜めのアニメーションを取得します。
WM_SYSCOMMAND / SC_MINIMIZEをキャッチするグローバルフックから始め、AnimateWindowを使用して右上隅をターゲットにします。
これで目的の効果が得られない場合、次のステップは、WM_PRINT / WM_PRINTCLIENTを使用してウィンドウのコピーをビットマップに取り込み(これはAnimateWindowが内部で行うことだと思います)、ウィンドウを非表示にして独自のアニメーションを実行することです。 。