c# - 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.'
- 好吧,老实说,我使用的不是 Spy++,而是 Window Detective。
解决方案
伪造消息没有多大意义WM_KEYDOWN/WM_KEYUP
,只发送它们生成的消息。就这两条WM_CHAR
消息。
要指定在按下其他几个键的同时按住 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)");
}
}
}
}
推荐阅读
- ruby - 使用 Time.now.between? 查看今天是否在两个日期期间之间
- python - python浓缩重复代码和子图
- django - 如何在使用 Python Requests 库获得的结果中提取特定数据
- swift - 如何在 MacOS 中显示 NSSavePanel?
- onedrive - 如何检查谁在锁定我的 OneDrive 共享文件以进行编辑?
- actions-on-google - 是否可以在 Google Assistant Offline 的 Actions 中运行我的测试应用程序?
- google-chrome - Chrome 中的虚假地理位置
- c# - 带有 semaphoreSlim 的模式 WaitAllOneByOne,这个实现线程安全吗?
- javascript - 更新 Javascript 对象中的函数调用
- jquery - Datatable 正在工作,但在单击页面时重定向到未定义的页面