【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

窗口句柄的获得

转载 2006年06月25日 10:45:00
这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。

首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了!

可用的win32 api函数:

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName) 

   HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 

2.HWND WindowFromPoint(POINT& Point)

3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

   BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

   BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

   BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

一般用途:

       对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返 回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!棗可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于 窗口标题,有可能会出现相同的标题,有两个窗口棗指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。

       第二组,通过win32定义的POINT结构(typedef struct tagPOINT {   LONG x;

  LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT (BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的 HWND了!然后通过获取类名的win32 api函数(int GetClassName(  HWND hWnd,    LPTSTR lpClassName,   int nMaxCount ))得到类名棗这里的lpClassName最好用字符数组地址, nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!棗我可以把鼠标放在任何地方!*^_^*

       第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!

我的理解:(这部分用任务驱动式教学方法棗谁让小弟是老师呢!xi xi)

任务:得到所有的窗口的类名。

解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)

在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast YouEnumProc,NULL);

在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!

然后,把类名数组准备好,得到类名,存之。

返回真值,继续下一次扫描。

看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p

第二种解决方法:简单、直观棗自己想出来的,颇得意

首先准备一个时钟,一种存类名方法(我用TMemo)

在定时器处理函数中:

1、得到当前cursor的点位置

2、再用WindowFromPoint,

3、然后得到类名,放到TMemo里

这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈

第三种方法:其实利用FindWindow和循环结构也应该可以

总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?

欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!

不清楚地方,大家要参照MSDN啊!(好东西呀!)
  下面是来自微软的例子,这个枚举所有的窗口,然后向窗口发送关闭的消息。 

     #include  
     
     BOOL CALLBACK EnumWindowsProc( 
     HWND hwnd, 
     DWORD lParam 
     ); 
     
     // 
     // EnumWindowsProc must be called from a Windows 

     // application on Windows 95. 
     // 
     int WINAPI WinMain( 
     HINSTANCE hInstance, 
     HINSTANCE hPrevInstance, 
     LPSTR lpCmdLine, 
     int nCmdShow 
     ) 
     { 
     // 
     // Close all open applications. 
     // 
     EnumWindows(EnumWindowsProc, 0); 
     
     // Now do a regular logoff. 
     ExitWindowsEx(EWX_LOGOFF , 0); 
     
     } 
     
     BOOL CALLBACK EnumWindowsProc( 
     HWND hwnd, 
     DWORD lParam 
     ) 

     { 
     DWORD pid = 0; 
     LRESULT lResult; 
     HANDLE hProcess; 
     DWORD dwResult; 
     
     lResult = SendMessageTimeout( 
     hwnd, 
     WM_QUERYENDSESSION, 
     0, 
     ENDSESSION_LOGOFF, 
     SMTO_ABORTIFHUNG, 
     2000, 
     &dwResult); 
     
     if( lResult ) 
     { 
     // 
     // Application will terminate nicely, so let it. 
     // 
     lResult = SendMessageTimeout( 
     hwnd, 
     WM_ENDSESSION, 
     TRUE, 

     ENDSESSION_LOGOFF, 
     SMTO_ABORTIFHUNG, 
     2000, 
     &dwResult); 
     
     } 
     else // You have to take more forceful measures. 
     { 
     // 
     // Get the ProcessId for this window. 
     // 
     GetWindowThreadProcessId( hwnd, &pid ); 
     // 
     // Open the process with all access. 
     // 
     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 
     // 
     // Terminate the process. 
     // 
     TerminateProcess(hProcess, 0); 

     
     } 
     // 
     // Continue the enumeration. 
     // 
     return TRUE; 
     }
举报

相关文章推荐

通过进程ID获得主窗口句柄

通过进程ID获得该进程主窗口的句柄     一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口...

vc获得窗口句柄

1.HWND FindWindow (LPCTSTR lpClassName, LPCTSTR lpWindowName) HWND FindWindowEx (HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2.HWND WindowFromPo

C# Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法

Windows APIWindows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程...

通过枚举窗口获得窗口句柄名字并重命名窗口

创建一个对话框工程,调用回调函数EnumWindowsProc枚举所有窗口存入数组m_hwndFind中,修改ONOK函数,获得窗口名字并改名 // RenWinDlg.cpp : implementation file// #include "stdafx.h"#include "RenWin.h"#include "RenWinDlg.h" #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] =

通过指点操作获得窗口句柄

问:     我用VB的sendkeys编写了一个向其他程序模拟键盘发送字符的工具,因VB编的程序体积太大,我想用Delphi重写,使用SendMessage等API函数,但我想找到一个用鼠标点一下其...
  • ati82
  • ati82
  • 2008-05-20 09:11
  • 741

vc获得窗口句柄

1.HWND FindWindow (LPCTSTR lpClassName, LPCTSTR lpWindowName) HWND FindWindowEx (HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2.HWND WindowFromPo

通过指点操作获得窗口句柄

通过指点操作获得窗口句柄赵砥:     我用VB的sendkeys编写了一个向其他程序模拟键盘发送字符的工具,因VB编的程序体积太大,    我想用Delphi重写,使用SendMessage等API...

MFC中获取其他类、窗口句柄等相关函数

转载自http://blog.csdn.net/xiaoyun8822/article/details/7939605 一般我们使用的框架是VC提供的Wizard生成的MFC App Wiza...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)