鱼C论坛

 找回密码
 立即注册
查看: 7941|回复: 5

怎样通过鼠标抓窗口标题名,WIN32 API函数 C语言现实?

[复制链接]
发表于 2013-10-18 23:15:43 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 拈花小仙 于 2013-10-19 12:56 编辑

想抓窗口标题名,做个小挂,怎么用API函数来实现用鼠标一点,就得到任意窗口标题名?

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-19 21:40:56 | 显示全部楼层
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  5. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  6.                     PSTR szCmdLine, int iCmdShow)
  7. {
  8.         static TCHAR szAppName[] = TEXT ("HelloWin") ;
  9.         HWND         hwnd ;
  10.         MSG          msg ;
  11.         WNDCLASS     wndclass ;
  12.        
  13.         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  14.         wndclass.lpfnWndProc   = WndProc ;
  15.         wndclass.cbClsExtra    = 0 ;
  16.         wndclass.cbWndExtra    = 0 ;
  17.         wndclass.hInstance     = hInstance ;
  18.         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  19.         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  20.         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  21.         wndclass.lpszMenuName  = NULL ;
  22.         wndclass.lpszClassName = szAppName ;
  23.        
  24.         if (!RegisterClass (&wndclass))
  25.         {
  26.                 MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  27.                         szAppName, MB_ICONERROR) ;
  28.                 return 0 ;
  29.         }
  30.        
  31.         hwnd = CreateWindow (szAppName,                  // window class name
  32.                 TEXT ("The Hello Program"), // window caption
  33.                 WS_OVERLAPPEDWINDOW,        // window style
  34.                 CW_USEDEFAULT,              // initial x position
  35.                 CW_USEDEFAULT,              // initial y position
  36.                 CW_USEDEFAULT,              // initial x size
  37.                 CW_USEDEFAULT,              // initial y size
  38.                 NULL,                       // parent window handle
  39.                 NULL,                       // window menu handle
  40.                 hInstance,                  // program instance handle
  41.                 NULL) ;                     // creation parameters
  42.        
  43.         ShowWindow (hwnd, iCmdShow) ;
  44.         UpdateWindow (hwnd) ;

  45.         while (GetMessage (&msg, NULL, 0, 0))
  46.         {
  47.                 TranslateMessage (&msg) ;
  48.                 DispatchMessage (&msg) ;
  49.         }
  50.         return msg.wParam ;
  51. }

  52. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  53. {
  54.         HDC         hdc ;
  55.         static char msg[200];
  56.        
  57.         switch (message)
  58.         {               
  59.         case WM_CREATE:
  60.                 SetWindowPos(hwnd, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
  61.                 SetTimer(hwnd, 1, 100, NULL);
  62.                 return 0;
  63.         case WM_TIMER:
  64.                 {
  65.                         POINT point;
  66.                         HWND spy_wnd;
  67.                         GetCursorPos(&point);
  68.                         spy_wnd = WindowFromPoint(point);

  69.                         if( spy_wnd == NULL ) {
  70.                                 strcpy(msg, "No Window");
  71.                         }else {
  72.                                 ::GetWindowText(spy_wnd,msg,200);
  73.                         }
  74.                         ::InvalidateRect(hwnd,NULL,TRUE);
  75.                         ::UpdateWindow(hwnd);
  76.                         hdc = ::GetDC(hwnd);
  77.                         ::TextOut(hdc,0,0,msg, strlen(msg));
  78.                         ::ReleaseDC(hwnd,hdc);
  79.                         return 0;
  80.                 }
  81.                
  82.         case WM_DESTROY:
  83.                 KillTimer(hwnd, 1);
  84.                 PostQuitMessage (0) ;
  85.                 return 0 ;
  86.         }
  87.         return DefWindowProc (hwnd, message, wParam, lParam) ;
  88. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-18 23:15:44 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <windows.h>

  3. /*********************************************************
  4. 函数功能:该函数获得包含指定点的窗口的句柄。

  5. 函数原型:HWND WindowFromPoint(POINT Point);

  6. 参数:
  7. Point:指定一个被检测的点的POINT结构。

  8. 返回值S:返回值为包含该点的窗口的句柄。
  9.              如果包含指定点的窗口不存在,返回值为NULL。
  10.                     如果该点在静态文本控制之上,返回值是在该静态文本控制的下面的窗口。

  11. 备注:WindowFromPoint函数不获取隐藏或禁止的窗口句柄,即使点在该窗口内。
  12.       应用程序应该使用ChildWindowFromPoint函数进行无限制查询。

  13. //**********************************************************


  14.   函数功能:该函数检取光标的位置,以屏幕坐标表示。
  15.   
  16.   函数原型:BOOL GetCursorPos(LPPOlNT IpPoint);       

  17.   参数:          
  18.   IpPint:POINT结构指针,该结构接收光标的屏幕坐标。

  19.   返回值:如果成功,返回值非零;如果失败,返回值为零。

  20.   备注:光标的位置通常以屏幕坐标的形式给出,
  21.                 它并不受包含该光标的窗口的映射模式的影响。
  22.                 该调用过程必须具有对窗口站的WINSTA_READATTRIBUTES访问权限。
  23.                
  24. *********************************************************/
  25. int main()
  26. {
  27.         POINT pt;
  28.         HWND hWnd= 0;
  29.        
  30.         while (1){
  31.                 system("cls");  //清屏
  32.                 GetCursorPos( &pt );  //获取鼠标当前位置
  33.                 hWnd= WindowFromPoint( pt );//获取指定点的窗口的句柄(这里填的是鼠标的位置哦)
  34.                
  35.                 printf( "X:%d\n", pt.x );
  36.                 printf( "Y:%d\n", pt.x );
  37.                 printf( "hWnd:%d\n", hWnd );
  38.                
  39.                 system("pause");//按任意键继续
  40.                 Sleep(100);     //延时 0.1 秒
  41.         }
  42.         return 0;
  43. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5 谢谢您

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-19 15:35:14 | 显示全部楼层

您好,我想要的是程序启动后,鼠标点任意一个窗口,包括不是本程序的窗口。也能记录下标题名。比如我打开这个程序后,在打开个记事本,点一下记本事窗口,系统就输入记事本窗口的标题名了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-19 15:55:36 | 显示全部楼层
拈花小仙 发表于 2013-10-19 15:35
您好,我想要的是程序启动后,鼠标点任意一个窗口,包括不是本程序的窗口。也能记录下标题名。比如我打开 ...

类似Spy++  一样的吗?
这个我没具体实现过。
这个小Demo  实现的功能是  
      获取鼠标下的窗口的句柄(不必激活窗口)
当然了,如果获取到了句柄,剩下的就不算太难了  比如 用 GetWindowText  获取窗口标题。
类名的什么的,我不会了。
嘿嘿,帮不了你啦

//函数原型:Int GetWindowText(HWND hWnd, LPTSTR lpString, Int nMaxCount);

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-19 19:23:14 | 显示全部楼层
浮砂 发表于 2013-10-19 18:11
这样啊。 可以通过进程名 然后获取句柄~~
或者,游戏的文件夹里面应该有一个文件保存着每次更新的版本吧 ...

那能像SPY++那样方便的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表