3

[このコードは、Inspector.Activateイベント ハンドラー内から呼び出されます (最初の呼び出し)。つまり、インスペクター ウィンドウが実際に表示される直前です。]

Inspector「ネイティブ」なメール インスペクターの場合は、インターフェイスをQI して、そのメソッドIOleWindowを呼び出すだけです。GetWindowただし、これは、実際には特別なツールバーを備えた Word のインスタンスであり、実装していない Word インスペクタでは機能しませんIOleWindow

(一時的に)Inspector.Caption一意の値に設定してから、そのキャプションを持つウィンドウを探すことも機能しませんInspector。WordMail オプションを使用する場合、 のほとんどのプロパティにアクセスしても、実際のインスペクター ウィンドウに (即時に) 影響を与えないためです。Activate複数のインスペクターGetForegroundWindowが既に開いている場合、または実際の Word ウィンドウが存在する場合、最新のインスタンスではなく「最も古い」インスタンスが返されることがよくあります。

私は何年にもわたって他の多くのアプローチを試みてきましたが、最終的には何らかの形で欠陥があることが判明しました. これに対する適度に単純な解決策はまったくありますか?それとも、システムフックを介して既知のウィンドウハンドルの独自のリストを保持し、それらを既知のインスペクターと照合しようとするなど、はるかに精巧なアプローチを採用する必要がありますか? ( CBT フックの使用に関するヒントについては、P Daddyに感謝します)

4

2 に答える 2

1

私は今、まだ壊すことができていない何か新しいものを思いつきましたが、それでもブードゥー教のように感じます. 観察により、私が望むウィンドウEnumWindowsは、(まだ) 表示されていない、つまりIsWindowVisible返された最初のウィンドウであるように常に見えることがわかりました (インスペクターが表示される直前にFalse、イベントの最初の発生の内部からこのコードを呼び出していることを思い出してください)。Inspector.Activate初めて)。

誰かがより良い解決策を知っている場合、またはこれが機能する理由について十分に根拠のある説明 (できれば信頼できるドキュメントへのリンクを含む) がある場合は、返信を投稿してください。

更新:リクエストに応じて、実際の (Delphi) コードをいくつか示します。これは私の作業コードではないことに注意してください。このコードには、この質問に関係のない、ここで削除された他のいくつかのものが含まれています。

function GetWindowClassName(const AHandle: HWND): String;
var
  lClass: array[0..255] of Char;
begin
  if GetClassName(AHandle, lClass, SizeOf(lClass)) > 0 then
    Result := lClass
  else
    Result := '';
end;

type
  TWordSearchInfo = record
    Result: HWND;
  end;
  PWordSearchInfo = ^TWordSearchInfo;

function CheckWnd(AWnd: HWND; ASearchInfo: PWordSearchInfo): Boolean; stdcall;
begin
  Result := True;
  try
    if GetWindowClassName(AWnd) = 'OpusApp' then
      if not IsWindowVisible(AWnd) then
        begin
          ASearchInfo.Result := AWnd;
          Exit(False);
        end;
  except
    //plop!
  end;
end;

function GetNewestWordHandle: Cardinal;
var
  lSearchInfo: TWordSearchInfo;
begin
  lSearchInfo.Result := 0;
  EnumWindows(@CheckWnd, Integer(@lSearchInfo));
  Result := lSearchInfo.Result;
end;

注:この関数は、インスペクターのActivate-event 内からのみ使用し、Outlook のメジャー バージョンが < 12 であり、インスペクターのIsWordMail-property がTrue.

于 2011-03-03T13:25:02.337 に答える
0

カスタム インスペクターのコンストラクターでは、次のメソッドを使用して、新しく構築されたインスペクターを見つけることができることがわかりました。

C#

inspectorWindow = Win32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "OpusApp", "Microsoft Word");

コンストラクターでこれを行う必要があります。その後、キャプションがメッセージのタイトルになります (新しいメッセージでは「無題のメッセージ」)。Microsoft Word という名前のメッセージが既に開かれている場合、あいまいさのためにエラーが発生する可能性があると想定していますが、発生する可能性はやや低いです。

于 2011-03-14T12:53:03.317 に答える