C# SendKeys.SendWait()不';I don’我不能在所有计算机上都始终如一地工作
我正在使用SendKeys.SendWait()在窗口之间来回复制和粘贴文本。我已经编写了一个复制粘贴方法,它使用C# SendKeys.SendWait()不';I don’我不能在所有计算机上都始终如一地工作,c#,.net,winforms,sendkeys,C#,.net,Winforms,Sendkeys,我正在使用SendKeys.SendWait()在窗口之间来回复制和粘贴文本。我已经编写了一个复制粘贴方法,它使用用户32.dll中的FindWindow和setforegroundindow方法 大多数情况下,在我的设备上,该方法都能完美工作。但是,在不同的设备上运行时,它非常不一致。所有设备都使用相同的操作系统,并且打开的应用程序大致相同 有时,该方法粘贴错误的文本(来自上一个副本),有时该方法根本不起作用 我已确保使用新的SendKeys.SendWait()实现,如中所述 我还尝试在复制
用户32.dll中的FindWindow
和setforegroundindow
方法
大多数情况下,在我的设备上,该方法都能完美工作。但是,在不同的设备上运行时,它非常不一致。所有设备都使用相同的操作系统,并且打开的应用程序大致相同
有时,该方法粘贴错误的文本(来自上一个副本),有时该方法根本不起作用
我已确保使用新的SendKeys.SendWait()
实现,如中所述
我还尝试在复制和粘贴功能之间加入睡眠功能。这似乎不会影响输出,只会使输出变慢。即使在睡眠状态下,程序的复制和粘贴也不一致
public static bool CopyPaste(string startWindow, string endWindow, int delay = 0)
{
int startWindowID = FindWindow(null, startWindow);
int endWindowID = FindWindow(null, endWindow);
SetForegroundWindow(startWindowID);
SendKeys.SendWait("^{a}");
SendKeys.SendWait("^{c}");
Thread.Sleep(delay);
SetForegroundWindow(endWindowID);
SendKeys.SendWait("^{a}");
SendKeys.SendWait("^{v}");
}
我知道从其他窗口复制和粘贴是很挑剔的,不是一个好主意,但我别无选择
使用的是SendKeys.SendWait()
正确的方法吗?有没有其他更可靠的方法?如何提高跨平台的可靠性?
编辑:
虽然Clipboard类确实正确地传输了文本,但它似乎更不可靠。它经常抛出一个错误,表示“请求的剪贴板操作未成功。”从任意窗口到另一个任意窗口?或者像MS Word这样的特殊窗口?@kennyzx其中一个窗口只是一个任意窗口(我通常用写字板测试)。另一个窗口是程序窗体本身。我一直在使用FindWindow
根据名称查找windows句柄。Windows的命名在所有设备上都是一致的。对于程序本身,考虑使用类,它提供对系统剪贴板的直接访问,使用<代码>剪贴板。GETTEX/SETTEX/<代码>方法来替换Ctrl +C/CTRL+V,然后只需要使用<代码> SeNekKest</代码>来操作任意窗口。SendKeys
确实是一种松散的方法,它不能保证每次都能成功操作,其结果受到许多因素的影响。我不会采用这种方法,除非程序“只是为了好玩”。@kennyzx使用Clipboard类实际上让事情变得更糟。复制和粘贴不太可靠。虽然它有时仍然可以工作,但它经常抛出一个请求的剪贴板操作未成功的错误。从任意窗口到另一个任意窗口?或者像MS Word这样的特殊窗口?@kennyzx其中一个窗口只是一个任意窗口(我通常用写字板测试)。另一个窗口是程序窗体本身。我一直在使用FindWindow
根据名称查找windows句柄。Windows的命名在所有设备上都是一致的。对于程序本身,考虑使用类,它提供对系统剪贴板的直接访问,使用<代码>剪贴板。GETTEX/SETTEX/<代码>方法来替换Ctrl +C/CTRL+V,然后只需要使用<代码> SeNekKest</代码>来操作任意窗口。SendKeys
确实是一种松散的方法,它不能保证每次都能成功操作,其结果受到许多因素的影响。我不会采用这种方法,除非程序“只是为了好玩”。@kennyzx使用Clipboard类实际上让事情变得更糟。复制和粘贴不太可靠。虽然有时它仍然可以工作,但它经常抛出一个请求的剪贴板操作未成功的错误。