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())