我们在 Winforms 应用程序中有一个标准文本框,它在我们的开发环境中以正常方式(即粘贴)响应粘贴(右键单击菜单和 CTRL+V)。
在一个客户站点,粘贴大多被完全忽略(表现得好像剪贴板中没有任何内容)。我们已经使用单行和多行版本的 TextBox 对其进行了测试,并且我们创建了一个只有几个 TextBox 的独立应用程序,并且在这个客户端站点上问题仍然存在。粘贴大多不起作用。
在进一步的测试中,我们发现只需在测试 winforms 应用程序中询问剪贴板的内容,它就会以空字符串的形式返回。用记事本仔细检查,我们发现剪贴板中肯定有东西。
这是我们检查的内容:
- 在测试中,我们确保剪贴板的来源来自记事本或文本框本身,因此我们知道它不是来自 HTML/Word 的怪异东西
- 我们总是可以在文本框中输入,所以文本框似乎不允许修改
- 我们用剪贴板中大量和少量文本尝试过的文本数量,没有区别
- 右键单击粘贴与 CTRL+V:它们要么都工作,要么都不工作 - 所以所有那些关于修复其中一个或另一个的帖子对我们没有帮助
- 寻找模式,我认为一旦失败,直到应用程序重新启动它才会再次工作,但我不确定
- 当粘贴问题确实发生时,剪切和复制不受影响并继续工作
- 客户的机器粘贴功能绝对适用于他们的其他应用程序、记事本、Office 等
请记住,同一个编译的应用程序总是能成功粘贴到我们的开发机器上,偶尔也会成功粘贴到客户的机器上!这就是它如此神秘的原因。
在所有情况下,我们通过粘贴到应用程序旁边的记事本中来验证剪贴板中是否存在某些内容。
有没有其他人看到过这个和/或可以提出解释?
更新/进一步调查
这可能与线程有关吗?我们不会对线程做任何有趣的事情,而且我们从来不用担心使用 STAThread 属性。但是 MSDN 页面说:
Clipboard 类只能在设置为单线程单元 (STA) 模式的线程中使用。要使用此类,请确保您的 Main 方法标记有 STAThreadAttribute 属性。
那么,在一个没有主线程的 Winforms 项目中——只是一个启动窗体,你把这个属性放在哪里呢?为什么我们在开发机器上不需要它?为什么我们从来不需要在我们制作的无数其他 Winforms 应用程序中使用它?