5,893
社区成员
句柄已经是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;
可以用大漠或者其他第三方插件。
百度的:有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。
窗口不是你建立的,不应该DestroyWindow
这不是和我写的一样么。之是多了个释放
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消息来模拟空格键的按下和释放。
为了确保代码正确运行,你需要将目标窗口的句柄传递给模拟按键的消息处理函数,并确保该函数正确处理了这些消息。另外,为了避免内存泄漏,你应该在发送完消息后释放窗口句柄。
有些游戏是DirectX的,不通过按键消息的