【问题标题】:How can I send keys to inactive DirectX "ePSXe" window?如何将密钥发送到非活动的 DirectX“ePSXe”窗口?
【发布时间】:2019-06-15 19:08:25
【问题描述】:

我需要使用 C# 将密钥发送到非活动的“ePSXe”窗口。我使用 Spy++ 获得了窗口的句柄,但是当我使用此代码发送密钥“x”时,我什么也没得到。我该怎么办?

我尝试了 Msg 的不同值,如 0x01000x01010x0102,但没有任何效果。我也试过SendMessage,结果是一样的。

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private void Send_X(IntPtr p)
{
    PostMessage(p, 0x0100, (IntPtr)Keys.X, IntPtr.Zero);
}

我希望窗口能够响应我的键。我只发送了 F 键“F1,F2..”,但没有发送字母键。

SendMessage(p, 0x0100, (IntPtr)Keys.F4, IntPtr.Zero);
SendMessage(p, 0x0101, (IntPtr)Keys.F4, IntPtr.Zero);

我认为发送到不活动的游戏应用程序并不容易,但是这个解决方案对我帮助很大,但我必须专注于 ePSXe。 Sending keys to a DirectX Game.

我仍在寻找可以发送到非活动游戏窗口的解决方案。

【问题讨论】:

  • 如果您的上述评论对您的问题很重要,请edit它,否则可能会被删除。
  • 为什么不使用 SetForegroundWindow(p) 将窗口置于顶部,使其具有输入焦点,然后使用 SendKeys.SendWait("X")?
  • 我目前使用这个SetForegroundWindow(p) 作为一个不完美的解决方案。我的最终目标是发送密钥而不需要将窗口置于前台,因为我想同时操作多个窗口。
  • 你是怎么弄到句柄的?从 Spy++ 直接复制? FindWindow()?
  • 使用这个handle = Process.GetProcessesByName("ePSXe")[0].MainWindowHandle;,然后我用 Spy++ 确认它。

标签: c# directx sendmessage postmessage


【解决方案1】:
Process P = ...get process; 
IntPtr whandle= P.MainWindowHandle;
PostMessage(whandle, WM_KEYDOWN, (IntPtr)(Keys.X), IntPtr.Zero);

如果你有该进程的MainWindowHandle,它就可以工作,否则就不行。

【讨论】:

  • 窗口句柄的 sr 值不稳定,它可能会改变你的目标应用程序的每次运行。你必须找到该过程的顶部窗口。否则,您的消息将无法处理并且还要检查您的窗口句柄是否不是 IntPtr.zero
  • 我已经知道了。我得到了句柄,对此毫无疑问,但这不是问题,因为我能够成功发送 F4。问题出在字母键上。
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2012-10-11
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多