7

Embarcadero RADStudioXEを使用してアプリケーションを開発しています。次のコードを使用して、ファイルをアプリケーションにドラッグアンドドロップしてキャッチしようとしています

TMainForm = class(TForm)
public:
  procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, True);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, False);
end;

procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
begin
  inherited;
  showmessage('catch here');
  // some code to handle the drop files here
  Msg.Result := 0;
end;

このコードは問題なく準拠しました。また、ファイルをドラッグアンドドロップすると、ステータスがドラッグアンドドロップに変わったことがカーソルに表示されますが、ドロップした後は何も起こりません(メッセージも表示されません)。それは何か問題がありますか?

4

2 に答える 2

10

TForm.Create2回線使用中

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter (WM_COPYGLOBALDATA, MSGFLT_ADD);

それで全部です

于 2016-07-20T08:14:26.727 に答える
9

プレーンなバニラアプリケーションでは、問題のコードはWMDropFiles、オブジェクトがフォームにドロップされたときに実行されます。それで、明らかにそれが機能するのを止めるために何か他のことが起こっています。最も明白な潜在的な原因は次のとおりです。

  1. メインフォームのウィンドウハンドルは、の最初の呼び出し後に再作成されDragAcceptFilesます。
  2. プロセスは、ファイルをドロップしているプロセスよりも高い整合性レベルで実行されています。たとえば、プロセスを管理者として実行していますか。Delphi IDEを管理者として実行すると、IDEから起動したときにプロセスが管理者として実行されることに注意してください。
  3. プロセス内の他の何かがドラッグ/ドロップを妨害しています。アプリに何が含まれているのかを知らなければ、これが何であるかを推測するのは困難です。問題のコード以外に何も残らなくなるまで、アプリの一部を削除し始めます。

オプション2は非常に妥当なようです。詳細については、以下を参照してください。Q:アプリケーションが高架で実行されているときにドラッグアンドドロップが機能しないのはなぜですか?– A:必須整合性コントロールとUIPI

于 2012-11-20T21:45:01.713 に答える