C#/将组合键(CTRL+;S)发送到另一个窗口

C#/将组合键(CTRL+;S)发送到另一个窗口,c#,winapi,window,sendkeys,sendmessage,C#,Winapi,Window,Sendkeys,Sendmessage,我正在尝试将组合键发送到另一个程序,如下所示: // keydown ctrl SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_CONTROL, (IntPtr)0x001D0001); // keydown S SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_S, (IntPtr)0x001F0001); SendMessage(windowBracketsK

我正在尝试将组合键发送到另一个程序,如下所示:

// 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.'
  • 好吧,老实说,我用的不是Spy++,而是Window Detective

伪造
WM\u KEYDOWN/WM\u keydup
消息没有多大意义,只发送它们生成的消息。只有两条
WM_CHAR
消息

请改为

指定按住SHIFT、CTRL和ALT的任意组合的步骤 按下其他几个键时,请将这些键的代码括起来 括号中的键。例如,指定在按住SHIFT键的同时 按下E和C,使用“+(EC)”。指定在按住SHIFT键的同时 按下E键,然后是C键,不移位,使用“+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)");
            }
        }
    }
}

C#十六进制文字是有符号的,这可能会导致符号位问题。您可能需要在十六进制值上加一个
u
后缀,或者
(IntPtr)未选中{(uint)0xhexvalue}
,以确保符号扩展不生效。第三行看起来可疑。你是想给我发一份钥匙吗?您在图像中的注释与您调用的内容不匹配。您不想执行以下操作:按住ctrl键、按住s键、按住s键、按住ctrl键?完整的异常和堆栈跟踪将非常有用。@BenVoigt,我不确定您是否理解。当我不转换为IntPtr时,我得到一个错误:“无法从'uint'转换为'System.IntPtr'”@shox,映像上的代码是脏的。第二行和第三行有发送“s”键。“s”键发送时没有问题。正如你们在Window Detective上看到的一样,但我在第四行看到了错误。(或SendMessage())