【发布时间】: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/stackoverflow 中针对提到的语言测试了几种与剪贴板相关的技术(总共大约 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
【问题讨论】:
-
这可能是XY problem 的情况。你能提供更多关于你想要做什么的信息吗?
-
@mjwills 我真正的问题是为应用程序编写一个脚本,它只支持在某个阶段从剪贴板输入才能正常工作。有一种解决方法,但比从剪贴板读取数据要麻烦得多(它不是“粘贴”,而是一些内部应用程序命令,直接使用剪贴板内容)。
-
剪贴板是供用户决定复制到它的,而不是后台进程。
-
@nilsK 它在 Windows 7 上正常工作,我没有找到任何有关 Win 10 在此特定场景下更改剪贴板行为的详细信息。所以我假设进程可以用相同的逻辑迁移到Win10
-
@laooglee 这就是导致大量旧 VPN 登录软件使用 Java 浏览器小程序的心态。安全性不断发展,有时保持旧东西正常工作的唯一方法是使用虚拟机......或者用新的更安全的东西替换问题的实际核心。
标签: c# python vba windows clipboard