cppbuilder xe10.4 WM_DROPFILES 在win10上收不到的问题

通过在FormCreate方法中调用ChangeMessageProi(),可以修复cppbuilder xe10.4在Windows 10系统上无法接收WM_DROPFILES消息的bug。此解决方案源于第七根弦的技术博客。

 以下参考代码可以解决问题。关键是要在 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问题 | 第七根弦的技术博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值