2012-03-05 21 views
5

私が使用します。Windows 7で[スタート]ボタンのハンドルを取得するにはどうすればよいですか?

Hwnd hStart = ::FindWindow ("Shell_TrayWnd",NULL); // get HWND of taskbar first 
hStart = ::FindWindowEx (hStart, NULL,"BUTTON", NULL); // get HWND of start button 

ボタンのハンドルを開始取得します。 Windows XPでは が正しく動作していますが、Windows 7では::FindWindowEx (hStart, NULL,"BUTTON", NULL)が常に0を返し、GetLastError()も0を返します。

なぜですか?

+2

のためである私は、Windows 7のスタートボタンは、もはやクラス 'BUTTON'を持っていると仮定していないが、私は間違っている可能性があります。 Spy ++で現在の状況を確認できますが、[開始]ボタンのような基本的なUI要素を混乱させないよう強くお勧めします。あなたは何を達成しようとしていますか? –

+5

スタートボタンハンドルを持っていても、何をしますか? – Gabe

+0

ガベ、ちょうどフックについて勉強しています。 :) – Fish

答えて

7

Windows 7では、スタートボタンはクラス名が"Button"で、デスクトップウィンドウの子です。あなたのコードでは、開始ボタンが"Shell_TrayWnd"という名前のウィンドウの子であると想定しています。これは実際にはXP上でタスクバーとスタートメニューが実装された方法と思われます。私はそれはあなたが右のボタンを取得することを確認するために、名前でそれのためのより良い検索になると思いますが

hStart = ::FindWindowEx(GetDesktopWindow(), NULL, "Button", NULL); 

:あなたはこのようなものを使用するWindows 7の場合

hStart = ::FindWindowEx(GetDesktopWindow(), NULL, "Button", "Start"); 

私は、Vistaはそのタスクバーを実装し、スタートメニューかどうかはわかりませんが、あなたは見つけるためにスパイ++を使用することができます。

このように言っても、そのような実装固有の詳細を掘り下げずに目標を達成する方法を見つけることができれば、はるかに良いでしょう。

+10

そして、Windows 8ではすべてが完全に異なっていることを忘れないでください。 –

+5

@マークはい、家をきれいにしてそのようなハッキングを放棄するのに最適な時期になるでしょう –

+0

ありがとう! 'hWnd = :: FindWindow(" Button "、" Start ");'を試してみましたが、Windows 7では動作していますが、XPではNULLを返します。スタートボタンはタスクバーの子ウィンドウですXP、Windows 7では独立したウィンドウです。 :) – Fish

-2

:: FindWindow(L "Shell_TrayWnd"、NULL);

このコードは完全タスクバー