鱼C论坛

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

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

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

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

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-19 21:40:56 | 显示全部楼层
#include <windows.h>
#include <stdio.h>
#include <string.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT ("HelloWin") ;
        HWND         hwnd ;
        MSG          msg ;
        WNDCLASS     wndclass ;
        
        wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
        wndclass.lpfnWndProc   = WndProc ;
        wndclass.cbClsExtra    = 0 ;
        wndclass.cbWndExtra    = 0 ;
        wndclass.hInstance     = hInstance ;
        wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
        wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
        wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        wndclass.lpszMenuName  = NULL ;
        wndclass.lpszClassName = szAppName ;
        
        if (!RegisterClass (&wndclass))
        {
                MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                        szAppName, MB_ICONERROR) ;
                return 0 ;
        }
        
        hwnd = CreateWindow (szAppName,                  // window class name
                TEXT ("The Hello Program"), // window caption
                WS_OVERLAPPEDWINDOW,        // window style
                CW_USEDEFAULT,              // initial x position
                CW_USEDEFAULT,              // initial y position
                CW_USEDEFAULT,              // initial x size
                CW_USEDEFAULT,              // initial y size
                NULL,                       // parent window handle
                NULL,                       // window menu handle
                hInstance,                  // program instance handle
                NULL) ;                     // creation parameters
        
        ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;

        while (GetMessage (&msg, NULL, 0, 0))
        {
                TranslateMessage (&msg) ;
                DispatchMessage (&msg) ;
        }
        return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC         hdc ;
        static char msg[200];
        
        switch (message)
        {                
        case WM_CREATE:
                SetWindowPos(hwnd, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
                SetTimer(hwnd, 1, 100, NULL);
                return 0;
        case WM_TIMER: 
                {
                        POINT point;
                        HWND spy_wnd;
                        GetCursorPos(&point);
                        spy_wnd = WindowFromPoint(point);

                        if( spy_wnd == NULL ) {
                                strcpy(msg, "No Window");
                        }else {
                                ::GetWindowText(spy_wnd,msg,200);
                        }
                        ::InvalidateRect(hwnd,NULL,TRUE);
                        ::UpdateWindow(hwnd);
                        hdc = ::GetDC(hwnd);
                        ::TextOut(hdc,0,0,msg, strlen(msg));
                        ::ReleaseDC(hwnd,hdc);
                        return 0;
                }
                
        case WM_DESTROY:
                KillTimer(hwnd, 1);
                PostQuitMessage (0) ;
                return 0 ;
        }
        return DefWindowProc (hwnd, message, wParam, lParam) ;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

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

//**********************************************************


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

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

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

  备注:光标的位置通常以屏幕坐标的形式给出,
                它并不受包含该光标的窗口的映射模式的影响。
                该调用过程必须具有对窗口站的WINSTA_READATTRIBUTES访问权限。
                
 *********************************************************/
int main()
{
        POINT pt;
        HWND hWnd= 0;
        
        while (1){
                system("cls");  //清屏
                GetCursorPos( &pt );  //获取鼠标当前位置
                hWnd= WindowFromPoint( pt );//获取指定点的窗口的句柄(这里填的是鼠标的位置哦)
                
                printf( "X:%d\n", pt.x );
                printf( "Y:%d\n", pt.x );
                printf( "hWnd:%d\n", hWnd );
                
                system("pause");//按任意键继续
                Sleep(100);     //延时 0.1 秒
        } 
        return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

那能像SPY++那样方便的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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