問題タブ [shell-namespace-extension]

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.

0 投票する
1 に答える
282 参照

c++ - 検索中に IShellFolder/IShellFolder2 EnumObjects 実装で親のウィンドウ ハンドルを受け取りますか?

私が取り組んでいる名前空間拡張プロジェクトで親ウィンドウ ハンドルを受け取ることに頭を悩ませています。

ユースケースは次のとおりです。

  1. ユーザーが Windows エクスプローラーを使用して仮想フォルダーを参照する
  2. ユーザーが検索を実行します (上の検索ボックス)
  3. 検索を開始する前に、検索ボックスのテキストを取得する必要があります。

ISearchBoxInfo インターフェイス ( https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062%28v=vs.85%29.aspx?f=を使用して、テスト コンソール アプリでそれを行うことができました。 255&MSPPError=-2147217396 )

このインターフェイスへのポインタを受け取る方法は 2 つあります。

  1. IObjectWithSite::SetSite 呼び出しの使用 - 検索は別のスレッドで実行され、それらのスレッド間で COM オブジェクトを共有できないため、これは関係ありません
  2. ウィンドウ ハンドルを識別し、IWebBrowser2 インターフェイスを介して ISearchBox を取得します。

検索を実行すると、EnumObjectsが別のスレッドを介して呼び出され、親エクスプローラー ウィンドウが誰であるかを特定する方法が見つからないため、両方の方法が機能しません。

検索を行うとき、次のように来る hwnd は常に null です。 検索中の EnumObjects

これは EnumObjects コードです:

私のテストに加えて、私はIShellFolderViewCB.MessageSFVCBの実装も持っているので、これは IShellBrowser とハンドルを取得できる正しいスレッドで実行されます - 検索を行うと、次のメッセージが表示されます:

その後、メッセージは投稿されません (再検索しても)。最初のブレークポイントは常に、親ウィンドウに関するコンテキストがない EnumObjects メソッドにあります。

どんな光の脱落もいいでしょう。

==編集==

私はいくつかの回避策を考え出しました - これはすべての場合に完璧ではありませんが、ほとんどの場合に機能します - 他のオプションはまだ良いでしょう.

EnumObjects が hwnd = NULL で呼び出されるたびに、私は次のことを行っています: (これは C# にありますが、C++ でも簡単に実行できます)

基本的に、私はすべてのエクスプローラーウィンドウを調べて、実際に「explorer.exe」+空ではない検索文字列(LocationName)+ビジー... +タイトルに現在のフォルダー名の名前が含まれているものを見つけようとしています。

2 つのウィンドウがビジー状態で、タイトルに同じフォルダー名が含まれていると失敗しますが、これで十分かもしれません... ここではわかりません。

0 投票する
1 に答える
62 参照

c++ - 「共有」列の値がシェル名前空間拡張で正しく表示されない

シェル名前空間拡張機能を使用して、Windows 7 で仮想フォルダーを作成します。仮想ファイルの詳細を表示できるように、この仮想フォルダーに列を追加したいと考えています。ただし、「共有」の値は正しく表示されません。関連するコードは次のとおりです。

上記のコードはIFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY *pkey, VARIANT *pv);、Windows が提供するインターフェイスである関数にあります。 ここに画像の説明を入力 上記のコードにブレークポイントを追加すると、変数が の場合、変数は にisSharedなります。ただし、UI に表示される値を確認すると、すべてのオブジェクトに対して 表示され ます。実際には、上位 3 つのファイルが共有されており、「はい」のはずです。デバッガーが上記のコードのブレークポイントに到達すると、これら 3 つのファイルの値になります。これはWINDOWSの定義ですtruesharedVARIANT_TRUEnoここに画像の説明を入力VARIANT_TRUEPKEY_IsSahred

また、上記のコードを次のように編集しようとしました。

動作しません。に置き換えるpv->pboolVal = &shared;pv->boolVal= shared;、次のように動作します: ここに画像の説明を入力 上位 3 つのファイルに対してのみ「はい」を表示します。

VARIANT_TRUEand VARIANT_FALSEandを使用しpv->boolValても、「はい」のみが表示されます。

-----ワーキングアップデート-------------------

これは私のために働く!