在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板
Posted
技术标签:
【中文标题】在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板【英文标题】:Put text to clipboard in the background process on locked Windows 10 machine 【发布时间】:2019-11-27 10:38:36 【问题描述】:我正在构建一个进程(到目前为止,我已经在 .Net Framework 4.7.2 上尝试过 VBA、Python 和 C#),它需要将一些字符串放在锁定屏幕后面的 Windows 10 机器上的剪贴板上。 为了进行测试,我将其减少到只有两个命令(伪代码,因为使用了 3 种语言。问题末尾的详细信息):
SleepForFiveSec(); //to provide time for locking screen
// now locking machine
SetClipboardContent();
剪贴板对解锁会话有响应,但在机器锁定时变得不可用并返回“剪贴板锁定”错误(特定于语言)。
我已经在 google/*** 中针对提到的语言测试了几种与剪贴板相关的技术(总共大约 6 种),但到目前为止都没有。
机器在 Windows 10 Enterprise 上运行(在 3 台具有相同版本的不同机器上测试)。
代码示例:
C# 选项 1:
using System.Windows.Forms;
.....
[STAThread]
static void Main()
System.Threading.Thread.Sleep(5000);
Clipboard.SetText("test copy clip");
C# opt 2(检查什么是锁定剪贴板):
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetOpenClipboardWindow();
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int GetWindowText(int hwnd, StringBuilder text, int count);
private static string getOpenClipboardWindowText()
IntPtr hwnd = GetOpenClipboardWindow();
StringBuilder sb = new StringBuilder(501);
GetWindowText(hwnd.ToInt32(), sb, 500);
return sb.ToString();
python opt.1:
import pyperclip
import time
time.sleep(5)
pyperclip.copy('text')
python opt.2:
import win32clipboard
import time
time.sleep(5)
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('text')
win32clipboard.CloseClipboard()
VBA 选项 1:
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.SetText "text for input"
clipboard.PutInClipboard
VBA 选项 2: Text To Clipboard in VBA Windows 10 Issue
【问题讨论】:
这可能是XY problem 的情况。你能提供更多关于你想要做什么的信息吗? @mjwills 我真正的问题是为应用程序编写一个脚本,它只支持在某个阶段从剪贴板输入才能正常工作。有一种解决方法,但比从剪贴板读取数据要麻烦得多(它不是“粘贴”,而是一些内部应用程序命令,直接使用剪贴板内容)。 剪贴板是供用户决定复制到它的,而不是后台进程。 @nilsK 它在 Windows 7 上正常工作,我没有找到任何有关 Win 10 在此特定场景下更改剪贴板行为的详细信息。所以我假设进程可以用相同的逻辑迁移到Win10 @laooglee 这就是导致大量旧 *** 登录软件使用 Java 浏览器小程序的心态。安全性不断发展,有时保持旧东西正常工作的唯一方法是使用虚拟机......或者用新的更安全的东西替换问题的实际核心。 【参考方案1】:为此,您的后台进程应该在用户帐户中运行,并且应该在用户登录期间启动。
【讨论】:
您的建议在一般情况下过于严格;当然对于我的情况。我们的 C# 程序仅使用 Excel 启动,我们不想在每次用户登录时启动 Excel。除此之外,从您的回答中不清楚如何在代码中实际实现您的建议。您能否举一个最小的工作示例,例如在 C# 中?以上是关于在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板的主要内容,如果未能解决你的问题,请参考以下文章
在多线程应用程序表单上使用while循环锁定c#阻塞单核机器上的所有线程