按键精灵8,获取句柄有些只有窗口类名,没有窗口标题,该怎么办?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按键精灵8,获取句柄有些只有窗口类名,没有窗口标题,该怎么办?相关的知识,希望对你有一定的参考价值。
这是我用抓抓获取的一张图,没有窗口标题,那么如果要得到后台句柄,使得每次不需要换句柄而使用一样的,我应该要怎么做啊?
高手快快出现,我刚学这个,已经琢磨一个通宵了,这已经是我能拿出最多的财富悬赏了,别嫌少了。。。。。。。
上面那个问题 我已经自己找到解决办法 现在问别的 谁能搞定 我分数给谁
第一个:我进入某个游戏,用CE查到内存地址后,退出游戏,再查内存地址,两个内存地址是不一样的,有什么办法可以让每次的内存地址都一样?或者说下别的解决方法?
第二个:我想让鼠标在内存数值到某一个数值时,鼠标移动到某点进行鼠标操作,该怎么写源代码?
首先要获得窗口的句柄 用下面的函数应该能找到:
FindWindow根据类名\窗口标题寻找窗口
遍历顶层窗口EnumWindows
遍历窗口回调函数EnumWindowProc
遍历父窗口的所有子窗口EnumChildWindows
返回父窗口Point处的子窗口ChildWindowFromPoint
ChildWindowFromPointEx多一个参数UINT来忽略不可见无效透明的子窗口
获取与指定窗口具有莫种关系的窗口GetWindow
获取父窗口的子窗口中Z序最大的子窗口GetTopWindow
获取指定窗口相同层次Z序差1的窗口GetNextWindow
获取桌面窗口句柄GetDesktopWindow
用SendMessage函数不需要窗口标题的,只要句柄
LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
或者用keybd_event函数,要先用SetForegroundWindow函数把目标窗口设置成前台窗口
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
补充:
第一个:我进入某个游戏,用CE查到内存地址后,退出游戏,再查内存地址,两个内存地址是不一样的,有什么办法可以让每次的内存地址都一样?或者说下别的解决方法?
不让每次的内存地址都一样应该是做不到的,游戏每次运行由系统分配内存,哪能让你控制啊。
第二个:我想让鼠标在内存数值到某一个数值时,鼠标移动到某点进行鼠标操作,该怎么写源代码?
定义一个指针变量p,类型根据你需要的数值而定
p=该内存地址
if(*p==该数值)
//mousemove
参考技术A 首先你的主窗口名称不变.2级子窗口类名变化,但是3级不变.那就找出主窗口下的所有子窗口句柄,然后再挨个的找符合3级窗口类名的句柄 参考技术B 用EnumWindow枚举窗口,枚举回调函数中调用
DWORD GetWindowThreadProcessId( HWND hWnd,
LPDWORD lpdwProcessId
);获取到进程ID,然后获取进程名,看是不是需要的进程。 参考技术C 不能发送有几点原因:
1.游戏屏蔽按键
2.你用的是按键自带的插件
解决方法:
换361插件或其他插件试试
如果无效 说明游戏不支持后台或屏蔽按键
查找标题已知的窗口句柄,遍历窗口控件句柄
有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.
其函数原形是:
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;
lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以用很多工具获得.如winsignt32. lpWindowName:窗口标题.
调用方式举例:
var wndhwnd:HWND; wndhwnd:=FindWindow(nil,‘某窗口标题‘); if wndhwnd<>0 then file://找到此窗口句柄. begin xxxxx end else begin MessageBox(self.handle,‘没找到该窗口句柄‘,‘提示‘,0); end;
有了这个窗口句柄,就离我们的初始目的不远了:控制其他窗体上的窗口控件.
同样,首先要得到其他窗体上窗口控件的句柄.我们用这个API函数:EnumChildWindows.
其函数原形是: function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall;
这个函数和EnumWindow函数很有些想象.其作用也很相似.它的功能就是列举窗口句柄为hWndParent的窗体上所有的窗口控件的句柄.同样也是以回调函数参数的形式给出的.
我们再举一个实际的例子,来说明这个函数的用法.程序的功能是让用户输入一个窗口标题,然后调用FindWindow函数找到此窗口句柄.通过这个句柄,我们在一个Memo里显示该窗口上所有的窗口控件.
同样先编写回调函数. function EnumChildWndProc(AhWnd:LongInt; AlParam:lParam):boolean;stdcall; var WndClassName: array[0..254] of Char; WndCaption: array[0..254] of Char; begin GetClassName(AhWnd,wndClassName,254); GetWindowText(aHwnd,WndCaption,254); with form1.memo1 do begin lines.add( string(wndClassName)); lines.add( string(wndCaption)); lines.add(‘-------‘); end; result:=true; end;
然后在一事件里调用EnumChildWindows函数. procedure TForm1.Button1Click(Sender: TObject); var hWnd:LongInt; begin memo1.Lines.Clear; Memo1.Lines.Add(Edit1.Text+‘ 有如下控件类名称‘); hWnd:=FindWindow(nil,pchar(Edit1.Text)); if hWnd<>0 then begin EnumChildWindows(hWnd,@EnumChildWndProc,0); end else MessageBox(self.handle,‘没找到该窗口句柄‘,‘提示‘,0); end;
程序清单如下: unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; file://用来显示找到的控件 Label1: TLabel; Edit1: TEdit; file://输入标题. Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
function EnumChildWndProc(AhWnd:LongInt; AlParam:lParam):boolean;stdcall;
implementation
{$R *.dfm} function EnumChildWndProc(AhWnd:LongInt; AlParam:lParam):boolean;stdcall; var WndClassName: array[0..254] of Char; WndCaption: array[0..254] of Char; begin GetClassName(AhWnd,wndClassName,254); GetWindowText(aHwnd,WndCaption,254); with form1.memo1 do begin lines.add( string(wndClassName)); lines.add( string(wndCaption)); lines.add(‘-------‘); end; result:=true; end;
procedure TForm1.Button1Click(Sender: TObject); var hWnd:LongInt; begin memo1.Lines.Clear; Memo1.Lines.Add(Edit1.Text+‘ 有如下控件类名称‘); hWnd:=FindWindow(nil,pchar(Edit1.Text)); if hWnd<>0 then begin EnumChildWindows(hWnd,@EnumChildWndProc,0); end else MessageBox(self.handle,‘没找到该窗口句柄‘,‘提示‘,0); end;
end.
有了控件句柄,我们当然就可以随心所欲了.比如:
SendMessage(hWnd,WM_SETTEXT,0,LongInt(Pchar(‘sdafdsf‘)));就可以给控件发送文本.其他还可以发送不同的消息可以做很多事情.
以上是关于按键精灵8,获取句柄有些只有窗口类名,没有窗口标题,该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章