焦点问题
问:我有一个非模态属性表,其中的一页包含7个控件,我的问题是,如果现在焦
点在一个 编辑控件上,当我最小化窗口后又最大化,那么该控件就会失去焦点, 怎样才能恢复原状?
答:在消息WM_SHOW中这样做:
voidCPropPage::OnShowWindow(BOOL bShow, UINT nStatus) {
...
If(bShow ) {
// restore current focused control if(m_pCurFocusWnd != NULL ) { m_pCurFocusWnd->SetFocus(); } } else {
// save current focused wnd m_pCurFocusWnd = GetFocus(); }
YourBaseClass::OnShowWindow(bShow, nStatus); ... }
注意:pCurFocusWnd是一个CWnd指针,必须在构造函数中初始化为NULL;你也必须声明 对话框中的所有变量,否则调用OnShowWindow时,指针通过GetFocus()所返回的值将是 非法的。希望你能满意!
截获WIN95的函数调用
* 截获对某些系统API函数调用。
Win32程序调用外部API都是通过一个间接函数指针,修改该指针即可。
《Windows 95 System Programming Secrets》中有个APISPY32程序,有详细介绍,
象怎样访问参数,值得研究。这种方法适用于截获应用程序对系统API的调用,但
不能截获如USER32,COMCTL32等对系统函数的调用。
* 截获某一特定DLL的API。
用自己的DLL替换之,当然要知道函数的原形。MSJ Sep. 1997上有一WinInetSpy程
序截获对WININET.DLL的调用。这种方法适用于非系统DLL(也可以替换系统DLL,
但需重启动,调试较困难)。
* 非输出函数或16位函数。 找到函数地址,用JMP指令替换第一条指令。金山词霸、南极星都用这种方法。这种
方法只能截获已知函数,要保证指令替换不出错。
另外,有一个强大的软件Bounds Checker,NuMega公司出品,其一个功能就是截获API
调用。最新版本好象有用户编程接口,截获后让用户的程序接着处理。该软件已经把
所有关于API截获的事情都作了。