【问题标题】:Checking if the front window is a Game\ using DirectX使用 DirectX 检查前窗口是否是游戏\
【发布时间】:2018-01-26 00:04:15
【问题描述】:

我正在开发一个应用程序,它充当控制器,通过套接字连接到您的 PC,并允许用户使用该应用程序玩 PC 游戏。如果前面运行的应用程序是游戏,我需要在服务器端检查。如果是,那么应用程序将像普通的 XBOX\PS 遥控器一样工作,否则,遥控器不会做任何事情。

如何检查PC的前窗是否是已安装的游戏以及该游戏是否使用DirectX?基本上,由于我“伪造按键”的方式,该应用程序仅适用于 DirectX 游戏。我知道它不会与其他游戏兼容,但它很好。

【问题讨论】:

  • 帮助?请我在挣扎。如果您对如何让 python 直接玩 X 游戏有其他建议,那将会很有帮助。这就像创建一个机器人,但我需要向服务器发送密钥,服务器将执行操作。

标签: python python-2.7 directx


【解决方案1】:

您可以使用答案here 来获取“活动”窗口,例如。将接收输入的那个。然后,您可以使用 GetWindowThreadProcessId 从该窗口获取进程 ID。最后,列出进程已加载的 DLL,使用this 答案,并从 DirectX DLL 中搜索(可能,d3d11.dll 或 d3d12.dll 是您想要搜索的 - 但这取决于游戏)。

请注意,仅仅因为应用程序加载了 D3D,并不一定意味着它是游戏。但是,这也不意味着您的应用程序不管它是什么都不会有用。

【讨论】:

  • 谢谢!生病尝试做到这一点。如果我在几天内解决它会更新。
  • 我试图让它工作,但是 dll 列表没有返回任何东西。我尝试只打印列表,我得到了:'7316' 不被识别为内部或外部命令、可运行程序或批处理文件。
  • 尝试在 os.system 中使用 listdlls 这个词.. 仍然无法识别
  • 经过几个小时的检查后,我发现问题实际上是这样的:ctypes.windll.user32.GetWindowThreadProcessId(hwnd, ctypes.byref(pid)) 这行似乎没有返回正确的 Pid像 os.getpid() 一样,但我仍然无法正确找到前景窗口 PID...
【解决方案2】:

所以,多亏了 MuertoExcobito,我成功完成了我的检查,我想在他的回答中补充一点,如果你想获得任务管理器中所写的正确 PID。 那行得通:

hwnd = ctypes.windll.user32.GetForegroundWindow()
lpdw_process_id = ctypes.c_ulong()
result = ctypes.windll.user32.GetWindowThreadProcessId(hwnd, ctypes.byref(lpdw_process_id))
process_id = lpdw_process_id.value
print process_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多