1

フォルダとその中のすべてを削除するルーチンがあります。すべてのファイルを削除した後、最後に行うことは次のとおりです。

if not Windows.RemoveDirectory(pname) then
  raise EInOutError.Create(SysErrorMessage(GetLastError));

残念ながら、Windowsエクスプローラーでフォルダーを表示しているウィンドウを開いていると、これからエラーが発生する傾向があります。エラーは、フォルダが空ではないことを示していますが、これは正しくありません。これをオーバーライドする方法はありますか?おそらくウィンドウを強制的に閉じますか?

それが違いを生む場合に備えて、私はVista HomePremium64を使用しています。

4

3 に答える 3

2

実際には、これよりもさらに一般的です。Explorerだけでなく、どのプログラムの現在のディレクトリも削除できません。

対象のディレクトリを指しているエクスプローラー ウィンドウを探し出す何かを作成することはできますが、他のプログラムはどうでしょうか。

于 2009-07-06T04:08:31.127 に答える
1

次のコードは、ウィンドウを閉じるための一般的な方法を示しています。この例は Internet Explorer 用です。Windows Explorer 用に少し調整する必要があります。

program Sample;

function CloseIEs(Wnd : HWnd; Form : TForm1) : Boolean; export; stdcall;
var
  sCap : array [0..255] of char;
begin
  GetWindowText (Wnd, sCap, sizeof(sCap));
  if pos ('Microsoft Internet Explorer', sCap) > 0 then
  begin
    PostMessage (Wnd, WM_CLOSE, 0, 0);
  end
  else
  begin
    // check by class name!
    GetClassName (Wnd, sCap, sizeof(sCap));
    if sCap = 'IEFrame' then
      PostMessage (Wnd, WM_CLOSE, 0, 0);
  end;

  CloseIEs := true; { next window, please }
end;

begin
  // close all hidden instances
  EnumWindows(@CloseIEs, 0);
end.
于 2009-07-05T17:16:04.743 に答える
1

次の例を参照してください: https://devblogs.microsoft.com/oldnewthing/20040720-00/?p=38393。Delphi での同じコードは次のとおりです。 =ru&tl=en&history_state0=

この例を使用してすべてのウィンドウを列挙し、フォルダーで開いているエクスプローラーのウィンドウを見つけることができます。その後、WM_CLOSE メッセージを送信して閉じることができます。

于 2009-07-05T18:46:18.327 に答える