私の知っている唯一の方法は、それまでにアクティブ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つのファイルが選択されたエクスプローラウィンドウを開く必要があります。
実装の詳細をハッキングするのではなく、シェルAPIを使用します。また、あなたの質問を読んで、フォーマットがいかに悪いかを見てください。次に、それを編集し、フォーマットする方法のヘルプを読んでください。次に、書式設定を修正します。 –