首页 > 解决方案 > C# / 将组合键 (CTRL+S) 发送到另一个窗口

问题描述

我正在尝试将组合键发送到另一个这样的程序:

// keydown ctrl
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_CONTROL, (IntPtr)0x001D0001); 
// keydown S
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_S, (IntPtr)0x001F0001); 
SendMessage(windowBracketsKeyListener, 0x102, (IntPtr)115, (IntPtr)0); 
// keyup ctrl 
SendMessage(windowBracketsKeyListener, 0x101, (IntPtr)VK_CONTROL, (IntPtr)0xC01D0001); 

最后一行我有一个错误(看下图)。

我发送与 Spy++ 中相同的命令。因此,首先我自动尝试单击CTRL+S一个窗口,然后检查我在 Spy++ 中得到的内容并编写了相同的命令。

错误:

System.OverflowException: 'Arithmetic operation resulted in an overflow.'

带有我的命令、来自 Window Detective 的命令和收到错误的图像

标签: c#winapiwindowsendkeyssendmessage

解决方案


伪造消息没有多大意义WM_KEYDOWN/WM_KEYUP,只发送它们生成的消息。就这两条WM_CHAR消息。

改用 SendKeys.Send(String) 方法

要指定在按下其他几个键的同时按住 SHIFT、CTRL 和 ALT 的任意组合,请将这些键的代码括在括号中。例如,要指定在按下 E 和 C 时按住 SHIFT,请使用“+(EC)”。要指定在按 E 时按住 SHIFT,然后按 C 而不按 SHIFT,请使用“+EC”。

以下示例适用于我:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test
{
    static class Program
    {
        [DllImport("user32.dll")]
        public static extern int SetForegroundWindow(IntPtr hWnd);
        static void Main()
        {

            Process[] processes = Process.GetProcessesByName("notepad"); //notepad used be test

            foreach (Process proc in processes)
            {
                SetForegroundWindow(proc.MainWindowHandle);
                SendKeys.SendWait("^(s)");
            }
        }
    }
}

推荐阅读