最新版本:C / C ++ Windows API——获取鼠标位置的窗口句柄(2)

电脑杂谈  发布时间:2020-11-20 07:01:06  来源:网络整理

获取鼠标所在窗口句柄_获取鼠标所在窗口句柄

这里写图片描述

获取鼠标所在窗口句柄_获取鼠标所在窗口句柄

在评论中,有人说您可以使用“ WindowFromPoint”实现此功能,因此可以使用以下代码。

获取鼠标所在窗口句柄_获取鼠标所在窗口句柄

// SpyDemo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include 
int main()
{
    BOOL ret;
    UINT count;
    /*
    typedef struct tagPOINT
    {
        LONG  x;
        LONG  y;
    } POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
    */
    POINT point;
    TCHAR pszFileName[MAX_PATH];
    TCHAR lpClassName[MAX_PATH];
    TCHAR windowText[MAX_PATH];
    while(true) {
        ret = GetCursorPos(&point);
        if (!ret) {
            printf("GetCursorPos -> fail(%ld)\n", GetLastError());
        } else {
            printf("GetCursorPos -> (%ld, %ld)\n", point.x, point.y);
            HWND hwnd = WindowFromPoint(point);
            if (hwnd == NULL || hwnd == INVALID_HANDLE_VALUE) {
                printf("WindowFromPoint point=(%ld, %ld) -> hwnd=%p -> fail(%ld)\n", point.x, point.y, hwnd, GetLastError());
            }
            else {
                printf("WindowFromPoint -> hwnd=%p\n", hwnd);
                /*
                检索与指定的窗口句柄关联的模块的完整路径和文件名称
                WINUSERAPI UINT WINAPI GetWindowModuleFileNameW(
                    _In_ HWND hwnd,
                    _Out_writes_to_(cchFileNameMax, return) LPWSTR pszFileName,
                    _In_ UINT cchFileNameMax
                );
                返回值是复制到缓冲区的字符总数。
                */
                count = GetWindowModuleFileName(hwnd, pszFileName, MAX_PATH);
                _tprintf(_T("GetWindowModuleFileName hwnd=%p -> count=%d, fileName=%s\n"), hwnd, count, pszFileName);
                /*
                WINUSERAPI int WINAPI GetClassName(
                    _In_ HWND hWnd,
                    _Out_writes_to_(nMaxCount, return) LPTSTR lpClassName,
                    _In_ int nMaxCount
                );
                */
                count = GetClassName(hwnd, lpClassName, MAX_PATH);
                _tprintf(_T("GetClassName hwnd=%p -> count=%d, lpClassName=%s\n"), hwnd, count, lpClassName);
                count = GetWindowText(hwnd, windowText, MAX_PATH);
                _tprintf(_T("GetWindowText hwnd=%p -> count=%d, lpClassName=%s\n"), hwnd, count, windowText);
            }
            //Screen(屏幕坐标)到Client(客户区坐标)的转换。
            ret = ScreenToClient(hwnd, &point);
            if (!ret) {
                printf("ScreenToClient hwnd=%p -> fail(%ld)\n", hwnd, GetLastError());
            }
            else {
                printf("ScreenToClient hwnd=%p -> point=(%ld, %ld)\n", hwnd, point.x, point.y);
                //返回父窗口中包含了指定点的第一个子窗口的句柄
                HWND childHwnd = ChildWindowFromPoint(hwnd, point);
                printf("ChildWindowFromPoint hwnd=%p, point=(%ld, %ld) -> childHwnd=%p\n", hwnd, point.x, point.y, childHwnd);
                count = GetClassName(hwnd, lpClassName, MAX_PATH);
                _tprintf(_T("GetClassName hwnd=%p -> count=%d, lpClassName=%s\n"), hwnd, count, lpClassName);
                count = GetWindowText(hwnd, windowText, MAX_PATH);
                _tprintf(_T("GetWindowText hwnd=%p -> count=%d, lpClassName=%s\n"), hwnd, count, windowText);
            }
        }
        Sleep(5000);
    }
    return 0;
}

这里写图片描述

但是有一个问题:

为什么每次GetWindowModuleFileName的句柄都不同,但是每次获取的模块文件的路径都与当前路径相同。

我希望一位伟大的上帝可以帮助我回答。我很感激。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-334616-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 吉田仁美
      吉田仁美

      万儿八千一年多了几块钱

    • 潘玲玲
      潘玲玲

      舍己为人的精神值得全世界学习

    • 杨侗
      杨侗

      明天我就叫几个兄弟去你家提亲

    热点图片
    拼命载入中...