MFC编程小经验点积累(以后待补充)

MFC编程小经验点积累

1.  MFC里面调用API的时候,有时候需要加双冒号

::变量作用域标识符 当局部变量跟全局变量名字一致时 局部变量前面加双冒号表示用的时全局变量的值。

 

有::的是因为程序内部有和API函数同名的函数

::GetWindowRect(gameh,&r1)

这样写上::就会明确调用外部API中GetWindowRect函数

::在这里表是全局函数,是API里的函数,但是MFC用类封装了这些API,而且函数名和API函数一样。在类里面使用时如果不加::就会被认为是该类里面的相应函数,如果加上::则表示系统的API函数,一般说来系统API函数都要多一个参数。

再做个解释,举个例子:系统的API MessageBox(句柄, 内容, 标题, 样式);是这样的

在CWnd 类中重载了MessageBox为MessageBox(内容, 标题, 样式);

假如在CWnd你仍然想使用系统的api而不是这个重载的,那么你应该这样调用::MessageBox(句柄, 内容, 标题, 样式);

2.  获取其他程序某一窗口并打开其进程

HWND hWnd; // hWnd: 该视窗的 handle

DWORD dwx; // dwx :为存放内 ProcessID 的变数位址

HANDLE hProc;//Process handle

  

hWnd =::FindWindow("窗口类名,可以用VC工具中的WINSPY查看",NULL);

//lpszClassName:窗口类名,lpszWindowName:窗口标题。两个要一个就可以了,当然两个更准确

if (hWnd==false)return false;

 

::GetWindowThreadProcessId(hWnd,&dwx);

// 呼叫 GetWindowThreadProcessID 这个 Win32 API 来取得ProcessID

// 正常执行无误後,会将 Process ID 存入 dwx 这个位址中

hProc =OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwx);

if (hProc==false)return false;

// 呼叫 OpenProcess 这个 Win32 API来取得 Process handle

// 正常执行无误後,会将 Process handle 存入 hProc

注意:在使用完所获得的进程句柄后一定要调用CloseHandle(handle)来关闭进程的句柄。在使用此函数时会发现不能成功获得有些系统进程的句柄,原因是没有权限。解决办法是在调用此函数前让我们的进程得到SeDebugPrivilege权限。关于如何获取可查阅百科:http://baike.baidu.com/link?url=pG_npEog3lNAsQ8c6p4tXEhfL9uZzilTcpZHcUXfVEV5EKmGS7bW1hI_ud_3fYmVxVHIMkVPS5RJlN_CbFHUIq

 

 

窗口置顶的几个关键函数

 

SetForegroundWindow()

SetActiveWindow()

SetFocus()

 

自己的理解:每个gui线程都有自己的活动窗口,而目前被用户点中那个线程活动窗口叫前台窗口(或叫前景窗口)。而创建前台窗口的线程叫做前台线程(或叫前景线程),前台线程拥有比其它非前景线程更高的优先级,会被windows操作系统优先处理。而所谓的焦点窗口,可以是前台窗口或者是前台窗口的子窗口(控件),如果用户按下键盘按键,windows操作系统会将键盘按键消息发送到当前的焦点窗口。

 

-------------------------------------

如何将一个某个窗口提到最顶层?网上搜索了一些文章大致有以下几种方法,做个备忘.

 

问题:有个界面,想定期让其提前(**并显示在用户面前),但又不想用TOPMOST那种置顶方法.我用了SetForegroundWindow,SetActiveWindow,SHOW_WINDOW都不行:程序运行后再打开记事本,时间到我的程序只会在任务栏上闪几下,界面根本出不来怎么办!!(不用顶极窗口,不用鼠标模拟点击)

 

方法一:

使用定时器,然后在定时器响应函数中定时调用,SetWindowPos()函数,第一个参数写HWND_TOPMOST

 

方法二:

因为2000/XP改变了SetForegroundWindow的执行方式,不允许随便把窗口提前,打扰用户的工作。可以用附加本线程到最前面窗口的线程,从而欺骗windows。

 

AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL),GetCurrentThreadId(),TRUE);

SetForegroundWindow();

SetFocus();

AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL),GetCurrentThreadId(),FALSE);

 

 

方法三:如何激活指定的窗口事件

    我们知道,Windows    9x/2000中SetForegroundWindow函数当用户正在操作其他窗口时是不能强制某个窗口为前景窗口的,而是激活窗口并调用FlashWindowEx函数来通知用户。但是很多实际情况要求将激活窗口的同时将创建这个窗口的线程置为前景状态。碰到这种情况我们可以使用USER32.DLL中的几个未公开API函数。   

 void    SwitchToThisWindow    (   

 HWND    hWnd,        //   被激活的窗口句柄   

 BOOL    bRestore    //   如果被极小化,则恢复窗口   

 );   

  必须动态加载这个函数。   

 typedef    void    (WINAPI   *PROCSWITCHTOTHISWINDOW)    (HWND,    BOOL);   

 PROCSWITCHTOTHISWINDOW   SwitchToThisWindow;    

 HMODULE    hUser32    =   GetModuleHandle("user32");   

 SwitchToThisWindow    =    (   PROCSWITCHTOTHISWINDOW)   

 GetProcAddress(hUser32,   "SwitchToThisWindow");       

  接下来只要用任何现存窗口的句柄调用这个函数即可,第二个参数指定如果窗口极小化,是否恢复其原状态。   

 SwitchToThisWindow(hWnd,   TRUE);   




你可能感兴趣的:(MFC编程小经验点积累(以后待补充))