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

我已经尝试了数百种 PostMessageSendMessage 的组合,但我根本不知道如何发送键 '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不能唤起键盘解决办法

如何通过在焦点集中时将其移动到键盘顶部/视图中心来突出显示滚动视图中的焦点 UITextField

输入焦点时隐藏ios设备上的键盘

Android 输入法没有传递键盘DELETE事件