• ベストアンサー

VB.NETで、Windows Vistaのスタートボタンを消すプログ

VB.NETで、Windows Vistaのスタートボタンを消すプログラムをしています。 下記コードでタスクバーを消せるのですが、 hwnd = FindWindow("Shell_traywnd", vbNullString) value = SetWindowPos(hwnd, -1, 0, 0, 0, 0, &H80) value = FindWindowEx(hwnd, 0, "Button", vbNullString) EnableWindow(value, 0) で、スタートボタンを消せません。 何が悪いのかご教示いただけますでしょうか。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

画像UPお疲れ様です。 鮮明でよくみえますよ~ XPまでは ・FindWindowでタスクバーを探して ・FindWindowExでタスクバーの中のボタンを探す でしたが、添付画像を見る限り、タスクバーの中にボタンが無いようです。。。 どこへ行ったのやら。。。と思いきやっ・・・ よく画像を見てください。 「Shell_traywnd」の一個上 ありました!!!!! 「ウィンドウ 00010050 "スタート" Button」というのが!!! どうやら「タスクバー配下」から「デスクトップハンドル配下」に昇格しているようです。 ですので Dim hWndBtn As IntPtr = FindWindow("Button", "スタート") という感じかな? もしこれで取れなければ、デスクトップ配下でFindWindowExを利用した取得方法になると思います。 なぜ昇格したんだろう^^; http://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html

ten002
質問者

お礼

1050YENさん、的確な回答をありがとうございます。 下記内容で、「Windows Vista/7」で成功しました! hWndTsk = FindWindow("Shell_TrayWnd", vbNullString) value = SetWindowPos(hWndTsk, -1, 0, 0, 0, 0, &H80) hWndBtn = FindWindow("Button", "スタート") ShowWindow(hWndBtn, 0) 本当に的確な回答、ありがとうございました。 今後も何かありましたら、その節はどうぞよろしくお願いいたします。

その他の回答 (5)

  • ten003
  • ベストアンサー率0% (0/1)
回答No.5

画像が汚かったので、再度添付します。 ご確認いただけますでしょうか。

  • ten003
  • ベストアンサー率0% (0/1)
回答No.4

画像添付できなかったため、別アカウントで投稿します。 1050YENさん、いつもありがとうございます。 この画像をご確認いただけますでしょうか。 どうぞよろしくお願いいたします。

回答No.3

>&H30126 添付画像の状態と違いましたね。。。 添付画像の時の実験時は&H100048でした^^;;;

回答No.2

>やはりWindows Vistaのスタートボタンは消えません。 >(Windows 7でも同様でした) なんとっ! XPでは消えることは確認できているのですが、、、 ごめんなさいXPしか環境が無いので、何とも言えずです。。。 うむ。。。 タスクバー内部の構成が違うのかなぁ ここからは環境が無いので、完全に推測です。 ツール[TClock] http://homepage1.nifty.com/kazubon/tclocklight/index.html スタートボタンを時計に変えるツールです。 これのWindows7での動作確認状況の報告を見つけました。 http://w7.vector.jp/softrev/detail.php?s_no=14109 →「スタートボタンが見つかりません」と表示される とあります。おそらくVistaでも同じでしょう。 このソフトもスタートボタンを見つける処理までは、前回書いた内容と同様なはずです。 スタートボタンが見つからないという文言を出力すると言うことは、やはりタスクバー内部の構成が違うのではないかということが、一番怪しいです。 Spy++はお持ちでしょうか? (Spy++はVisualStudio同梱されています。Expressには無いかも?) 添付画像はXPのタスクバーの構成を、Spy++にて取得したものです。 Spy++やMiniSpy(フリーソフト)のようなツールでスタートボタンのハンドルを取得し、直接そのハンドルを引数にWindowVisibleを実行させたらどうなるか試してください。 (私のところでは&H30126がスタートボタンのハンドル) ShowWindow(New IntPtr(&H30126), SW.SW_HIDE) 直接指定で表示状態を変更できなければ、すいませんが対応方法はわかりません。 できるようであれば、取得方法を再構築すると対応できると思います。

ten002
質問者

お礼

詳細なご教示ありがとうございます。 Spy++で見る限り、Shell_TrayWnd 配下に画面のような "スタート" Button はありません。 代わりにその上に存在しています。 管理下が代わったのかもしれません。 このお礼入力では、画像添付できないような・・・ 他の部分で画像添付を試してみます。 本当に色々ありがとうございます。

回答No.1

SetWindowPosの引数に&H80だけ指定していますね。 SWP_NOSIZEやSWP_NOMOVEを指定しないと、復元したときに思わぬ位置でボタンが表示されてしまいかねないです。 表示非表示だけであれば、ShowWindowというAPIの方が手軽です。 またIsWindowVisibleというAPIで、現在の表示状態も取得できます。 http://okwave.jp/qa/q347257.html <DllImport("user32.dll")> Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr End Function <DllImport("user32.dll")> Private Shared Function FindWindowEx(ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer End Function Private Enum SW   'http://yokohama.cool.ne.jp/chokuto/urawaza/api/ShowWindow.html   SW_HIDE = &H0   SW_SHOWNORMAL = &H1 End Enum '↓おまけ <DllImport("user32.dll")> Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As SW) As Boolean End Function <DllImport("user32.dll")> Private Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As Boolean End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Dim hWndTsk As IntPtr = FindWindow("Shell_traywnd", vbNullString)   Dim hWndBtn As IntPtr = FindWindowEx(hWndTsk, 0, "Button", vbNullString)   If IsWindowVisible(hWndBtn) Then     ShowWindow(hWndBtn, SW.SW_HIDE)   Else     ShowWindow(hWndBtn, SW.SW_SHOWNORMAL)   End If End Sub Windowsボタンを視覚的に消しただけで、Windowsキーは有効です。 そこまでの対応を行いたいのであれば、キーボードの入力をフックするという手法が必要となります。

ten002
質問者

お礼

ご丁寧な回答、誠にありがとうございます。 EnableWindow(value, 0) でなく、 ShowWindow(value, 0) の記述間違いもありました。 1050YEN様のソースコード通り記しましても、やはりWindows Vistaのスタートボタンは消えません。 (Windows 7でも同様でした) なぜでしょうか・・・ 折角のご丁寧でわかりやすいソースコードを記していただいたにも関わらず、残念です。 1050YEN様にはすごく感謝いたしております。 本当にありがとうございました。

関連するQ&A