2016-12-11 7 views
-1

delphi7がエクスプローラで選択したファイルの名前と拡張子を取得して表示します。デルファイでアクティブなウィンドウで選択したファイルの名前と拡張子を取得

アクティブなウィンドウのキャプションを表示するには以下のコードを使用しますが、アクティブなウィンドウではファイル名を選択する必要があります。

function ActiveCaption: string; 

var 
    Handle: THandle; 
    Len: LongInt; 
    Title: string; 

begin 
    Result := ''; 
    Handle := GetForegroundWindow; 
    if Handle <> 0 then 
    begin 
    Len := GetWindowTextLength(Handle) + 1; 
    SetLength(Title, Len); 
    GetWindowText(Handle, PChar(Title), Len); 
    ActiveCaption := TrimRight(Title); 
    end; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Label1.Caption := ActiveCaption; 
end; 
+2

実装の詳細をハッキングするのではなく、シェルAPIを使用します。また、あなたの質問を読んで、フォーマットがいかに悪いかを見てください。次に、それを編集し、フォーマットする方法のヘルプを読んでください。次に、書式設定を修正します。 –

答えて

0

私の知っている唯一の方法は、それまでにアクティブX IShellWindowsおよびIWebBrowserインターフェイスを使用することです。

まず、「Microsoftインターネットコントロール」Active-X(コンポーネントメニュー経由)をインポートする必要があります。これで、 "SHDocVW_TLB"というユニットが得られます。このユニットとActiveXユニットをuses句に入れます。

あなたが提供するウィンドウハンドルから選択されたファイルを取得するには、次の二つの機能を使用できるより:

与えられたハンドルが

function isexplorerwindow(exwnd: hwnd): boolean; 
var 
    p: array[0..max_path] of Char; 
begin 
    GetClassName(exwnd, p, SizeOf(p)); 
    result := ((strcomp(p, 'CabinetWClass') = 0) or (strcomp(p, 'ExploreWClass') = 0)); 
end; 

エクスプローラウィンドウに属している場合は、最初の関数はラフなテストを行います2番目の関数は、選択したn番目のファイルの名前を取得します。

function getexplorerselectedfile(exwnd: hwnd; nr: integer): string; 
var 
    pvShell: IShellWindows; 
    pvWeb2: IWebBrowser2; 
    ovIE: OleVariant; 
    psp: IServiceProvider; 
    psb: IShellBrowser; 
    isw: IShellView; 
    ido: IDataObject; 
    FmtEtc: TFormatEtc; 
    Medium: TStgMedium; 
    dwcount: integer; 
    n: integer; 
    p: array[0..max_path] of Char; 
    s: string; 
    found: boolean; 
begin 
    found := false; 
    result := ''; 
    s :=''; 
    try 
    pvShell := CoShellWindows.Create; 
    for dwcount := 0 to Pred(pvShell.count) do 
    begin 
     ovIE := pvShell.Item(dwcount); 
     if (ovIE.hwnd = exwnd) or ((exwnd = 0) and isexplorerwindow(ovIE.hwnd)) then 
     begin 
     found := true; 
     if (IDispatch(ovIE).QueryInterface(IWebBrowser2, pvWeb2) = S_OK) then 
     begin 
      psp := (pvWeb2 as IServiceProvider); 
      psp.QueryService(IID_IShellBrowser, IID_IShellBrowser, psb); 
      psb.QueryActiveShellView(isw); 
      if isw.GetItemObject(SVGIO_SELECTION, IDataObject, pointer(ido)) = S_OK then 
      begin 
      try 
       FmtEtc.cfFormat := CF_HDROP; 
       FmtEtc.ptd := nil; 
       FmtEtc.dwAspect := DVASPECT_CONTENT; 
       FmtEtc.lindex := -1; 
       FmtEtc.tymed := TYMED_HGLOBAL; 
       ido.GetData(FmtEtc, Medium); 
       GlobalLock(Medium.hGlobal); 
       try 
       n := DragQueryFile(Medium.hGlobal, $FFFFFFFF, nil, 0); 
       if nr < n then 
       begin 
        DragQueryFile(Medium.hGlobal, nr, p, max_path); 
        s := strpas(p); 
       end; 
       finally 
       DragFinish(Medium.hGlobal); 
       GlobalUnLock(Medium.hGlobal); 
       end; 
      finally 
       ReleaseStgMedium(Medium); 
      end; 
      end; 
      pvWeb2 := nil; 
     end; 
     end; 
     ovIE := Unassigned; 
     if found then 
     break; 
    end; 
    pvShell := nil; 
    finally 
    result := s; 
    end; 
end; 

このコードをテストするには、新しいプロジェクトを作成し、フォーム上のメモ。

uses節に次のユニットを追加します。

USES SHDocVW_TLB, ShlObj, activex, shellapi; 

とボタンのイベントハンドラにこのコードを追加:あなたはボタンを押すと、メモは、選択したファイルが含まれています

PROCEDURE TForm2.Button1Click(Sender: TObject); 
VAR 
    wnd, exwnd: hwnd; 
    n: integer; 
    s: STRING; 
BEGIN 
    exwnd := 0; 
    wnd := getwindow(getdesktopwindow, gw_child); 
    REPEAT 
    IF isexplorerwindow(wnd) THEN 
    BEGIN 
     exwnd := wnd; 
     break; 
    END; 
    wnd := getwindow(wnd, gw_hwndnext); 
    UNTIL (wnd = 0) OR (exwnd <> 0); 
    IF exwnd <> 0 THEN 
    BEGIN 
    n := 0; 
    REPEAT 
     s := getexplorerselectedfile(exwnd, n); 
     memo1.Lines.Add(s); 
     inc(n); 
    UNTIL s = ''; 
    END; 
END; 

見つかった最初のエクスプローラウィンドウのもちろん、少なくとも1つのファイルが選択されたエクスプローラウィンドウを開く必要があります。

+0

私はWindowsエクスプローラではないインターネットエクスプローラ – Hector

+0

私は知っている。試してみると、これはWindows Explorer用であることがわかります。 WindowsエクスプローラもIWebBrowser2インターフェイスを使用します。 –

+0

例:https://msdn.microsoft.com/de-de/library/windows/desktop/gg314982%28v=vs.85%29.aspx –

関連する問題