您的位置:首页 > 编程语言

VC\MFC 编程经验总结—1(转)

2013-03-27 13:58 435 查看
Q  

  获取Windows外壳主窗口的句柄  

  A  

 在编程过程中,我们常常需要获取Windows外壳主窗口的句柄(HWND),微软在MSDN中提供了一个这样的函数: 

  HWND   hwndShell  =   FindWindow("Program",NULL); 

 用这个函数可以满足我们的要求,但本文再提供一个更好的方法,用User32.dll中的GetShellWindow,这个函数的原型很简单:HWND  GetShellWindow;  只是这个函数是个未公开的API函数,所以要使用它必须动态加载User32.dll。方法如下: 

  typedef   HWND  (WINAPI   *PROCGETSHELLWND)(); 

  PROCGETSHELLWND  GetShellWindow;  

  HMODULE   hUser32  =   GetModuleHandle("user32"); 

  GetShellWindow   =  (PROCGETSHELLWND)  

 GetProcAddress(hUser32,"GetShellWindow"); 

Q  

  如何向剪贴板发送字符串  

  A  

  假设你已有了名为My的对话框的工程.有了一个按钮并有了其响应的函数:OnButton1() 

  void   CMyDlg::OnButton1()   

  {  

                CString  str   =  "Some   text";  

   

               ::OpenClipboard(this->m_hWnd); 

               ::EmptyClipboard();  

   

                HGLOBAL  h   =  GlobalAlloc(GHND   |  GMEM_SHARE,   str.GetLength()   +  1);  

               strcpy((LPSTR)GlobalLock(h),   str); 

               GlobalUnlock(h);  

   

               ::SetClipboardData(CF_TEXT,   h); 

               ::CloseClipboard();  

  }    

   

  Q  

  任务管理器如何确定应用程序"没有响应"  

  A  

  最近参加的一个项目要求实现远程任务管理功能,也就是"Remote  Task  Manager"(RTM)。我把它与Windows  NT的任务管理器进行了比较,发现标准的任务管理器显示应用程序的状态(正在运行或者没有响应)。标准的任务管理器发送(通过SendMessageTimeout函数)一个消息到主应用窗口,如果函数调用失败或者超时--则应用程序的状态就是"没有响应",否则状态为"正在运行"。  

      但我发现还有一个更好的解决方法。本文将通过实例程序进行示范。这个方法的思路是通过调用User32.dll中一个未公开的函数来实现的。这个函数存在于Windows   9x和Windows  NT/2000系统中,但在两个系统中的名字是不同的。Windows  9x系统中的名字为:IsHungThread,在Windows  NT/2000系统中的名字为IsHungAppWindow。下面是它们的原型:  

  BOOL   IsHungAppWindow  (  

  HWND   hWnd,  //   主应用窗口句柄  

  );  

  和  

  BOOL   IsHungThread  (  

  DWORD   dwThreadId,  //   主应用窗口的线程ID 

  );  

      不幸的是,微软在User32.lib中没有提供这两个函数的输出。也就是说,这两个函数是未公开函数,如果要在程序中使用它们,则必须通过GetProcAddress和GetModuleHandle函数动态加载: 

   

  typedef   BOOL  (WINAPI   *PROCISHUNGAPPWINDOW)  (HWND);  

  typedef   BOOL  (WINAPI   *PROCISHUNGTHREAD)  (DWORD);  

   

  PROCISHUNGAPPWINDOW  IsHungAppWindow;  

  PROCISHUNGTHREAD  IsHungThread;  

   

  HMODULE   hUser32  =   GetModuleHandle("user32"); 

   

  IsHungAppWindow   =  (PROCISHUNGAPPWINDOW)  

  GetProcAddress(hUser32,"IsHungAppWindow"); 

   

  IsHungThread   =  (PROCISHUNGTHREAD)  

  GetProcAddress(hUser32,"IsHungThread"); 

   

  Q  

  Installshield快捷方式设置  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: