12

我们在 Winforms 应用程序中有一个标准文本框,它在我们的开发环境中以正常方式(即粘贴)响应粘贴(右键单击菜单和 CTRL+V)。

在一个客户站点,粘贴大多被完全忽略(表现得好像剪贴板中没有任何内容)。我们已经使用单行和多行版本的 TextBox 对其进行了测试,并且我们创建了一个只有几个 TextBox 的独立应用程序,并且在这个客户端站点上问题仍然存在。粘贴大多不起作用。

在进一步的测试中,我们发现只需在测试 winforms 应用程序中询问剪贴板的内容,它就会以空字符串的形式返回。用记事本仔细检查,我们发现剪贴板中肯定有东西。

这是我们检查的内容:

  • 在测试中,我们确保剪贴板的来源来自记事本或文本框本身,因此我们知道它不是来自 HTML/Word 的怪异东西
  • 我们总是可以在文本框中输入,所以文本框似乎不允许修改
  • 我们用剪贴板中大量和少量文本尝试过的文本数量,没有区别
  • 右键单击粘贴与 CTRL+V:它们要么都工作,要么都不工作 - 所以所有那些关于修复其中一个或另一个的帖子对我们没有帮助
  • 寻找模式,我认为一旦失败,直到应用程序重新启动它才会再次工作,但我不确定
  • 当粘贴问题确实发生时,剪切和复制不受影响并继续工作
  • 客户的机器粘贴功能绝对适用于他们的其他应用程序、记事本、Office 等

请记住,同一个编译的应用程序总是能成功粘贴到我们的开发机器上,偶尔也会成功粘贴到客户的机器上!这就是它如此神秘的原因。

在所有情况下,我们通过粘贴到应用程序旁边的记事本中来验证剪贴板中是否存在某些内容。

有没有其他人看到过这个和/或可以提出解释?

更新/进一步调查
这可能与线程有关吗?我们不会对线程做任何有趣的事情,而且我们从来不用担心使用 STAThread 属性。但是 MSDN 页面说:

Clipboard 类只能在设置为单线程单元 (STA) 模式的线程中使用。要使用此类,请确保您的 Main 方法标记有 STAThreadAttribute 属性。

那么,在一个没有主线程的 Winforms 项目中——只是一个启动窗体,你把这个属性放在哪里呢?为什么我们在开发机器上不需要它?为什么我们从来不需要在我们制作的无数其他 Winforms 应用程序中使用它?

4

3 回答 3

8

你付出的很少。这不太可能是由程序中的问题引起的,更可能是用户机器特有的环境问题。

一些背景。Winforms 应用程序中的 TextBox 控件与记事本用于编辑文本的组件完全相同。底层的原生组件是一个 Edit 控件,从 1.0 版开始,它一直是 Windows 中的标准组件。请注意右键单击文本框和记事本时获得的上下文菜单是相同的。该菜单中的粘贴命令和按 Ctrl+V 没有区别,它们都会导致将WM_PASTE 消息发送到本机编辑控件。它在内部处理剪贴板,该代码完全超出您的范围,并且在记事本中的操作与在程序中的操作相同。

线程单元问题不太可能发生,客户应该也对复制命令有问题,您应该之前已经注意到它。在 C# 中,它由 Main() 方法上的 [STAThread] 属性设置,它是在 VB.NET 中由编译器生成的。

有很多实用程序会导致剪贴板出现异常。首先是剪贴板查看器,即挂接到剪贴板通知的程序。AddClipboardFormatListener() 是底层的 winapi 函数。他们倾向于通过允许剪贴板存储多个项目或提供剪贴板上内容的另一种视图来执行诸如“增强”剪贴板之类的操作。他们倾向于通过不正确地将通知传递给下一个查看器或通过不正确取消注册来破坏查看器链来破坏机器的稳定性。这种断裂的链条本身就是导致“在记事本中可以正常工作,而不是在我的”中。

当然,这类问题很难诊断,并且通常在计算机用户彻底清洁他的机器之前不会得到解决。这是他的问题而不是你的问题总是很难传递的消息,不能真正帮助你。

于 2014-02-11T15:31:39.927 回答
2

我有一个花哨的防火墙,它还能够阻止应用程序在每个应用程序的基础上查看剪贴板中的数据。

它不妨碍写作;该功能的重点是阻止恶意软件窃取可能最终出现在剪贴板中的重要信息,例如密码。
它还可以阻止任何给定的应用程序执行各种其他系统任务,例如截屏或使用默认系统浏览器导航到网页。

客户可能安装了类似的东西,规则中允许使用记事本。

于 2014-02-18T18:37:16.840 回答
0

有时,其他第三方应用程序可能正在控制您的剪贴板,例如Snagit,第三方应用程序可能有其用于剪贴板的过滤器,用于标准控件,例如记事本和其他基于 Windows 的应用程序。

您可以做的是您必须找出客户端计算机上的任何其他应用程序都可以访问剪贴板。您可以通过任务管理器或正在运行的进程进行检查。它可能会帮助你。

我在使用 Snagit 应用程序时遇到过类似的问题。此应用程序阻止我的程序设置剪贴板文本供自己使用。

于 2014-02-13T12:28:49.613 回答