2013-01-09 1 views
6

ファイルエクスプローラからドラッグしてフォームにドロップしたファイルを受け取りようとしましたが、動作しません。私のWM_DROPFILESハンドラは決して呼び出されません。私はそれが何か違いがあれば、Windows 8を実行しています。あなたは、アプリケーションが昇格実行されているほとんどのファイルをDelphiフォームにドラッグアンドドロップすると動作しない

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; 
+0

私はあなたのコードをテストして動作します。 Windows 7、Delphi XE。私は 'DestroyWnd'で行を入れ替えただけですが、それは問題ではありません - 期待どおりに動作します。 – kludg

+2

重複:@stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –

+4

@Serg: 'DestroyWndの順序) 'は重要です。 'inherited'は実際に' HWND'を破壊するので、 'DragAcceptFiles()'は 'inherited'の前に呼び出される必要があります。次に 'Handle'が破壊されて読み込まれると、' CreateWnd() 'を介して新しい' HWND'が作成されます。順序が後方にある場合、最終結果は 'DragAcceptFiles(FALSE)'が最後に呼び出され、ドラッグ&ドロップを無効にすることになります。 –

答えて

17

:ここ

は、私は(私は、フォーム上のTMemoオブジェクトを持っている)何をすべきかの簡単な例です。たぶん、あなたがDelphiを起動しているためです。 Vista以降では、低特権プロセスは上位特権プロセスにメッセージを送信できません。これはMSDN blogの詳細です。

Delphi IDEを高レベルで実行している場合は、これをやめるようにしてください。標準的なデスクトップアプリケーション開発ではそうする必要はほとんどありません。


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

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

procedure TForm1.DestroyWnd; 
begin 
    DragAcceptFiles(WindowHandle, false); 
    inherited; 
end; 
+0

それはおそらくそれでした。ありがとう :) –

関連する問題