問題タブ [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.
c++ - 検索中に IShellFolder/IShellFolder2 EnumObjects 実装で親のウィンドウ ハンドルを受け取りますか?
私が取り組んでいる名前空間拡張プロジェクトで親ウィンドウ ハンドルを受け取ることに頭を悩ませています。
ユースケースは次のとおりです。
- ユーザーが Windows エクスプローラーを使用して仮想フォルダーを参照する
- ユーザーが検索を実行します (上の検索ボックス)
- 検索を開始する前に、検索ボックスのテキストを取得する必要があります。
ISearchBoxInfo インターフェイス ( https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062%28v=vs.85%29.aspx?f=を使用して、テスト コンソール アプリでそれを行うことができました。 255&MSPPError=-2147217396 )
このインターフェイスへのポインタを受け取る方法は 2 つあります。
- IObjectWithSite::SetSite 呼び出しの使用 - 検索は別のスレッドで実行され、それらのスレッド間で COM オブジェクトを共有できないため、これは関係ありません
- ウィンドウ ハンドルを識別し、IWebBrowser2 インターフェイスを介して ISearchBox を取得します。
検索を実行すると、EnumObjectsが別のスレッドを介して呼び出され、親エクスプローラー ウィンドウが誰であるかを特定する方法が見つからないため、両方の方法が機能しません。
検索を行うとき、次のように来る hwnd は常に null です。
これは EnumObjects コードです:
私のテストに加えて、私はIShellFolderViewCB.MessageSFVCBの実装も持っているので、これは IShellBrowser とハンドルを取得できる正しいスレッドで実行されます - 検索を行うと、次のメッセージが表示されます:
その後、メッセージは投稿されません (再検索しても)。最初のブレークポイントは常に、親ウィンドウに関するコンテキストがない EnumObjects メソッドにあります。
どんな光の脱落もいいでしょう。
==編集==
私はいくつかの回避策を考え出しました - これはすべての場合に完璧ではありませんが、ほとんどの場合に機能します - 他のオプションはまだ良いでしょう.
EnumObjects が hwnd = NULL で呼び出されるたびに、私は次のことを行っています: (これは C# にありますが、C++ でも簡単に実行できます)
基本的に、私はすべてのエクスプローラーウィンドウを調べて、実際に「explorer.exe」+空ではない検索文字列(LocationName)+ビジー... +タイトルに現在のフォルダー名の名前が含まれているものを見つけようとしています。
2 つのウィンドウがビジー状態で、タイトルに同じフォルダー名が含まれていると失敗しますが、これで十分かもしれません... ここではわかりません。
c++ - 「共有」列の値がシェル名前空間拡張で正しく表示されない
シェル名前空間拡張機能を使用して、Windows 7 で仮想フォルダーを作成します。仮想ファイルの詳細を表示できるように、この仮想フォルダーに列を追加したいと考えています。ただし、「共有」の値は正しく表示されません。関連するコードは次のとおりです。
上記のコードはIFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY *pkey, VARIANT *pv);
、Windows が提供するインターフェイスである関数にあります。
上記のコードにブレークポイントを追加すると、変数が の場合、変数は に
isShared
なります。ただし、UI に表示される値を確認すると、すべてのオブジェクトに対して
表示され
ます。実際には、上位 3 つのファイルが共有されており、「はい」のはずです。デバッガーが上記のコードのブレークポイントに到達すると、これら 3 つのファイルの値になります。これはWINDOWSの定義ですtrue
shared
VARIANT_TRUE
no
VARIANT_TRUE
PKEY_IsSahred
また、上記のコードを次のように編集しようとしました。
動作しません。に置き換えるpv->pboolVal = &shared;
とpv->boolVal= shared;
、次のように動作します:
上位 3 つのファイルに対してのみ「はい」を表示します。
VARIANT_TRUE
and VARIANT_FALSE
andを使用しpv->boolVal
ても、「はい」のみが表示されます。
-----ワーキングアップデート-------------------
これは私のために働く!