c# - 不在焦点时将键盘输入发送到 Spotify
问题描述
我有一个 AHK 脚本(如下),它在后台向全球 Spotify 桌面应用程序发送各种命令以执行各种操作,但是我玩一个 MMO,它有一个始终运行的反作弊程序,当它检测到 AHK 时会关闭游戏,因为人们可以将它用于宏等。
; "CTRL + Alt + UP" Increase the volume.
^!Up::
DetectHiddenWindows, On
WinGet, winInfo, List, ahk_exe Spotify.exe
Loop, %winInfo%
{
thisID := winInfo%A_Index%
ControlFocus , , ahk_id %thisID%
ControlSend, , ^{up}, ahk_id %thisID%
}
return
反作弊不会检测/关心 C# 程序/应用程序,因此我将代码移植到 C# 并找到了一种向 Spotify 应用程序发送命令以通过SendMessage执行我想要的大部分内容的方法:
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101; //Tried using these to no avail
private const int WM_KEYSYS = 0x0104;
private const int WM_ACTIVATEAPP = 0x001C;
var proc = Process.GetProcessesByName("Spotify").FirstOrDefault(p => !string.IsNullOrWhiteSpace(p.MainWindowTitle));
IntPtr hwnd = proc.MainWindowHandle;
SendMessage(hwnd, 0x0319, (IntPtr)0, (IntPtr)917504);
此命令将播放/暂停当前歌曲,因为这是最终数字 (917504) 对应的内容。Spotify 还提供音量增大/减小的命令代码,但它们会影响我 PC 的整个音量,而不仅仅是 Spotify,这显然不是我想要的。
我已经尝试了数百种PostMessage和SendMessage的组合,但我根本不知道如何发送“Ctrl”+“Up”键来增加音量(反之亦然)。在后台时。我不希望窗口被带到前台等。
任何帮助是极大的赞赏。
我还提到了 AHK 脚本,因为根据我的挖掘,我认为ControlSend 函数是从源代码中的这一点开始运行的https://github.com/Lexikos/AutoHotkey_L/blob/90b5c2ac3208c38b9488a72fc3e6e4f9cf20b276/source/keyboard_mouse.cpp#L135对 C/C++ 了解不够,无法弄清楚如何覆盖需要窗口焦点的函数等。
解决方案
也许考虑将您的 AHK 脚本编译为 exe:它可能不会以这种方式被阻止。而且您无需转移您的 AHK 解决方案。
推荐阅读
- angular - 我应该如何在 Angular6 的组件中通过 HTTP 传递在服务中获得的数据
- java - 如何在 webapp 中使用 ExecutorService
- java - 为什么这段代码会导致多个线程等待未持有的锁
- css - 如何在 font-awesome 等图标上添加阴影效果
- php - 使用类名解析自动加载在 php c-extension 中定义的类
- python - Python中的IndexError - 列表索引超出范围
- c++ - 这种控制 while() 循环是一种好习惯吗?C++
- jms - 从 IIB 10 到远程 WMQ 的 JMSProvider 连接
- angular - Angular CLI 安装问题显示 ENOTFOUND 和代理配置不正确的错误
- primefaces - ManagedBean 方法正在更改 dataTable 对象