2016-05-15 20 views
1

タスクバーのハンドルを取得するためのWinAPI関数はありますか?タスクバーへのハンドルを取得します。

目的は、タスクバーのドッキング設定(ABE_LEFT、ABE_RIGHT、ABE_BOTTOM、ABE_TOP)を決定することです。 SHAppBarMessage関数は、ドッキング情報を取得するためにタスクバーハンドルが必要です。ハンドルを必要とせずにタスクバーのドッキング設定を決定する別の方法がないかぎり?

私は大丈夫動作しますが、私はそれがすべてのバージョンのWindows上で動作を確認していないこの方法を知ってる:

HWND taskBar = FindWindow("Shell_TrayWnd", NULL); 
+0

Windows 7までは動作するはずです。 Windows 8以上が変更されました。詳細については、[この質問](http://stackoverflow.com/questions/9569620/how-do-i-get-a-handle-to-the-start-button-in-windows-7)を参照してください。 – t0mm13b

答えて

1

ドキュメントのバグのように見えます。 SHAppBarMessage1)を呼び出すときにABM_GETTASKBARPOSAPPBARDATA構造体にウィンドウハンドルを用意する必要はありません。

次のコードは、適切に(Windowsの10のx64上でテスト)タスクバーの位置を返します。

#include <shellapi.h> 
#pragma comment(lib, "Shell32.lib") 
#include <stdexcept> 

RECT GetTaskbarPos() { 
    APPBARDATA abd = { 0 }; 
    abd.cbSize = sizeof(abd); 
    if (!::SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) { 
     throw std::runtime_error("SHAppBarMessage failed."); 
    } 
    return abd.rc; 
} 

アップデート:質問は本当にドッキング列挙値を求めていました。それは同様に返されます:あなたはこのメッセージを送信するために、タスクバーのも隠されたウィンドウハンドルを必要に応じて

#include <shellapi.h> 
#pragma comment(lib, "Shell32.lib") 
#include <stdexcept> 

UINT GetTaskbarDockingEdge() { 
    APPBARDATA abd = { 0 }; 
    abd.cbSize = sizeof(abd); 
    if (!::SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) { 
     throw std::runtime_error("SHAppBarMessage failed."); 
    } 
    return abd.uEdge; 
} 


1) それは厄介だろう。ウィンドウハンドルが既にある場合は、代わりにGetWindowRectと単に呼び出すことができます。

+0

タスクバーが複数のモニタ上にあるときに、これがどのように処理されるのだろうか。 –

+1

@ JonathanPotter:これは、プライマリディスプレイのタスクバー位置のみを取得します。他のディスプレイでタスクバーの位置を取得するには、[GetMonitorInfo](https://msdn.microsoft.com/en-us/library/dd144901.aspx)を呼び出します。 – IInspectable

+0

@JonathanPotter: 'GetMonitorInfo'を呼び出すときは、自分でドッキングする必要があります。これは[MONITORINFO](https://msdn.microsoft.com/en-us/library/dd145065.aspx)構造の一部ではありません。 – IInspectable

関連する問題