• ベストアンサー

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

  • VB.netでFindWindowExやると・・・9222812402616107008!?

    VB.netでWin32APIのFindWindowExを使うと, たとえばスタートボタンのHWNDを拾ってくるとき, 本当なら65662(6.0のSpy++で確認+10進変換)が返ってきて欲しいんですが, 9222812402616107008という,異常な数が返ってきます. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz1 As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz2 As String) As Long とやってあります. VB6.0のAPIビューワからコピペして,MarshalAsをつけてみました.   (初心者なので,わけわからないまま付けましたけど; hWnd_ShellTrayWnd = FindWindowEx(0,0,"Shell_TrayWnd",vbNullString) hWnd_StartButton = FindWindowEx(hwnd_ShellTrayWnd,0,"Button",vbNullString) とやってるのですが・・・. 不思議なのは,hWnd_ShellTrayWndが9222812402616238204になっているにもかかわらず,次のFindWindowExで,hWnd_StartBtnが9222812402616107008になってるところです・・・. しかも,ありえないクラス名(KeyBoadぐちゃぐちゃ押し)を指定しても,なぜか数が返ってくるんです. FindWindowExを成功させる(きちんとした数を取る)方法,またはFindWindowEx以外でhWndを拾ってくる方法,ありましたら,教えてください.

  • windows7のエクスプローラをVBAで操作-2

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラのフォルダパスの右のボタン(添付ファイル参照)をクリックすべく、コーディングしたものです。 最後のSendMessage(hwnd, BM_CLICK, 0, 0) でクリックしたいのですが、その前にボタンのハンドルが取得できません。SDKのInspect Objectsで調べると、このボタンはClass="ToolbarWindow32"でName="前の場所"ですが、NativeWindowHandleが表示されず、Legacy.IAccessible.ChildID=1となっています。 このようなウィンドゥは別のやり方(IAccessible?)でないとクリックできないように感じていますが如何せん知識がありません。 どうしたらできるか、アドバイスよろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, lParam As Any) As Long Const BM_CLICK = &HF5 Private hwnd As Long Sub Click_button() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ToolbarWindow32", vbNullString) ' この次が分からない。 RC = SendMessage(hwnd, BM_CLICK, 0, 0) end sub

  • windows7のエクスプローラをVBAで操作-1

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。 最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。 なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。 よろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal MSG As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long Const WM_SETTEXT = &HC Private hwnd As Long Private FOLDER As String Sub Put_folder_name1() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) FOLDER = "\\xx.xx.xx.xx\test" RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER) end sub

  • VB.NET2008を使用しています。

    VB.NET2008を使用しています。 ----- HTML ----- <input type="submit" name="Enter" value="ボタン"> ----- END ------ ----- 構成@VB ----- Form1 Button1 <- これをクリックしてWebBrowserのボタンを押したことにする WebBrowser1 ----- END ----- 上のようなボタン(HTMLのもの)を VB.NETのButton1を押すとWebBrowser1に表示されているWEBページのボタンを 押したようにしたいのですがどのようにすれば実現できますか? よろしくお願いします。

  • スタートボタンの幅は狭くできないの?

    http://oshiete1.goo.ne.jp/qa3684075.html?ans_count_asc=1 ↑この方と同じ悩みなのですが、タスクバーの幅を狭くしたいと考えています。 タスクバーは標準状態では画面下に位置していますが、私は画面左に縦表示させて使っています。 ぎりぎりまで横幅を狭くして使いたいのですが、タスクトレイのアイコンが横三列に表示されるほどの幅までしか狭くできません。 Windowsスタートボタンが大きすぎてボタンの大きさ以下に幅を狭くできないのです。 XPの時はテーマをWindowsクラシックにすればスタートボタンも「田」だけの幅にまで狭くできて重宝していました。 ※「田」というのはWindowsマークです Vistaではテーマを「Windows クラシック」に変更してもスタートボタンが「田スタート」と表示されてしまいます。 タスクバーの幅が「スタートボタン」より狭く設定できません。 このためタスクトレイにはアイコンが三列に広がって表示されてしまいます。 タスクトレイのアイコンを一列表示できるくらいまでタスクバーの幅を狭くしたいのですが、Vistaでは不可能なのでしょうか。 スタートボタンを小さく表示させる方法、あるいはタスクバーの幅をスタートボタンより狭くする方法があれば教えてください。

  • スタートボタンが反応しません

    スタートボタンが反応しません。スタートボタン(とタスクバー)は表示されているのですが、クリックするとエクスプローラーが停止して、再び起動した後、同じような状態になります。OSはVista Ultimateです。

  • スタートボタンが変わりました。

    いつもお世話になっております。 昨日から、ビスタのスタートボタンが変わりました。 他はタスクバーの色が違うくらいです。 その前にスタートアップ修復と言うのをしてしまいました。 それが原因かと思います。 できたら簡単な方法で直したいです。 リカバリをするしかありませんか? なるべく早くお返事ください。お願いします。

  • windows7のエクスプローラをVBAで操作-3

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったらエクスプローラが変わったため正しく動作しなくなりました。 やりたいのはエクスプローラに検索文字列(添付ファイル参照)をセットして検索をさせたいのです。 「windows7のエクスプローラをVBAで操作-1」「windows7のエクスプローラをVBAで操作-2」のタイトルで質問させていただき、下のコードを考えましたが、★のところでハンドルが返らず0でした。InspectObjectsで見ると「読み込み専用」と。これが原因ですか?どうしたらいいのだろう・・・。 またこのハンドルを取得して、AccessibleObjectFromWindowでIAccessible を取り出して、accDoDefaultActionしたいのですが、UUIDの値が分かりません。OLEViewで見たのですがExplorer関連がいくつかあり(添付ファイル参照)どれを使っていいものやら。ボタンクリックの後に文字列セットがあるのですが、まだたどり着けず。 IAccessible初心者です。 質問ばかりで済みませんがコーディングのアドバイスお願いします。 Option Explicit Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _ (ByVal hWnd As Long, _ ByVal dwObjectID As Long, _ ByRef riid As Any, _ ByRef ppvObject As Any) As Long Const WM_SETTEXT = &HC '文字列送信 Const BM_CLICK = &HF5 'クリック Const OBJID_CLIENT As Integer = &HFFFFFFFC Private Type UUID Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End Type Private IID_IAccessible As UUID Private oShell Private ie Private hWnd As Long Private SearchBoxハンドル As Long Private Search_Folder As String Private RC As Long 'Private objAcc As IAccessible Private objAcc As UUID Private varChild As Variant Private cnt Private fullnames As String Sub 検索指定のインプット() Search_Folder = "c:\xxx" Set oShell = CreateObject("Shell.Application") For cnt = oShell.Windows().Count - 1 To 0 Step -1 ' On Error Resume Next Set ie = oShell.Windows().Item(cnt) fullnames = ie.FullName ' On Error GoTo 0 If fullnames = "C:\Windows\Explorer.EXE" Then ie.Navigate (Search_Folder) hWnd = FindWindow("CabinetWClass", vbNullString) hWnd = FindWindowEx(hWnd, 0, "WorkerW", vbNullString) hWnd = FindWindowEx(hWnd, 0, "ReBarWindow32", vbNullString) hWnd = FindWindowEx(hWnd, 0, "UniversalSearchBand", vbNullString) hWnd = FindWindowEx(hWnd, 0, "Search Box", vbNullString) hWnd = FindWindowEx(hWnd, 0, "SearchEditBoxWrapperClass", vbNullString) hWnd = FindWindowEx(hWnd, 0, "SearchBox", vbNullString) ' ★--> 0 return SearchBoxハンドル = hWnd hWnd = FindWindowEx(SearchBoxハンドル, 0, "Button", "検索") hWnd = FindWindowEx(SearchBoxハンドル, 0, "SearchEditBox", vbNullString) ' "SearchEditBox" に検索文字列入力の予定だった With IID_IAccessible .Data1 = &H68284FAA .Data2 = &H6A48 .Data3 = &H11D0 .Data4(0) = &H8C .Data4(1) = &H78 .Data4(2) = &H0 .Data4(3) = &HC0 .Data4(4) = &H4F .Data4(5) = &HD9 .Data4(6) = &H18 .Data4(7) = &HB4 End With RC = AccessibleObjectFromWindow(hWnd, OBJID_CLIENT, IID_IAccessible, objAcc) ' 80004005が返る varChild = 2 ' Class="Button", Name="検索"のコントロールをクリックしたいが・・・ ' RC = objAcc.accDoDefaultAction(varChild) ' 書き方が違うみたい・・・ ' Class="SearchEditBox" に検索する文字列を入れたいが・・・ Exit Sub End If Set ie = Nothing Next End Sub

  • VB.NETで子ウィンドウの列挙の仕方がわかりません。

    VB.NET+FrameWork1.1環境なのですが、 子ウィンドウの取得の仕方がどうしてもわからず教えて頂きたいです。 Dim Oya As Long Oya = FindWindow(vbNullString, "電卓") Dim Ret As Long Ret = EnumChildWindows(Oya, AddressOf EnumChildWnd, 0) このようにして使うAPIのようなのですが、 デリゲート型をLong型に変換できませんと出てしまいます。 色々検索してみたのですが、それらしい記事が見つかるも どうしても理解できず、正常に動作させることが出来ませんでした。 もうしわけございませんが、どなたか実行可能なコードを書いて いただけないでしょうか。 出力結果はConsole.WriteLineに出るようにして頂けると助かります。 よろしくお願いいたします。m(__)m

  • xpをパッチを当てずにvista化したい(タスクバー、スタートボタン、スタートメニュー)

    xpをパッチを当てずにvista化したいのですが方法はあるでしょうか?これまでVistaMizerやVistapackなど試しましたが不具合が起こったので、安全にできるものがいいです。私はこれは事前に入れたパッチ自体がPCの不具合の原因のような気がするのですが、違うでしょうかね・・? パッチに問題がないのであれば、安全にVista化できるものなら構いません。 お願いいたします。 Vista化したいもの→タスクバーを黒に、スタートボタンをWindowsロゴに、スタートメニューをVista風の黒デザインに)

PC-FAX受信ができない
このQ&Aのポイント
  • PC-FAX受信ができない問題についての相談です。ルーターの電源の抜き差しや保存先フォルダーの変更を試しましたが、ネットワーク接続エラーが表示されています。
  • お使いの環境はWindows11であり、無線LAN接続です。関連するソフト・アプリは記載されていません。電話回線は光回線です。
  • ブラザー製品に関するPC-FAX受信ができない問題の質問です。
回答を見る

専門家に質問してみよう