問題タブ [windows-shell]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - IShellBrowser::QueryActiveShellView メソッドの実装者は、呼び出し元に対して AddRef を呼び出す必要がありますか?
IShellBrowser を実装しようとしています。そのような方法の1つは次のとおりです。
これにより、呼び出し元のアクティブなシェル ビュー ポインターが取得されます (私の場合、常に 1 つのシェル ビューしかありません)。
しかし、呼び出し元に代わって AddRef を呼び出す必要があるのか、それとも実際に呼び出し元が独自の AddRef/Release を実行する責任があるのかが非常に不明です。
私は副作用によるプログラミングのファンではありません - そしてそれはまさに AddRef が何であるかです - 呼び出し元が必ずしも知っているとは限らない、呼び出し元に対する隠された期待です。
IShellBrowser::QueryActiveShellView のドキュメントを見ると、まったく言及されていません。しかし、IUnknown::AddRef を見ると、インターフェイス ポインターのコピーを作成するメソッドはすべて AddRef を呼び出す必要があることがわかります - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx
作成するインターフェイス ポインターの新しいコピーごとに、このメソッドを呼び出します。たとえば、ポインターのコピーをメソッドから戻す場合は、そのポインターで AddRef を呼び出す必要があります。
c++ - REFIIDを有用な名前に変換するOS機能はありますか?
いくつかの既知のREFIIDを次のような名前に変換する関数を手動で作成することはできません。
よく知られている(またはすべての)REFIIDに対して妥当なデバッグ文字列を返すシステムコールはありますか?
c++ - 標準の Windows ファイル ダイアログ ツールバー アイコンがどこにあるか知っている人はいますか?
XP (および理想的には W2000) と互換性のある、Windows で許可されているよりも多くの機能を備えた [ファイルを開く] ダイアログと [名前を付けて保存] ダイアログが必要なため、IShellBrowser の独自の実装を展開しようとしています*
この時点で、ダイアログの右上に表示される標準ツールバー (XP 以前のマニフェスト スタイル) を追加する必要があります - 戻るボタン、親フォルダー ボタン、新しいフォルダー ボタン、および「ツール」ドロップダウン.
しかし、これまでのところ、これらのアイコン/画像を見つけることができませんでした. USER32.dll、comdlg32.dll、comctl32.dll を調べましたが、まったく一致するものは見つかりませんでした。
それらを見つけることができるアプリケーションのスクリーン ショットを撮ることもできますが、これらのボタンのさまざまなバージョン (高解像度、低解像度、浅い色、濃い色) にアクセスできるように、それらがどこから来たのかを知る方がおそらく便利です。など)。
何か案は?
[編集: Vista および Windows 7 とも互換性がある必要があります。Vista以降、彼らは古い共通ダイアログモデルを壊し、彼らの新しいモデルはIMOの脳に損傷を与えたというだけです-私たちのダイアログがかつて行っていた必要な義務を実行するために、ダイアログの状態に十分にアクセスできなくなりました-だから別の角度から問題にアプローチすることを余儀なくされています]
c++ - IThumbnailProviderおよびIInitializeWithItem
私はIThumbnailProvider
Windows7で使用するためにを開発しようとしています。この特定のサムネイルは同じディレクトリ内の他のファイルにも依存するためIInitializeWithStream
、作業するパス以外のものを使用する必要があります。これはIInitializeWithItem
です。(または、を使用することもできますIInitializeWithFile
が、それは明らかにさらに眉をひそめています。)
私が何をしても、それを機能させることはできません。私はMicrosoftのFileTypeVerifier.exe
ツールを使って使用することを青信号にしてIInitializeWithItem
いますが、エクスプローラーがそれを呼び出すと、それは試してみるだけのようIInitializeWithStream
です。(これは、上記のインターフェイスを一時的に実装し、その中でBeep()を実行することによってテストされましたInitialize()
)何かを構成するのを忘れましたか?
つまり、これを機能させるにはどうすればよいですか?
c++ - IShellView コンテキスト メニューに表示される IContextMenu を取得するにはどうすればよいですか?
ファイルを開くダイアログの置換を構築しています。現在はそのほとんどが機能していますが、シェル ビュー オブジェクトから直接、ツールバーのビュー モード ドロップダウンを生成したいと考えています。
IShellView2 を見ると、IShellView2::GetView() によって FOLDERVIEWMODE がサポートされていることがわかります。ただし、これらのモードの名前も、そのポップアップ メニューのフォーマットも、それらのモードの 1 つを実際に設定する方法もすぐにはわかりません (シェル ビュー ウィンドウを破棄して作成する必要があるようです)。現在のフォルダーの代替フォルダーを作成し、必要な新しい FOLDERVIEWMODE を指定します...はい)。
とにかく、IShellView ウィンドウを右クリックすると、コンテキスト メニューが表示されます。その最初のサブメニューは、まさにドロップダウン ツールバー ボタンに配置したいものです (つまり、「表示」フライアウト メニュー (例: 小さいアイコン、中程度のアイコンなど))。
私の値をハードコードするのではなく、IShellView から直接そのサブメニューを取得する方法が必要なようです (その方法で、IShellView の特定のインスタンスが追加のビュー モードをサポートしている場合、それらはそこにあります。同様に、それらはすべて IShellView の制御下にあるため、無効にする必要があります)。
Raymond Chen の優れたHow to host an IContextMenu を読みました。残念ながら、それは私に非常に単純なコンテキスト メニューを与えるだけです - フォルダー自体、または特定のフォルダー内のファイルのためのものですが、IShellView のシェル ビュー ウィンドウ (そこからビュー フライアウトを取得する可能性があります) のコンテキスト メニューではありません。 )。
Chenの記事に基づいて、次のことを試しました。
残念ながら、m_shell_view (IShellView* である) の IContextMenu インターフェイスを照会しようとすると失敗します。これは「機能します」:
しかし、ここでは、コンテキスト メニューにごく少数のオプションしか表示されません ([開く]、[探索] など)。シェル ビュー自体を右クリックするだけで表示される詳細なコンテキスト メニューではありません。
どのように進めるかについてのアイデアがありません。ヘルプ?!;)
c - Windows エクスプローラーにアイコンを更新するように指示する方法は?
インストーラーがアプリケーションの exe の新しいバージョンのインストールを完了したら、Explorer にショートカットに新しい exe のアイコンを使用するように指示したいと思います。ただし、これを行う方法がわかりません。
オンラインで読むと、問題はシステム イメージ リストが古いバージョンのアイコンをキャッシュしていることにあるようです。パラメータでSHChangeNotifyを呼び出してみましたSHCNE_UPDATEIMAGE
。SHUpdateImageを呼び出してみました。ブロードキャストの大ハンマーアプローチも試しましたWM_SETTINGCHANGE
。何も機能していないようです。
私が何か間違ったことをしている可能性は十分にあります。どんな助けでも大歓迎です。
警告: 非常に醜いテスト コードが続きます。
c++ - IShellFolderのPIDLを取得する方法
IShellFolder
インターフェイスポインタがある場合。どうすればそのPIDLを入手できますか?
その子を列挙する方法と、2人の子を比較するためにそれを使用する方法を見ることができます。しかし、どうすれば独自のpidlを取得できますか?
私が知りたいので私は尋ねます:
これはIShellFolderですか==別のIShellFolder
を使用できますIShellFolder::CompareIDs()
が、両方のフォルダーのIDが必要です。
c++ - 新しいフォルダを作成する「シェル名前空間」の方法は何ですか?
明らかに、これは win32 api - CreateDirectory() で行うのは簡単です。しかし、私は IShellView をホストしようとしており、これを最もシェル指向の方法で行いたいと考えています。IShellFolder から createobject や createfolder などがあると思っていたでしょう。しかし、IShellView も IShellFolder も IFolderView も、このようなものを持っているようには見えません。
新しいフォルダーを作成するシェル プログラミングの方法はありますか? それとも、昔ながらの方法でパス名を使用してフォルダーを作成する必要がありますか?
CreateDirectory() を介してそれを行う必要がある場合、次の質問は次のようになります: IShellView / IFolderView を取得して、この新しいオブジェクトを実際に見てユーザーに表示する方法についてのアイデアはありますか?
動機: 独自のファイル ダイアログの置き換えを作成し、標準の XP スタイル ファイル ダイアログの「新しいフォルダー」ツールバー アイコン機能を提供したいと考えています。
編集:CreateDirectoryを使用して、基本的に機能するものを作成しました。ただし、これを行うためのより良い方法があることを願っていますが、それがどのように機能するかを確認し、この問題をより適切に解決するためのより良いアイデアを提供することができます。
c++ - ローカルイベントのみを登録するグローバルシェルフック
グローバルシェルフックを使用して、Windowsで作成および破棄されたイベントをリッスンしようとしていますが、プログラムが破棄されたイベントをローカルスレッドに登録しているだけのようです。作成イベントはまったくありません。また、そうあるべきだと私が思うグローバルイベントでもありません。
私は最後の日をグーグル、codeguru、codeproject、msdnの精査に費やしましたが、明らかにそうではありませんが、私はそれを正しく行っているように見えます。誰かが私を正しい方向に向けるのを手伝ってもらえますか?
これがシェルにフックするための私のコードです。これはすべて私には正しいようですが、やはり、適切な出力が得られません。現在、ShellProc関数は、ウィンドウで簡単な変数インクリメントを実行してメッセージを作成および破棄するように設定されていますが、プログラムはローカルウィンドウの破棄メッセージのブレークのみをヒットします。繰り返しになりますが、どんな助けでも素晴らしいでしょう、事前にどうもありがとうございました。
c++ - 現在のフォルダ ビューの完全なビュー プルダウンを取得する方法はありますか?
動機: std コモン ダイアログによく似た外観と動作をする独自のファイル ダイアログを作成する
問題:現在のフォルダー/シェル コンテナーのビュー プルダウンを取得する方法
明らかな行き止まり:
- IContextMenu < NULL インターフェイス ポインターの IShellFolder をクエリします。
- IContextMenu < NULL インターフェイス ポインターの IShellView をクエリします。
- IShellFolder::CreateViewObject(IID_IContextMenu...) < 非常に限られたコンテキスト メニュー (新規)。
- IShellFolder::GetUIObjectOf(IID_IContextMenu...) < 限定されたコンテキスト メニュー (開く、探索する...)。
- IShellBrowser の InsertMenusSB、RemoveMenusSB、および SetMenuSB を実装する
私は、Folder View の実装とIContextMenu をホストする方法を読むのに時間を費やしました。これは、上記の最終的なアプローチ (InsertMenuSB の実装など) が機能することを示しているようです。IShellView は、View サブメニューを含む IShellBrowser の共有メニューに適切な項目を設定する必要があります。ただし、これまでのところ、そこから得られるのは空のメニューだけです (アイテムを入力しない限り、その場合は、入力したアイテムを取得するだけです)。
確かにこれを行う方法があります。Windows エクスプローラーは、(Vista 以降で Alt キーを押した場合) 表示されるメニューにどこかから到着します。そして、このメニューがエクスプローラー自体によって静的に構築されているとは想像できません。現在表示されている IShellView と連携して何らかの形で動的に作成され、シェル拡張機能がビュー オプション (およびその他のメニュー オプション) の正しいリストを表示できるようになっていることは確かです。
しかし、InsertMenuSB、RemoveMenuSB、およびSetMenuSBに関するドキュメントは紛らわしいです。コンテナー サーバーとして、提供されたOLEMENUGROUPWIDTHSを"ファイル、ビュー、およびウィンドウ メニュー グループで提供されるメニュー要素の数を反映するために、要素 0、2、および 4 に" 設定する必要があることを示しているようです。
この契約を適切に履行するために、次のことを実装しました。
現在の IShellView のメニューをエンドユーザーに適切に公開する Explorer のようなプロジェクトを実装した人はいますか?
このあいまいな主題に光を当てる可能性のあるIOLEInPlaceFrame実装に関するドキュメント/例はありますか?
うーん!@ - 近くにいるに違いない気がしますが、まだ十分ではありません!