触发操作系统以编程方式复制(ctrl + c或Ctrl-x)

我正在制定一个触发剪切和粘贴的程序

粘贴我没有问题(我只是将一个string转储到剪贴板)

切和或Copys被certificate是有点困难

我有的程序是没有焦点,并有几个热键注册的操作系统CTRL + ALT + 2 CTRL + ALT + 3等)

我想用它来触发Windows复制所关注的窗口中突出显示的任何内容

我试着做一个sendkeys

SendKeys.Send("^c"); 

但是,如果有的话,这似乎工作一两次,然后停止工作。

有没有更好的方法来尝试触发窗口应对不同的窗口上突出显示的内容

一种方法是使用Win32 SendInput函数。 使用SendInput ,您必须模拟关键事件和关键事件,以便全键按下注册。 要模拟CTRL + C ,你必须这样做:

  • 按住CTRL
  • C键下来
  • C
  • 按住CTRL

pinvoke.net有一些SendInput使用的例子。 需要注意的一个问题是如果钥匙已经被按下。 您可以使用GetAsyncKeyState仅模拟按键事件,如果密钥尚未关闭。

下面是一些如何模拟CTRL + C的例子代码。 用下面的代码,你可以简单地调用Keyboard.SimulateKeyStroke('c', ctrl: true); 请注意,这就像用户按CTRL + C时一样 ,所以活动应用程序的行为将与发生这种事件时的情况一样(即,如果没有任何内容被正常复制,则不会使用此方法复制任何内容)。

编辑:请参阅David关于批量发送输入的评论。 下面的代码应该通过一次调用发送输入事件来发送整个输入事件序列,以避免与实际用户输入事件交错(并被曲解)。

 using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading; namespace SimulateKeys { static class Keyboard { public static void SimulateKeyStroke(char key, bool ctrl = false, bool alt = false, bool shift = false) { List<ushort> keys = new List<ushort>(); if (ctrl) keys.Add(VK_CONTROL); if (alt) keys.Add(VK_MENU); if (shift) keys.Add(VK_SHIFT); keys.Add(char.ToUpper(key)); INPUT input = new INPUT(); input.type = INPUT_KEYBOARD; int inputSize = Marshal.SizeOf(input); for (int i = 0; i < keys.Count; ++i) { input.mkhi.ki.wVk = keys[i]; bool isKeyDown = (GetAsyncKeyState(keys[i]) & 0x10000) != 0; if (!isKeyDown) SendInput(1, ref input, inputSize); } input.mkhi.ki.dwFlags = KEYEVENTF_KEYUP; for (int i = keys.Count - 1; i >= 0; --i) { input.mkhi.ki.wVk = keys[i]; SendInput(1, ref input, inputSize); } } [DllImport("user32.dll")] static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); [DllImport("user32.dll")] static extern short GetAsyncKeyState(ushort vKey); struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } struct HARDWAREINPUT { public int uMsg; public short wParamL; public short wParamH; } [StructLayout(LayoutKind.Explicit)] struct MOUSEKEYBDHARDWAREINPUT { [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public KEYBDINPUT ki; [FieldOffset(0)] public HARDWAREINPUT hi; } struct INPUT { public int type; public MOUSEKEYBDHARDWAREINPUT mkhi; } const int INPUT_KEYBOARD = 1; const uint KEYEVENTF_KEYUP = 0x0002; const ushort VK_SHIFT = 0x10; const ushort VK_CONTROL = 0x11; const ushort VK_MENU = 0x12; } class Program { static void Main(string[] args) { Thread.Sleep(3000); Keyboard.SimulateKeyStroke('c', ctrl: true); } } } 

如果可以从焦点窗口中获取选定的文本(也许是一个更容易解决的问题),那么最好使用System.Windows.Forms.Clipboard类的SetText方法。