不在焦点时将键盘输入发送到 Spotify
Posted
技术标签:
【中文标题】不在焦点时将键盘输入发送到 Spotify【英文标题】:Sending Keyboard inputs to Spotify whilst not in focus 【发布时间】:2020-11-03 18:05:51 【问题描述】:我有一个 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 应用程序发送命令以通过 发送消息:
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++ 的理解不够能够弄清楚如何覆盖需要窗口焦点等的功能。
【问题讨论】:
您的 C# 代码将发送与 AHK 相同的命令。因此,如果 AHK 被阻止,您的应用程序也会被阻止。如果不是,那么您的游戏会阻止进程名称ahk_exe
运行,因此只需重命名 exe 文件
游戏似乎并不关心运行 ahk 脚本的程序叫什么,因为它会阻止它,不管它的名称/它在哪个进程下运行
所以它阻止了 AHK 正在发送的 c++ sendkey。 C# 发送完全相同的 sendkey api。相同的行为如何产生不同的结果?唯一的办法是基于AHK本身的第二个因素
问题不在于阻止特定功能(如 SendKey)运行的反作弊,而是它会阻止 AHK,无论它是否被重命名、移动或使用不同的进程名称。如果它们被编译为 .exe,它也会阻止 AHK 脚本。我更专注于让 C# 代码正常工作,而不是担心反作弊。
@Franck 有些游戏制作得太愚蠢了,例如,如果您安装了任何 AHK 脚本,它们根本不会启动。不管是谁想到的,都有一些真正的问题。我有一个游戏(CoD BO4)在启动时立即崩溃,如果任何 AHK 脚本正在运行,则没有错误消息。在谷歌/游戏的支持下尝试了几天后,我放弃了。然后就像一年后,我在网上看到了一篇关于它的帖子。开发人员会这样做绝对荒谬。但无论如何,如果游戏无法检测到 AHK v2 或 AHK_H,请尝试更多关于主题的操作。我认为加密的 AHK_H 可能有真正的机会。
【参考方案1】:
也许考虑将您的 AHK 脚本编译为 exe:这样可能不会被阻止。而且您无需转移 AHK 解决方案。
【讨论】:
以上是关于不在焦点时将键盘输入发送到 Spotify的主要内容,如果未能解决你的问题,请参考以下文章
使用 C#/Windows API 的虚拟键盘 - 发送键输入,但不获取焦点
Vue中输入框自动获取焦点-移动端ios不能唤起键盘解决办法
Vue中输入框自动获取焦点-移动端ios不能唤起键盘解决办法