7

ファイルエクスプローラーからフォームにドラッグアンドドロップされたファイルを受け入れようとしましたが、機能しません。WM_DROPFILESハンドラーが呼び出されることはありません。違いがあれば、私はWindows8を実行しています。

これが私がしていることの簡単な例です(私はフォームにTMemoを持っています):

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WMDROPFILES(var msg : TWMDropFiles) ; message WM_DROPFILES;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CreateWnd;
begin
  inherited;
  DragAcceptFiles(Handle, True);

end;

procedure TForm1.DestroyWnd;
begin
  inherited;
  DragAcceptFiles(Handle, false);

end;

procedure TForm1.WMDROPFILES(var msg: TWMDropFiles);
var
  i, fileCount: integer;
  fileName: array[0..MAX_PATH] of char;
begin
  fileCount:=DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAX_PATH);
  for i := 0 to fileCount - 1 do
  begin
    DragQueryFile(msg.Drop, i, fileName, MAX_PATH);
    Memo1.Lines.Add(fileName);
  end;
  DragFinish(msg.Drop);
end;
4

1 に答える 1

19

ほとんどの場合、アプリケーションを昇格して実行しています。おそらく、昇格した Delphi を実行しているためです。Vista 以降では、権限の低いプロセスは、権限の高いプロセスにメッセージを送信できません。このMSDN ブログで詳細が説明されています。

Delphi IDE を管理者特権で実行している場合は、停止することをお勧めします。標準的なデスクトップ アプリケーションの開発では、これを行う必要はほとんどありません。


レミーが指摘するように、あなたDestroyWndは間違っています。を呼び出す前に、ウィンドウ ハンドルを破棄していますDragAcceptFiles。順序を逆にするだけです。個人的にはWindowHandleと の両方CreateWndで使用しDestroyWndます。ウィンドウ ハンドルが割り当てられていない場合、このHandleプロパティはウィンドウ ハンドルを作成し、そのようなエラーをマスクします。

procedure TForm1.CreateWnd;
begin
  inherited;
  DragAcceptFiles(WindowHandle, True);
end;

procedure TForm1.DestroyWnd;
begin
  DragAcceptFiles(WindowHandle, false);
  inherited;
end;
于 2013-01-09T19:32:03.860 に答える