BCB筆記:將檔案拖曳到程式中開啟

拖曳檔案到程式中開啟,需要系統配合,而BCB沒有提供一個簡單的方法達成,因此就需要寫用win32api的功能,使BCB的程式也能將拖曳的檔案開啟。


1. 將下面這一段程式碼加主程式的 .H 檔的public函數/成員的最後面(放在最後面是方便管理),還有就是這段程式碼沒有寫錯,END_MESSAGE_MAP (TForm)的TFrom也不需要更改!

void __fastcall WmDropFiles(TWMDropFiles& Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WmDropFiles)
END_MESSAGE_MAP (TForm)


2. 接著切換到.CPP中,點擊點主視窗,並設定主視窗的Events的FormCreate,將下面的程式碼加入FromCreate中。

DragAcceptFiles(Handle, true);


3. 最後是寫開啟檔案的WmDropFiles函數內容。

void __fastcall TMainForm::WmDropFiles(TWMDropFiles& Message)
{
char buff[MAX_PATH];
HDROP hDrop = (HDROP)Message.Drop;
int numFiles = DragQueryFile(hDrop, -1, NULL, NULL);

if (numFiles >= 1)
{
for (int i=0 ; i<numFiles ; ++i)
{
DragQueryFile(hDrop, i, buff, sizeof(buff));

// 在這裡寫下開啟檔案的程式碼, buff就是檔案路徑的字串。
}
}
DragFinish(hDrop);
}

留言

Larry Lai寫道…
嗨 你好

很開心在google上找到你的BCB筆記

我想請問你
如果想要把檔案拖曳到程式的ICON上直接開啟
要怎麼做呢? 不知道你是否是寫過這樣的function

或者 當我們寫了一個執行檔(ex: abc.exe)
要讓系統所有*.abc的檔案 直接按兩下開啟執行abc.exe
我試了很久 還是無法直接按兩下檔案 然後開啟

不知道你是否對這兩個問題有解答

謝謝你

Larry
Mirochiu寫道…
1. 如果你瞭解command line的程式,其實把檔案拉到程式的程式的Icon上開啟,是處理Command line的參數就可以簡單達成。

將下面這個範例程式碼加到BCB GUI的建構子(例如:TForm1::TForm1(TComponent* Owner)),就可以瞭解在程式啟動的時候,會得到傳遞給GUI程式的參數,也就是檔案的路徑名稱,之後在依照你想要的處理來進行就可以了!

int argc;
LPWSTR* argv;

argv = CommandLineToArgvW(GetCommandLineW(), &argc);

AnsiString msg;
for (int i=0 ; i < argc ; ++i)
{
msg += argv[i];
msg += "\r\n";
}
ShowMessage(msg);

2. 要完成這個功能,得先完成 1.的程式功能。然後搭配的是登錄機碼的技巧,不巧的是我對這些還不熟,所以用比較笨的方法。

若我要設.abc的檔案,就在.abc的檔案上按右鍵→開啟檔案→選擇程式,勾選永遠使用選取的程式執行開啟,然後按瀏覽找到你的程式路徑,按確定以完成設定,這樣以後就可以點兩下就直接開啟。
Larry Lai寫道…
嗨 你好


經由你的方法
已經可以開啟檔案

謝謝你的建議
jyezheng表示…
您好
感謝您的文章 幫助了我很多
跟您說聲謝謝。
Nola寫道…
你好, 最近發現原本寫好的拖曳功能不能使用了, 改成你的程式也無法執行, 想請問如果不是程式碼有問題的話, 有可能會哪邊出錯? 很抱歉, 問這種莫名的問題Orz...
Mirochiu寫道…
在Win7的系統下會有一些限制,如果你是用系統管理員權限開啟你寫的程式的話,會變得無法拖曳檔案到程式中。
PS.系統管理員權限的設定==>對程式右鍵可以用系統管理員權限開啟, 或是設定這隻程式的相容性的地方可以看是否勾選了以系統管理員權限開啟程式。