一日浏览Visual Studio6 的Tools,发现其中有一个很好玩的工具:SPY++;使用了一下,原来可以探测应用程序中的各种资源,包括对话框、菜单等等。于是写了一个计算器的马甲,测试了一番。
首先打开计算器,然后打开SPY++,便可以在SPY++中看到当前Windows运行的所有程序的进程,可以找到一个含有“计算器SciCalc”的进程项,这一项即是计算器的资源,展开可以看到所有计算器的按钮资源,包括:1、2、3、4、5、6、7、8、9、+、-、×、÷等等这些按钮,还有十进制、十六进制、角度、弧度等单选按钮,以及Inv和Hyp这样的复选按钮。除了按钮资源,还有一个文本框资源,即我们平常计算结果的显示区域,和几个静态文本框资源。例如,双击3按钮,显示了一些信息,其中,Control ID即是我们需要的,这个代码就是我们要操作的代码。
我在vc6中仿计算器做了一个工程,关键代码如下:
1 ShellExecute( NULL, "open", "calc.exe", NULL, NULL, SW_SHOW); // 打开计算器 ...... 2 HWND hWnd = ::FindWindow("SciCalc", NULL); // 获取计算器句柄 ...... 3 HWND hButton = ::GetDlgItem( hWnd, 0x7f); // 获取计算器中按钮“3”的句柄,其中0x7f是按钮“3”的Control ID 4 ::SendMessage( hButton, WM_LBUTTONDOWN, MK_LBUTTON, NULL); // 按下按钮“3” 5 ::SendMessage( hButton, WM_LBUTTONUP, MK_LBUTTON, NULL); // 松开按钮“3”,和上一步一起完成了一次点击 6 hButton = ::GetDlgItem( hWnd, 0x193); // 获取计算器中文本显示框句柄 7 ::SendMessage( hButton, WM_GETTEXT,255, (LPARAM)(LPCTSTR)str); // 获取计算器中文本框显示的内容 8 m_Edit.SetWindowText(str); // 在我的工程中显示计算器的文本框内容
|
运行效果如下图所示。
虽然实现了功能,但是还有一些问题:
1、我想把第1句和第2句放在一起,都搁在OnInitDialog中,计算器是打开了,但是并没有获取计算机句柄,跟踪了一下,发现执行获取句柄这句时,tst这个对话框还没有出现,猜想是否tst还不能执行获取句柄这句?
2、我将第1句的最后一个参数换成SW_HIDE,但是运行后还是会出现计算器这个对话框,不知道为何?
这些问题还要探索一下!