바탕화면이나 탐색기 등에서 파일을 폼에 드래그 앤 드롭하면 실행시켜주는 프로그램.

 

 

가장 먼저 선행되어야 할 것은 FormCreate 등에 드래그&드롭이 가능하도록 설정하는 일이다.

 

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True); // 드래그&드롭이 가능하도록
end;

 

 

 

 

 

 

그리고 폼의 public 에 WM_DROPFILES 메세지를 받아먹을 이벤트 핸들러를 구현한다. (사실 이게 끝이다..)

 

 

 

type

  TfrmMain=class(TForm)

    ... 중략 ...

  public

    procedure WMDropFiles(var msg: TMessage); message WM_DROPFILES;

 

 

 

 

 

 

아래는 구현부다. 드래그 앤 드롭된 파일을 실행시키는 일을 한다.

 

// Drag&Drop 이벤트 핸들러
procedure TfrmMain.WMDropFiles(var msg: TMessage);
var
  i, NumFiles, NameLength: Integer;
  hDrop: THandle;
  tmpFile: array [0..MAX_PATH] of Char;

 

begin
  {1} // Drop 핸들 얻기
  hDrop:=msg.WParam;
  try
    {2} // 몇개의 파일이 드롭되었는가
    NumFiles:=DragQueryFile(hDrop, $FFFFFFFF, nil, 0);

    {3} // 드롭된 파일 수 만큼 루프를 돌며 실행시킴
    for i:=0 to NumFiles-1 do begin
      {4} // 파일이름 String 의 길이를 얻어옴
      NameLength:=DragQueryFile(hDrop, i, nil, 0);

      {5} // 드롭된 파일의 이름을 받아옴
      DragQueryFile(hDrop, i, tmpFile, NameLength+1);

      {6-1} // 파일이 있다면 open 을 통해 실행시킴
      if FileExists(StrPas(tmpFile)) then begin
        ShellExecute(GetDesktopWindow, 'open', PChar(StrPas(tmpFile)), nil, nil,
                     SW_SHOWNORMAL);
      end
      {6-2} // 파일이 없다면 명령행 인자가 있을지도 모르므로 open이 아니라 실행
      else begin
        WinExec(tmpFile, SW_SHOWNORMAL);
      end;
    end; // for

  finally
    DragFinish(hDrop); // 핸들 해제
  end;

  msg.Result:=0;

  inherited;
end;







Posted by bloodguy
,