将Ctrl + C发送到上一个活动窗口

Nie*_*sma 1 c# wpf window

我正在尝试编写一个位于系统托盘中的小应用程序.我已经注册了一个热键.当激活热键并激活应用程序时,我想将Ctrl + C发送到最后一个活动窗口,这样我就可以将突出显示的文本放入剪贴板.

这是我到目前为止所得到的:

    //http://stackoverflow.com/questions/9468476/switch-to-last-active-application-like-alt-tab

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsWindowVisible(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern IntPtr GetLastActivePopup(IntPtr hWnd);

    [DllImport("user32.dll", ExactSpelling = true)]
    static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    const uint GA_PARENT = 1;
    const uint GA_ROOT = 2;
    const uint GA_ROOTOWNER = 3;

    public static IntPtr GetPreviousWindow()
    {
        IntPtr activeAppWindow = GetForegroundWindow();
        if (activeAppWindow == IntPtr.Zero)
            return IntPtr.Zero;

        IntPtr prevAppWindow = GetLastActivePopup(activeAppWindow);
        return IsWindowVisible(prevAppWindow) ? prevAppWindow : IntPtr.Zero;
    }

    public static void FocusToPreviousWindow()
    {
        IntPtr prevWindow = GetPreviousWindow();
        if (prevWindow != IntPtr.Zero)
            SetForegroundWindow(prevWindow);
    }

    ...

    private static void OnHotKeyFired()
    {
        FocusToPreviousWindow();

        SendKeys.SendWait("^(c)");

        _viewModel.Input = Clipboard.GetText();

        new UIWindow(_viewModel).ShowDialog();
    }
Run Code Online (Sandbox Code Playgroud)

但我不能让SendKeys工作.在大多数应用程序中没有任何好处,这意味着ctrl-c不会被解雇.在Ms Word中,当执行SendWait时,我的文档中插入了版权符号(c).

更新:

我尝试过WM_COPY和SendMessage:

private static void OnHotKeyFired()
{
    IntPtr handle = GetPreviousWindow();
    SendMessage(handle, WM_COPY, IntPtr.Zero, IntPtr.Zero);
    _viewModel.Input = Clipboard.GetText();
    ...
Run Code Online (Sandbox Code Playgroud)

它适用于Word但不适用于Excel,Notepad,Visual Studio

Han*_*ant 5

    SendKeys.SendWait("^(c)");
Run Code Online (Sandbox Code Playgroud)

这不会发送Ctrl + C,也会发送括号.你可能意味着"^{c}",花括号而不是圆括号.否则Word插入版权符号的原因,它会自动更正(c)到©.固定:

    SendKeys.SendWait("^c");
Run Code Online (Sandbox Code Playgroud)

如果您仍有问题,可能会,然后阅读SendKeys的MSDN文章.它建议使用.config文件,以便它使用不同的方式来注入击键.SendInput()比后来的Windows版本上的日志钩子效果更好.