Citrix托管运行的C# WinForms程序Drag&Drop拖拽功能失效如何解决?
我们有一个C# WinForms应用,其中一个控件通过DragDrop功能收集拖放到其上的文件。近期出于基础设施层面的原因,公司决定将该应用迁移到Citrix环境中作为Citrix Application运行。目前我们观测到除了拖拽功能外,其余所有功能均符合预期。
该DragDrop功能在Citrix环境外运行桌面应用时完全正常,从Citrix Desktop启动应用时也能正常工作,但当应用作为Citrix Application托管运行时,不会触发任何拖拽相关事件,DragDrop和DragEnter事件均无响应,鼠标光标仅显示“denied”图标,就好像AllowDrop属性被设为false一样。
我们发现部分应用作为Citrix Application运行时拖拽功能正常(比如标准的Windows资源管理器、Outlook),部分应用表现异常(比如Adobe系列产品),还有部分应用完全无法使用拖拽(比如Foxit Reader)。
编辑1:问题复现简化测试代码
public Form1() { InitializeComponent(); AllowDrop = true; DragEnter += Form1_DragEnter; DragDrop += Form1_DragDrop; } private void Form1_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.All; } private void Form1_DragDrop(object sender, DragEventArgs e) { var formats = e?.Data?.GetFormats() ?? new[] { "<Null>" }; var text = $"Formats: {string.Join(", ", formats)}"; MessageBox.Show(text); }
编辑2:配置调整后的进展
我公司的Citrix运维人员调整了Citrix环境配置后,我们现在已经可以接收到拖拽事件了,但遗憾的是无法获取到之前正常使用的FileDrop格式数据,目前仅能获取到FileContents格式(调用该格式数据时返回null)和FileGroupDescriptorW格式(仅包含文件名,无文件路径)。我们仍在和Citrix方协同排查该问题,后续会同步最终解决结果。
编辑3:最终处理说明
我们最终重构了方案,不再使用Citrix环境下的Drag&Drop功能,且我已经离开原公司,无法跟进该问题的最终处理结果。下方回复中有针对同类问题的解决建议,供遇到同样问题的开发者参考,我本人没有测试过该建议方案。
内容的提问来源于stack exchange,提问作者Magnus Tyrland

