delphi怎么向游戏窗口发送按键用vk是不行,用句柄也不行?怎么可能?

sxper 2023-09-11 13:56:55

句柄已经是win核心了。怎么会不行。反正窗体句柄找到 ,向该窗体发送空格的时候不行。发送任意字符都不行。

procedure TForm1.Button1Click(Sender: TObject);
var
  FindWindowhw:THandle;
begin
FindWindowhw:=FindWindow(nil,PChar('皓月云-少女前线4'));
if FindWindowhw<>0 then //找到此窗口句柄.
begin
//MessageBox(self.handle,'找到该窗口句柄','提示',0);
end
else begin
MessageBox(self.handle,'没找到该窗口句柄','提示',0);
end;

  //PostKey(FindWindowhw, 32);
  SendMessage(FindWindowhw,WM_SETTEXT,255,Integer(PChar(' ')));
  SendMessage(FindWindowhw,WM_Char,Wparam('z'),2);

SendMessage(FindWindowhw,WM_KEYDOWN,VK_SPACE,0);
SendMessage(FindWindowhw,WM_KEYUP,VK_SPACE,0);

end;

...全文
214 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kusosa 2023-12-06
  • 打赏
  • 举报
回复

可以用大漠或者其他第三方插件。

ooolinux 2023-09-13
  • 打赏
  • 举报
回复

百度的:有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。

  • 打赏
  • 举报
回复

窗口不是你建立的,不应该DestroyWindow

sxper 2023-09-12
  • 打赏
  • 举报
回复

这不是和我写的一样么。之是多了个释放

秋天之落叶 2023-09-12
  • 举报
回复
@sxper 看一下FindWindowhw的值是什么?
sxper 2023-09-15
  • 举报
回复
@秋天之落叶 133830 数字
xjhaohao 2023-09-11
  • 打赏
  • 举报
回复

Delphi中向其他窗口发送按键,你需要首先获取目标窗口的句柄,然后使用SendMessage函数发送按键消息。你的代码中已经获取了窗口句柄,但是发送按键消息的部分存在问题。

在Windows中,按键消息是通过模拟键盘输入来触发的,而不是直接向窗口发送按键事件。要模拟键盘输入,你需要使用另一个窗口消息——WM_KEYDOWN和WM_KEYUP。

下面是演示如何使用SendMessage向目标窗口发送模拟的按键消息:

delphi
复制
uses
Windows;
procedure模拟按键;
var
WindowHandle: THandle;
begin
// 获取目标窗口的句柄
WindowHandle := FindWindow(nil, '皓月云-少女前线4');
if WindowHandle <> 0 then
try
// 发送模拟的按键消息
SendMessage(WindowHandle, WM_KEYDOWN, VK_SPACE, 0);
SendMessage(WindowHandle, WM_KEYUP, VK_SPACE, 0);
finally
// 释放窗口句柄
DestroyWindow(WindowHandle);
end;
end;

在这个示例中,我们首先获取目标窗口的句柄,然后使用SendMessage函数发送模拟的按键消息。注意,我们使用了WM_KEYDOWN和WM_KEYUP消息来模拟空格键的按下和释放。
为了确保代码正确运行,你需要将目标窗口的句柄传递给模拟按键的消息处理函数,并确保该函数正确处理了这些消息。另外,为了避免内存泄漏,你应该在发送完消息后释放窗口句柄。

ooolinux 2023-09-11
  • 打赏
  • 举报
回复

有些游戏是DirectX的,不通过按键消息的

5,735

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧