窗口激活工具(VC++ MFC版) By Jacky Chou
记得以前 非安全 老师 用ASM也写过这样的工具,他的好像还带*号密码查看功能的。没有什么很大的利用价值,写出来只是为了像我这样
的菜鸟提高对编程的兴趣,同时也希望VC初学者能够理解激活功能在VC中是如何实现的。
思路:1,获取鼠标坐标,根据鼠标位置获取当前窗口句柄。
2,枚举该窗口中的子窗口,若有非激活的,则将其激活。
查看MSDN
我们查找EnumChildWindows函数
The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the
handle to each child window, in turn, to an application-defined callback function. EnumChildWindows continues until the last
child window is enumerated or the callback function returns FALSE.
从上面可以看到,EnumChildWindows使用了回调函数。
Syntax
BOOL EnumChildWindows(HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
我们再查看一下其回调函数的使用。
The EnumChildProc function is an application-defined callback function used with the EnumChildWindows function. It receives
the child window handles. The WNDENUMPROC type defines a pointer to this callback function. EnumChildProc is a placeholder
for the application-defined function name.
Syntax
BOOL CALLBACK EnumChildProc(HWND hwnd,
LPARAM lParam
);
Parameters
hwnd
[in] Handle to a child window of the parent window specified in EnumChildWindows. //回调函数的句柄指向了子窗口中的句柄。
lParam
[in] Specifies the application-defined value given in EnumChildWindows.
Return Value
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
所以我们只要在回调函数中,将所以没有激活的窗口,全部将其激活即可。
另外一个需要注意的地方,那就是 我们定义的窗口句柄问题,我们需要将其定义为全局的变量,否则我们只能激活我们自己窗口的非激活的
控件了,不能激活其他窗口的控件了。
/*程序关键代码*/
//定义全局变量
POINT curpoint;
HWND curhwnd;
CWnd *curwnd;
//OnInitDialog()函数下设置一个时钟
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|WS_EX_TOPMOST); //设置为顶层窗口
SetTimer(1,100,NULL); //时钟100 MS
BOOL CALLBACK EnumChildProc(HWND hwnd, //回调函数的定义
LPARAM lParam)
{
if (!IsWindowEnabled(hwnd)) //若为非激活状态,则将其激活
{
EnableWindow(hwnd,TRUE);
}
return TRUE;
}
void CEnableWindowDlg::OnTimer(UINT nIDEvent) //时钟函数
{
// TODO: Add your message handler code here and/or call default
if (1 == nIDEvent)
{
GetCursorPos(&curpoint); //获取鼠标坐标
curwnd = WindowFromPoint(curpoint); //转成窗口指针
curhwnd = curwnd->m_hWnd; //获取窗口句柄
SetDlgItemInt(IDC_HANDLE,(int)curhwnd); //输出窗口句柄
SetDlgItemInt(IDC_X,curpoint.x); //鼠标鼠标坐标X
SetDlgItemInt(IDC_Y,curpoint.y); //鼠标鼠标坐标Y
EnumChildWindows(curhwnd,&EnumChildProc,NULL); //枚举子窗口
CDialog::OnTimer(nIDEvent);
}
}
以上代码比较简单,也比较清晰(个人想法),程序在WinXP Sp2 VC++ 6.0 EnterPrise English Version 下编译通过,测试成功!
Next 写 VC中如何以消息的形式获取其他exe程序窗口中的*号密码。
Download-Link:
http://www.live-share.com/files/149822/EnableWindow.rar.html
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)