以下参考代码可以解决问题。关键是要在 FormCreate方法中调用 ChangeMessageProi();
class TForm1: public TForm
{
...
private: // User declarations
void virtual __fastcall WMDropFiles(TWMDropFiles &Message);
public: // User declarations
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles);
END_MESSAGE_MAP (TForm);
}
void __fastcall TForm1::WMDropFiles(TWMDropFiles &Message) {
UINT FileCount = DragQueryFile((HDROP) Message.Drop, 0xFFFFFFFF, NULL, 0);
String FileName;
String FileExtension;
int FileLength;
for(UINT ii=0; ii < FileCount; ii++) {
FileName.SetLength(MAX_PATH);
FileLength = DragQueryFile((HDROP)Message.Drop, ii, FileName.c_str(), FileName.Length());
FileName.SetLength(FileLength);
Memo1->Lines->Add(FileName);
}
DragFinish((HDROP) Message.Drop);
}
//---------------------------------------------------------------------------
#define WM_COPYGLOBALDATA 0x0049
typedef WINUSERAPI BOOL WINAPI CHANGEWINDOWMESSAGEFILTER(UINT message, DWORD dwFlag);
void ChangeMessageProi()
{
HINSTANCE hDllInst = LoadLibrary(_T("user32.dll"));
if (hDllInst)
{
CHANGEWINDOWMESSAGEFILTER *pAddMessageFilterFunc = (CHANGEWINDOWMESSAGEFILTER *)GetProcAddress(hDllInst, "ChangeWindowMessageFilter");
if (pAddMessageFilterFunc)
{
pAddMessageFilterFunc(WM_DROPFILES, MSGFLT_ADD);
pAddMessageFilterFunc(WM_COPYDATA, MSGFLT_ADD);
pAddMessageFilterFunc(0x0049, MSGFLT_ADD);
}
FreeLibrary(hDllInst);
}
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ChangeMessageProi();
DragAcceptFiles(Form1-> Handle, true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
DragAcceptFiles(Form1-> Handle, false);
}
这个方案也不是我发现的,参考:简单方法解决Vista/Win7/Win10无法接收WM_DROPFILES问题 | 第七根弦的技术博客
通过在FormCreate方法中调用ChangeMessageProi(),可以修复cppbuilder xe10.4在Windows 10系统上无法接收WM_DROPFILES消息的bug。此解决方案源于第七根弦的技术博客。

1115

被折叠的 条评论
为什么被折叠?



