首页 > 解决方案 > 不在焦点时将键盘输入发送到 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,这显然不是我想要的。

我已经尝试了数百种PostMessageSendMessage的组合,但我根本不知道如何发送“Ctrl”+“Up”键来增加音量(反之亦然)。在后台时。我不希望窗口被带到前台等。

任何帮助是极大的赞赏。

我还提到了 AHK 脚本,因为根据我的挖掘,我认为ControlSend 函数是从源代码中的这一点开始运行的https://github.com/Lexikos/AutoHotkey_L/blob/90b5c2ac3208c38b9488a72fc3e6e4f9cf20b276/source/keyboard_mouse.cpp#L135对 C/C++ 了解不够,无法弄清楚如何覆盖需要窗口焦点的函数等。

标签: c#autohotkeyspotifysendkeys

解决方案


也许考虑将您的 AHK 脚本编译为 exe:它可能不会以这种方式被阻止。而且您无需转移您的 AHK 解决方案。


推荐阅读