使用microsoft spy++工具可以检查系统中所有窗口的层次关系,查看其属性遍历窗口,捕捉并查看特定窗口的消息。查看任意windows界面的handle,caption,class信息.另外DELPHI和BCB里有一个WINSIGHT好像和SPY++差不多。
打开microsoft spy++,在工具栏选择Find工具,在弹出的window search窗口中拖动Finder tool的图标至目标窗口即可.
Spy++使用方法
Windows程序都是基于消息机制的,每个程序中都会有各种各样的消息,
如果想通过消息来控制程序的运行,我们只用关心程序中的命令消息
(WM_COMMAND)就行了,其他关于程序界面等等的消息,可以不管。要查看程
序运行的消息,使用Visual Studio中自带的工具spy++。
打开spy++,选择 spy|Windows,然后就会显示出当前的所有窗口,一
些主窗口中的字窗口也会显示出来,比如说工具栏窗口,编辑窗口等等。在
其中找到目标窗口。
以下是我运行spy++时显示的部分spy++窗口,其中有FineReader窗口
001702A6 - tooltips_class32
000C01FE - "M" MSCTFIME Ul
001C02A0 - "Default IME" IME
002401DO - tooltips_class32
003B009A - "Microsoft Spy++ - [Windows 2]" Afx:100000:0:10011:0:2600515
00300244 - "M" MSCTFIME Ul
002E032E - FineReaderTipWindowClass
004F02B4 - tooltips_class32
00410254 - "Untitled batch - ABBYY FineReader 7.0 Professional Edition"
FineReader7MainWindowClass
003E0370 - "DDE Server Window" OleDdeWndClass
005002DC - ComboLBox
000D02B6 - ComboLBox
00270320 - ComboLBox
00AB0366 - ComboLBox
00A000A4 - tooltips_class32
(注:以上是使用print screen抓图,然后使用FineReader识别的结果)
选择FineReader窗口,点击右键,弹出菜单中选择“Messages”,即可开始
监听该窗口的消息。你要是实际操作一下就会发现,消息非常多,根本无法从中
找到自己想看的消息。为了选出我们想看的消息,我们需要对消息进行过滤。选择
Messages|Options,弹出菜单中选择Messages Tab页,可以看见很多消息过滤选项。
我想监听WM_COMMAND消息,所以我Clear All之后,只选择General消息。
以上设置好之后,开始监听消息,然后到FineReader窗口中点击Read快捷按钮
(安该按钮之后,FineReader开始识别当前选择的图片),然后回到spy++,监听到
的消息仍然不少,但是可以找到我们要查看的消息。如果你只按了一个按钮或者一个
菜单,在监听到的消息中间,你应该可以找到两个WM_COMMAND消息,一个发送出去的
消息,一个返回的消息,相信信息见下文。
以下是我在spy++中监听到的消息,其中有一个WM_COMMAND消息
<00039> 00410254 R...................WM_NOTIFY
<00040> 00410254 S...................WM_COMMAND v/NotifyCode:0 (sent from a
menu] wlD:4O2O3
<00041> 00410254 S...................WM_GETTEXT cchTextMax:512
lpszText:0012E200
<00042> 00410254 R...................WM_GETTEXT cchCopied:72
lpszText:0012E200 f'U'l
(注:以上是使用print screen抓图,然后使用FineReader识别的结果)
双击这个WM_COMMAND消息,可以看见关于这个消息的详细信息,如下
Window Handle 001F00AA //FineReader窗口句柄
Nesting Level 2
Message 0111 (Sent) //WM_COMMAND消息ID,这个消息是发送出的消息
WM_COMMAND
wParam 00009D0B //WM_COMMAND消息的两个参数
lParam 00000000
在spy++中监听到的另外一个WM_COMMAND消息
<00089> 00410254 S...................WM_GETTEXT cchTextMax:512
lpszText:0012E1E0
<00090> 00410254 R...................WM_GETTEXT cchCopied:71
lpszText:0012E1E0 (V")
<00092> 00410254 S...................WM_NOTIFY idCtrl:177 pnmh:0012F988
(注:以上是使用print screen抓图,然后使用FineReader识别的结果)
双击这个WM_COMMAND消息,可以看见关于这个消息的详细信息,如下
Window Handle 001F00AA //FineReader窗口句柄
Nesting Level 2
Message 0111 (Return) //WM_COMMAND消息ID,这个消息是的消息
WM_COMMAND
wParam 00009D0B //WM_COMMAND消息的两个参数
lParam 00000000
既然可以查看到程序中消息的ID及消息的参数,那么我们可以自己编写
程序,向被控制的程序发送对应的消息,从而控制程序的运行。
第一步,在自己的程序中打开目标程序,使用一下API,具体请查看MSDN。
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
在我的程序中,目标程序为FineReader,打开程序的代码如下:
HINSTANCE hRet = 0;
hRet = ShellExecute(m_hWnd,
NULL,
"D:\\Program Files\\ABBYY FineReader 7.0 Professional
Edition\\FineReader.exe",
NULL,
NULL,
SW_HIDE);
if( (int)hRet <= 32 )
{
MessageBox("打开FineReader失败!");
}
第二步,找到目标窗口,获得目标窗口的句柄
CWnd* pWnd = NULL;
//可能程序启动较慢,需要尝试多次才能找到目标窗口
while(pWnd == NULL)
{
Sleep(1000);
pWnd = FindWindow(NULL, "Batch - ABBYY FineReader 7.0 Professional
Edition");
}
第三步,向目标窗口发送消息。
可以使FineReader开始运行时,自动打开最后一次运行的一个Batch,所以我们只用
发送消息,
让FineReader开始识别就可以了。通过spy++可以查看到FineReader识别的WM_COMMAND
信息如下
Message 0111 (Sent)
WM_COMMAND
wParam 00009D0B
lParam 00000000
按以下方式向FineReader发送这个消息,使用SendMessage,等待消息返回后,再进
行下一步操作
::SendMessage(pWnd->GetSafeHwnd(), 0x0111, 0x9D0B, 0 );
FineReader识别完成之后,可以选择把结果保存为文件,或者发送到剪贴板,我选
择的是让其
把识别结果发送到剪贴板。同样使用spy++监听消息及其参数,然后发送对应的消息,
如下:
Message 0111 (Sent)
WM_COMMAND
wParam 00009DA1
lParam 00000000
::SendMessage(pWnd->GetSafeHwnd(), 0x0111, 0x9DA1, 0 );
进行这些操作之后,FineReader识别之后,就可以直接从剪贴板得到识别结果了,
相关代码如下
if (!IsClipboardFormatAvailable(CF_TEXT))
return;
if (!OpenClipboard())
return;
HGLOBAL hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
LPTSTR lptstr = (char*)GlobalLock(hglb);
if (lptstr != NULL)
{
MessageBox(lptstr, "识别结果");
GlobalUnlock(hglb);
}
}
EmptyClipboard();
CloseClipboard();
第四步,操作完毕之后,关闭目标程序,同样通过发送消息完成。
最先我以为直接发送WM_QUIT消息就可以了,后来发现不行,用spy++监听后发现,
应该发送WM_CLOSE消息。
::SendMessage(pWnd->GetSafeHwnd(), WM_CLOSE, 0, 0 );
至此,基本操作实现。其实我觉得,只要做的好,完全可以自己做一个界面来,取
代它的界面。
- PC官方版
- 安卓官方手机版
- IOS官方手机版















Apifox(Api调试管理工具)2.1.29.1 绿色版
小乌龟代码管理工具(TortoiseGit)2.13.0.1 中文免费版
SoapUI破解版5.7.0 最新版
小皮面板(phpstudy)8.1.1.3 官方最新版
Ruby3.0(ruby运行环境)3.0.2 官方版
gcc编译器( MinGW-w64 9.0.0绿色版)免费下载
宝玉编辑助手0.0.05新版
火花编程软件2.7.2 官方pc版
猿编程少儿班客户端3.1.1 官方版
Restorator 2009中文版单文件汉化版
十六进制阅读小工具
IT码农工具软件1.0 中文免费版
python爬虫实战入门教程pdf免费版
Postman Canary(网页调试软件)官方版7.32.0绿色免费版
大耳猴少儿编程客户端1.1.2 官方免费版
excel批量sql语句(通过excel构建sql工具)1.0 免费版
软件添加弹窗和网址工具1.0 中文免费版
天霸编程助手2.1 单文件中文版
ida pro 中文破解版(反编译工具)7.0 永乐汉化版64位
VBA代码助手3.3.3.1官方版
Node.js开发实战教程百度云完整版【36课】
猿编程电脑端3.9.1.347 官方PC版
蒲公英 Android SDKV4.1.11 官方最新版
蒲公英iOS SDK2.8.9.1 官方最新版
WxPython中文可视化编辑器1.2 简体中文免费版
Python代码生成器1.0 中文免费版
C语言代码实例助手1.0 免费版
c primer plus第6版中文版高清版
C++ Primer Plus 2021电子版最新版
notepad++7.8.2 中文免费版




源代码保护工具(Dotfuscator Professional
MDB数据库管理软件1.0 中文免费版
源码安全监测工具(Fortify SCA 2016)【附cr
RTX ServerSDK 2015官方最新版
阿猫串口调试助手2.4.0.0绿色免费版
精易论坛SQL语句生成器2.1 绿色最新版 【
java开源报表系统(JasperReports Library)6
独立团游戏作坊窗口分析工具【VIP全套教程及