为什么用 keybd_event,mouse_event 不管用啊?

jsandy 2004-04-13 08:47:11
有玩奇迹的朋友么?知道怎么样用DELPHI做的程序控制奇迹里的键盘和鼠标吗?

用 keybd_event,mouse_event 不管用哦。
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ekin 2004-05-05
  • 打赏
  • 举报
回复
可以的,不过要记得keyup
johnzhangbit 2004-05-05
  • 打赏
  • 举报
回复
我曾经搞过一个,需要用线程插入
做个Dll插进去,这样儿的话不但可以控制其鼠标,键盘事件 还可以。。。。嘿嘿
把我以前做的DLL代码给你看看,自己修改一下吧。

library Hook;

uses
SysUtils,windows, Messages;

const
WM_UNSUBCLASS = WM_USER + 1001; {卸载子类化消息}
WM_NEWMESSAGE = WM_USER + 1002; {通知监视窗口拦到了新消息}
HOOK_EVENT_NAME = 'MyHook';

type
PMyDLLVar = ^TMyDLLVar;
TMyDLLVar = record
SubClass: Boolean; {是否已经子类化}
HookWindow, SpyWindow: LongWORD; {要安装HOOK的窗口及用于接收消息的窗口}
hHook: LongWORD; {HOOK句柄}
OldWndProc: pointer; {旧的窗口过程}
MsgHwnd: LongWORD;
Msg: TMessage;
end;

var
DLLData: PMyDLLVar;

{---------------------------------------}
{函数名:NewWndProc
{函数功能:新的窗口过程
{函数参数:hHwnd:窗口句柄 Msg:消息ID
{ wParam, lParam:消息参数
{函数返回值:下一个窗口过程的返回值
{---------------------------------------}
function NewWndProc(hHwnd, Msg, wParam, lParam: LongWORD): Longint; stdcall;
begin
if Msg = WM_UNSUBCLASS then {如果收到卸载子类化消息就恢复以前的WndProc}
begin
SetWindowLong(DLLData^.HookWindow, GWL_WNDPROC, longint(DLLData^.OldWndProc));
exit;
end;
{这儿是把收到的消息放在映射的内存中,我们自己的程序可以通过读这个内存来得到监视到的消息.}
DLLData^.Msg.Msg := Msg;
DLLData^.Msg.WParam := wParam;
DLLData^.Msg.LParam := lParam;
DLLData^.MsgHwnd := hHwnd;
{给监视窗口发送拦载新消息的消息}
SendMessage(DLLData^.SpyWindow, WM_NEWMESSAGE, 0, 0);
{这儿可以添加自己对目标进程消息处理的代码,因为己经是在目标进程的地址空间内,现在可以为所
欲为 ^_^)
Result := CallWindowProc(DLLData^.OldWndProc, hHwnd, Msg, wParam, lParam);
end;

{------------------------------------}
{过程名:HookProc
{过程功能:HOOK过程
{过程参数:nCode, wParam, lParam消息的相
{ 关参数
{------------------------------------}
procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
var
hEvent: THandle;
begin
if not DllData^.SubClass then {如果此窗口未子类化}
begin {保存窗口过程地址并子类化}
if hEvent <> 0 then
begin
WaitForSingleObject(hEvent, INFINITE);
CloseHandle(hEvent);
end;
DLLData^.OldWndProc := pointer(GetWindowLong(DLLData^.HookWindow, GWL_WNDPROC));
SetWindowLong(DLLData^.HookWindow, GWL_WNDPROC, integer(@NewWndProc));
DLLData^.SubClass := True;
hEvent := OpenEvent(Synchronize, False, HOOK_EVENT_NAME);
end;
{调用下一个Hook}
CallNextHookEx(DLLData^.hHook, nCode, wParam, lParam);
end;


{------------------------------------}
{函数名:InstallHook
{函数功能:在指定窗口上安装HOOK
{函数参数:HWindow:要安装HOOK的窗口
{ SWindow:用于接收消息的窗口
{返回值:成功返回TRUE,失败返回FALSE
{------------------------------------}
function InstallHook(HWindow, SWindow: LongWORD):Boolean;stdcall;
var
ThreadID: LongWORD;
hEvent: THandle;
begin
Result := False;
DLLData^.hHook := 0;
DLLData^.HookWindow := HWindow;
DLLData^.SpyWindow := SWindow;
{得到指定窗口的线程ID}
ThreadID := GetWindowThreadProcessId(HWindow, nil);
{给指定窗口挂上钩子}
hEvent := CreateEvent(nil, True, False, HOOK_EVENT_NAME);
DLLData^.hHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, ThreadID);
SetEvent(hEvent);
CloseHandle(hEvent);
if DLLData^.hHook > 0 then Result := True; {是否成功HOOK}
end;

{------------------------------------}
{过程名:UnHook
{过程功能:卸载HOOK
{过程参数:无
{------------------------------------}
procedure UnHook;stdcall;
begin
{发送卸载子类化消息给指定窗口}
SendMessage(DLLData^.HookWindow, WM_UNSUBCLASS, 0, 0);
DLLData^.SubClass := False;
{卸载Hook}
UnhookWindowsHookEx(DLLData^.hHook);
end;

{------------------------------------}
{过程名:DLL入口函数
{过程功能:进行DLL初始化,释放等
{过程参数:DLL状态
{------------------------------------}
procedure MyDLLHandler(Reason: Integer);
var
FHandle: LongWORD;
begin
case Reason of
DLL_PROCESS_ATTACH:
begin {建立文件映射,以实现DLL中的全局变量}
FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ff, 'MYDLLDATA');
if FHandle = 0 then
if GetLastError = ERROR_ALREADY_EXISTS then
begin
FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'MYDLLDATA');
if FHandle = 0 then Exit;
end else Exit;
DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData = nil then
CloseHandle(FHandle);
end;
DLL_PROCESS_DETACH:
if Assigned(DLLData) then
begin
UnmapViewOfFile(DLLData);
DLLData := nil;
end;
DLL_THREAD_ATTACH:;
DLL_THREAD_DETACH:;
end;
end;

{$R *.res}
exports
InstallHook, UnHook, HookProc;

begin
DLLProc := @MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
end.

编译这个DLL,然后在我们的程序中加载这个DLL,并调用InstallHook(目标窗口句柄, 自己窗口句柄)就可 以实现对目标窗口消息的监视了(在接收到WM_NEWMESSAGE消息时读映射的内存),调用UnHook则可以卸载掉子类化和HOOK.
SuperSeventh 2004-05-04
  • 打赏
  • 举报
回复
用Message消息处理可以吗?
jsandy 2004-05-04
  • 打赏
  • 举报
回复
up
fengyvn 2004-04-14
  • 打赏
  • 举报
回复
自己发送鼠标和键盘消息.
jsandy 2004-04-14
  • 打赏
  • 举报
回复
具体应该怎么搞啊?给些代码出来呀.
上海老李 2004-04-13
  • 打赏
  • 举报
回复
那要用钩子才能实现

5,388

社区成员

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

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