使用microsoft spy++工具可以檢查系統(tǒng)中所有窗口的層次關(guān)系,查看其屬性遍歷窗口,捕捉并查看特定窗口的消息。查看任意windows界面的handle,caption,class信息.另外DELPHI和BCB里有一個(gè)WINSIGHT好像和SPY++差不多。
打開microsoft spy++,在工具欄選擇Find工具,在彈出的window search窗口中拖動(dòng)Finder tool的圖標(biāo)至目標(biāo)窗口即可.
Spy++使用方法
Windows程序都是基于消息機(jī)制的,每個(gè)程序中都會(huì)有各種各樣的消息,
如果想通過消息來(lái)控制程序的運(yùn)行,我們只用關(guān)心程序中的命令消息
(WM_COMMAND)就行了,其他關(guān)于程序界面等等的消息,可以不管。要查看程
序運(yùn)行的消息,使用Visual Studio中自帶的工具spy++。
打開spy++,選擇 spy|Windows,然后就會(huì)顯示出當(dāng)前的所有窗口,一
些主窗口中的字窗口也會(huì)顯示出來(lái),比如說工具欄窗口,編輯窗口等等。在
其中找到目標(biāo)窗口。
以下是我運(yùn)行spy++時(shí)顯示的部分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識(shí)別的結(jié)果)
選擇FineReader窗口,點(diǎn)擊右鍵,彈出菜單中選擇“Messages”,即可開始
監(jiān)聽該窗口的消息。你要是實(shí)際操作一下就會(huì)發(fā)現(xiàn),消息非常多,根本無(wú)法從中
找到自己想看的消息。為了選出我們想看的消息,我們需要對(duì)消息進(jìn)行過濾。選擇
Messages|Options,彈出菜單中選擇Messages Tab頁(yè),可以看見很多消息過濾選項(xiàng)。
我想監(jiān)聽WM_COMMAND消息,所以我Clear All之后,只選擇General消息。
以上設(shè)置好之后,開始監(jiān)聽消息,然后到FineReader窗口中點(diǎn)擊Read快捷按鈕
(安該按鈕之后,F(xiàn)ineReader開始識(shí)別當(dāng)前選擇的圖片),然后回到spy++,監(jiān)聽到
的消息仍然不少,但是可以找到我們要查看的消息。如果你只按了一個(gè)按鈕或者一個(gè)
菜單,在監(jiān)聽到的消息中間,你應(yīng)該可以找到兩個(gè)WM_COMMAND消息,一個(gè)發(fā)送出去的
消息,一個(gè)返回的消息,相信信息見下文。
以下是我在spy++中監(jiān)聽到的消息,其中有一個(gè)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識(shí)別的結(jié)果)
雙擊這個(gè)WM_COMMAND消息,可以看見關(guān)于這個(gè)消息的詳細(xì)信息,如下
Window Handle 001F00AA //FineReader窗口句柄
Nesting Level 2
Message 0111 (Sent) //WM_COMMAND消息ID,這個(gè)消息是發(fā)送出的消息
WM_COMMAND
wParam 00009D0B //WM_COMMAND消息的兩個(gè)參數(shù)
lParam 00000000
在spy++中監(jiān)聽到的另外一個(gè)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識(shí)別的結(jié)果)
雙擊這個(gè)WM_COMMAND消息,可以看見關(guān)于這個(gè)消息的詳細(xì)信息,如下
Window Handle 001F00AA //FineReader窗口句柄
Nesting Level 2
Message 0111 (Return) //WM_COMMAND消息ID,這個(gè)消息是的消息
WM_COMMAND
wParam 00009D0B //WM_COMMAND消息的兩個(gè)參數(shù)
lParam 00000000
既然可以查看到程序中消息的ID及消息的參數(shù),那么我們可以自己編寫
程序,向被控制的程序發(fā)送對(duì)應(yīng)的消息,從而控制程序的運(yùn)行。
第一步,在自己的程序中打開目標(biāo)程序,使用一下API,具體請(qǐng)查看MSDN。
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
在我的程序中,目標(biāo)程序?yàn)镕ineReader,打開程序的代碼如下:
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失!");
}
第二步,找到目標(biāo)窗口,獲得目標(biāo)窗口的句柄
CWnd* pWnd = NULL;
//可能程序啟動(dòng)較慢,需要嘗試多次才能找到目標(biāo)窗口
while(pWnd == NULL)
{
Sleep(1000);
pWnd = FindWindow(NULL, "Batch - ABBYY FineReader 7.0 Professional
Edition");
}
第三步,向目標(biāo)窗口發(fā)送消息。
可以使FineReader開始運(yùn)行時(shí),自動(dòng)打開最后一次運(yùn)行的一個(gè)Batch,所以我們只用
發(fā)送消息,
讓FineReader開始識(shí)別就可以了。通過spy++可以查看到FineReader識(shí)別的WM_COMMAND
信息如下
Message 0111 (Sent)
WM_COMMAND
wParam 00009D0B
lParam 00000000
按以下方式向FineReader發(fā)送這個(gè)消息,使用SendMessage,等待消息返回后,再進(jìn)
行下一步操作
::SendMessage(pWnd->GetSafeHwnd(), 0x0111, 0x9D0B, 0 );
FineReader識(shí)別完成之后,可以選擇把結(jié)果保存為文件,或者發(fā)送到剪貼板,我選
擇的是讓其
把識(shí)別結(jié)果發(fā)送到剪貼板。同樣使用spy++監(jiān)聽消息及其參數(shù),然后發(fā)送對(duì)應(yīng)的消息,
如下:
Message 0111 (Sent)
WM_COMMAND
wParam 00009DA1
lParam 00000000
::SendMessage(pWnd->GetSafeHwnd(), 0x0111, 0x9DA1, 0 );
進(jìn)行這些操作之后,F(xiàn)ineReader識(shí)別之后,就可以直接從剪貼板得到識(shí)別結(jié)果了,
相關(guān)代碼如下
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, "識(shí)別結(jié)果");
GlobalUnlock(hglb);
}
}
EmptyClipboard();
CloseClipboard();
第四步,操作完畢之后,關(guān)閉目標(biāo)程序,同樣通過發(fā)送消息完成。
最先我以為直接發(fā)送WM_QUIT消息就可以了,后來(lái)發(fā)現(xiàn)不行,用spy++監(jiān)聽后發(fā)現(xiàn),
應(yīng)該發(fā)送WM_CLOSE消息。
::SendMessage(pWnd->GetSafeHwnd(), WM_CLOSE, 0, 0 );
至此,基本操作實(shí)現(xiàn)。其實(shí)我覺得,只要做的好,完全可以自己做一個(gè)界面來(lái),取
代它的界面。
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版















Apifox(Api調(diào)試管理工具)2.1.29.1 綠色版
小烏龜代碼管理工具(TortoiseGit)2.13.0.1 中文免費(fèi)版
SoapUI破解版5.7.0 最新版
小皮面板(phpstudy)8.1.1.3 官方最新版
Ruby3.0(ruby運(yùn)行環(huán)境)3.0.2 官方版
gcc編譯器( MinGW-w64 9.0.0綠色版)免費(fèi)下載
寶玉編輯助手0.0.05新版
火花編程軟件2.7.2 官方pc版
猿編程少兒班客戶端3.1.1 官方版
Restorator 2009中文版單文件漢化版
十六進(jìn)制閱讀小工具
IT碼農(nóng)工具軟件1.0 中文免費(fèi)版
Postman Canary(網(wǎng)頁(yè)調(diào)試軟件)官方版7.32.0綠色免費(fèi)版
大耳猴少兒編程客戶端1.1.2 官方免費(fèi)版
excel批量sql語(yǔ)句(通過excel構(gòu)建sql工具)1.0 免費(fèi)版
軟件添加彈窗和網(wǎng)址工具1.0 中文免費(fèi)版
天霸編程助手2.1 單文件中文版
ida pro 中文破解版(反編譯工具)7.0 永樂漢化版64位
VBA代碼助手3.3.3.1官方版
JDK 12 linux版for 64位
Samba(完全支持Python 3)4.10 官方最新版
猿編程電腦端3.9.1.347 官方PC版
蒲公英 Android SDKV4.1.11 官方最新版
蒲公英iOS SDK2.8.9.1 官方最新版
WxPython中文可視化編輯器1.2 簡(jiǎn)體中文免費(fèi)版
Python代碼生成器1.0 中文免費(fèi)版
C語(yǔ)言代碼實(shí)例助手1.0 免費(fèi)版
notepad++7.8.2 中文免費(fèi)版




系統(tǒng)自帶的命令行幫助文件(ntcmds.chm)chm格
Excel轉(zhuǎn)換XML工具1.0 免費(fèi)版
實(shí)體類SQL生成工具1.0 綠色免費(fèi)版
XML字符串解析工具2.0.3 免費(fèi)版
VC++Spelly(代碼拼寫檢查)3.0.1 官方最新版
易語(yǔ)言vc6迷你連接器【dos命令形式運(yùn)行】綠
Elastix 20163.0 免費(fèi)版
sql語(yǔ)法分析器(sql語(yǔ)法分析工具)3.1.0 綠色
dev c++下載(DEV-C++)5.9.2 多語(yǔ)安裝免費(fèi)版
vc字體設(shè)置工具(vc6字體設(shè)置工具)1.0 中文綠