精华内容
下载资源
问答
  • QT获取Windows系统所有窗口句柄

    千次阅读 2020-12-19 14:25:47
    这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。 3.图解的目的是为了直观易懂,所以不...

    #include

    #include

    #pragma comment(lib,"user32.lib")

    /* 回调函数,用于捕获进程 */

    BOOL MyEnumProc(HWND hwnd, LPARAM param)

    {

    LPWSTR lpString = (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH);

    if (IsWindow(hwnd) &&

    IsWindowEnabled(hwnd) &&

    IsWindowVisible(hwnd))

    {

    if (GetWindowTextW(hwnd, lpString, MAX_PATH) > 0) {

    qDebug() << QString::fromStdWString(lpString); // 打印出有标题的窗口

    }

    }

    free(lpString);

    return TRUE;

    }

    int main(int argc, char *argv[])

    {

    /* 枚举窗口的所有进程 */

    EnumWindows(MyEnumProc, 0);

    return 0;

    }

    句柄详解,什么是句柄?句柄有什么用?

    这里需要说明:

    1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

    2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

    3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

    让我们先看图,再解释。

    其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

    简单解释:

    Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

    系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

    所以,我们可以这样理解Windows句柄:

    数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

    下面,关于句柄,再交代一些关键性细节:

    1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

    其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

    2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

    3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

    4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

    写在后面:

    到此为止,有关Windows句柄就简单介绍到这里。需要说明的是,本文是面向初学者的,旨在让读者对句柄有一个完整而清晰的认知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源码的艰难晦涩。因此,本文并不能做到绝对的直达本质,同时也可能在个别细节上与真实情况稍有出入,但在下认为这并不贻害初学者对句柄的认识。因为对某一知识的认知,从几乎一无所知或是一知半解到“精通”,往往需要更多新知识的补充,短时间内很难达到,在不影响知识的使用的前提下,先把握整体,在逐步深入细节,不失为一个明智的选择。想进一步深入理解Windows句柄的读者,可以看在下的下一篇文章《源码剖析——深入Windows句柄本质》。

    作者:

    喜欢围棋和编程。查看的所有文章

    展开全文
  • I have been using the JNA library to get all visible window handles in Windows. I need to do something similar in macOS using JNA.Here is code to get all window handles in Windows:public static List ....

    I have been using the JNA library to get all visible window handles in Windows. I need to do something similar in macOS using JNA.

    Here is code to get all window handles in Windows:

    public static List findAll() {

    final List windows = new LinkedList<>();

    User32.INSTANCE.EnumWindows(new User32.WNDENUMPROC() {

    @Override

    public boolean callback(HWND hWnd, Pointer arg) {

    if (User32.INSTANCE.IsWindowVisible(hWnd)) {

    windows.add(hWnd);

    }

    return true;

    }

    }, null);

    return windows;

    }

    What is the equivalent code in macOS?

    解决方案

    You'll need to map portions of the Core Graphics Framework. You can list windows using the CGWindowListCopyWindowInfo() function.

    To load the framework you'll need to map a CoreGraphics interface extending JNA's Library class, and map the function you need:

    public interface CoreGraphics extends Library {

    CoreGraphics INSTANCE = Native.load("CoreGraphics", CoreGraphics.class);

    CFArrayRef CGWindowListCopyWindowInfo(int option, int relativeToWindow);

    }

    The CFArrayRef type is already mapped in JNA in the CoreFoundation class. Pick the appropriate Window List Option (probably kCGWindowListOptionAll = 0). If you already had a window number you could use relative reerences, otherwise you'll use kCGNullWindowID (0) for the second parameter. Calling it from your code should be simple:

    CFArrayRef windowInfo = CoreGraphics.INSTANCE.CGWindowListCopyWindowInfo(0, 0);

    That will give you an array of CFDictionaryRef objects representing the windows. You can iterate the array and then use further methods in the CFDictionaryRef class to explore these dictionary objects: you'll create a CFString for the keys. A list of required keys is documented here and optional keys are here. The constant strings match the variable name.

    This should get you a CFNumberRef for each window number (the "handle" equivalent):

    // Set up keys for dictionary lookup

    CFStringRef kCGWindowNumber = CFStringRef.createCFString("kCGWindowNumber");

    CFStringRef kCGWindowOwnerPID = CFStringRef.createCFString("kCGWindowOwnerPID");

    // Note: the Quartz name is rarely used

    CFStringRef kCGWindowName = CFStringRef.createCFString("kCGWindowName");

    CFStringRef kCGWindowOwnerName = CFStringRef.createCFString("kCGWindowOwnerName");

    // Iterate the array

    int numWindows = windowInfo.getCount();

    for (int i = 0; i < numWindows; i++) {

    // For each array element, get the dictionary

    Pointer result = windowInfo.getValueAtIndex(i);

    CFDictionaryRef windowRef = new CFDictionaryRef(result);

    // Now get information from the dictionary.

    // Get a pointer to the result, in this case a CFNumber

    result = windowRef.getValue(kCGWindowNumber);

    // "Cast" the pointer to the appropriate type

    CFNumberRef windowNumber = new CFNumberRef(result);

    // CoreFoundation.INSTANCE.CFNumberGetType(windowNumber)

    // --> 4 = kCFNumberSInt64Type, signed 64 bit so use getLong()

    // Get a pointer to the result, in this case a CFNumber

    result = windowRef.getValue(kCGWindowOwnerPID);

    // "Cast" the pointer to the appropriate type

    CFNumberRef windowOwnerPID = new CFNumberRef(result);

    // CoreFoundation.INSTANCE.CFNumberGetType(windowOwnerPID)

    // --> 4 = kCFNumberSInt64Type, signed 64 bit so use getLong()

    // Get a pointer to the result, in this case a CFString

    result = windowRef.getValue(kCGWindowName);

    // "Cast" the pointer to the appropriate type

    // Optional key, check for null

    String windowName = result == null ? "" : new CFStringRef(result).stringValue();

    // Get a pointer to the result, in this case a CFString

    result = windowRef.getValue(kCGWindowOwnerName);

    // "Cast" the pointer to the appropriate type

    // Optional key, check for null

    String windowOwnerName = result == null ? "" : new CFStringRef(result).stringValue();

    // ... look up other keys if needed ...

    // use ProcessHandle with the PID to get start time

    // Output or add to List, etc.

    System.out.println(windowNumber.longValue()

    + " (" + windowOwnerName + ", pid="

    + windowOwnerPID.longValue()

    + "): " + windowName);

    }

    // CF references from "Copy" or "Create" must be released

    // release the created key references

    kCGWindowNumber.release();

    kCGWindowOwnerPID.release();

    kCGWindowName.release();

    kCGWindowOwnerName.release();

    // release the array

    windowInfo.release();

    展开全文
  • 最新版本的JNA已经有了一些应该解决的问题(作为JNA的作者之一,Luke Quinane,声明here)。如果您使用最新版本并检查JNA API,您将看到WinUser.WNDENUMPROC接口的方法实际上使用WinDef.HWND作为其参数,而不是long或...

    最新版本的JNA已经有了一些应该解决的问题(作为JNA的作者之一,Luke Quinane,声明here)。如果您使用最新版本并检查JNA API,您将看到WinUser.WNDENUMPROC接口的方法实际上使用WinDef.HWND作为其参数,而不是long或int。

    例如:

    import com.sun.jna.Native;

    import com.sun.jna.Pointer;

    import com.sun.jna.platform.win32.WinDef.HWND;

    import com.sun.jna.platform.win32.WinUser;

    import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;

    import com.sun.jna.win32.StdCallLibrary;

    public class TryWithHWND {

    public interface User32 extends StdCallLibrary {

    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

    boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);

    int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);

    }

    public static void main(String[] args) {

    final User32 user32 = User32.INSTANCE;

    user32.EnumWindows(new WNDENUMPROC() {

    int count = 0;

    @Override

    public boolean callback(HWND hWnd, Pointer arg1) {

    byte[] windowText = new byte[512];

    user32.GetWindowTextA(hWnd, windowText, 512);

    String wText = Native.toString(windowText);

    // get rid of this if block if you want all windows regardless of whether

    // or not they have text

    if (wText.isEmpty()) {

    return true;

    }

    System.out.println("Found window with text " + hWnd + ", total " + ++count

    + " Text: " + wText);

    return true;

    }

    }, null);

    }

    }

    展开全文
  • —-想了解VC++编程获取窗口句柄的方法小结分享的全部内容且更多的C语言教程关注VC++编程获取窗口句柄的方法小结分享实例讲述了VC++编程获取窗口句柄的方法。分享给大家供大家参考,具体如下:在VC++编程中常需获取...

    —-想了解VC++编程获取窗口句柄的方法小结分享的全部内容且更多的C语言教程关注

    VC++编程获取窗口句柄的方法小结分享实例讲述了VC++编程获取窗口句柄的方法。分享给大家供大家参考,具体如下:

    在VC++编程中常需获取控件或窗体句柄,下面总结了几种方法,还希望大家能多多补充。

    1、自身窗口句柄可用AfxGetMainWnd获取。

    2、系统中其他APP的窗口句柄可用FindWindow获取(用SPY帮一下忙).

    HWND hBtnClose; HWND hWnd=::FindWindow(NULL,"腾讯QQ系统广播"); if(hWnd) { hBtnClose=GetDlgItem(hWnd,2); if(hBtnClose) PostMessage(hBtnClose,BM_CLICK,NULL,NULL); }

    3、通过指针获取窗口句柄

    HWND hwnd = pwnd->m_hwnd; //得到它的HWND,对象或指针都可以

    4、当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数;

    5、

    HWND GetDlgltem(HWND hDlg,int nlDDlgltem);

    6、通过控件ID号获取。

    CListCtrl* pleftList = (CListCtrl* )GetDlgItem(IDC_LIST1); pleftList->GetSafeHandl();

    希望VC++编程获取窗口句柄的方法小结分享所述对大家VC++程序设计有所帮助。

    本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

    如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/488377.html

    展开全文
  • python获取窗口句柄

    2021-06-27 10:41:08
    import win32gui class Hwnd(): def get_hwnd_dic(self, hwnd, hwnd_title): if (win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd) and win32gui....
  • Python----pywin32如何获取窗口句柄

    千次阅读 2021-08-08 20:27:32
    Python----pywin32如何获取窗口句柄一:介绍要用到的库二:显示窗口的属性1. 获取所有窗口的句柄2.获取窗口的子窗口句柄3.获取句柄的标题4.获取窗口类名三、实际操作1.置顶和取消2.显示和隐藏窗口四、案例演示显示和...
  • current_window_handle:获得当前窗口句柄; window_handles:返回所有窗口的句柄到当前会话; switch_to.window(suoyou[0]) ==================================================================================...
  • QT获取窗口句柄

    千次阅读 2020-12-19 14:25:48
    mac安装paramiko$ brew install openssl $ /usr/local/opt/openssl/bin/c_rehash $ export ARCHFLAGS="-arch x86_64&q ...用Canvas制作剪纸效果在做剪纸效果之前,先介绍剪纸效果运用到的一些知识: 1....
  • 获取窗口句柄

    千次阅读 2021-02-12 13:34:51
    1、使用FindWindow函数获取窗口句柄示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置。#include #include #include #include int main(int argc, char* argv[]){//根据窗口名...
  • 易语言进程id取窗口句柄关注:287答案:2mip版解决时间 2021-02-01 14:27提问者夏日╮悲歌2021-01-31 17:28我这有个进程PID:4064.怎样可以取这个进程下的窗口的句柄?最佳答案二级知识专家帞蕥2021-01-31 18:19...
  • AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWND hWnd = AfxGetMainWnd()->m_hWnd;GetTopWindow函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的...
  • C#窗口句柄

    2021-03-15 16:32:40
    例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为...
  • 得到Java程序的WIN32窗口句柄(转)

    千次阅读 2021-03-09 22:36:37
    我们知道C++的每个窗体都对应着一个句柄HWND,通过这个句柄我们可以对这个窗口以及它的资源进行各种操作,比如让它前端显示等。...用spy++查看一下,Frame或者JFrame的对象或者子类对象确实都是存在这个窗口句柄的...
  • 使用 Selenium 进行 Web 自动化测试,如果弹出新窗口时,没有对窗口进行切换,那么,WebDriver 对象的焦点对应的,依然是旧窗口,后续的自动化操作,将继续在旧窗口中进行。实例验证:# 模拟场景:打开百度,点击...
  • BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) 一般用途: 对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。...
  • AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWND hWnd = AfxGetMainWnd()->m_hWnd;GetTopWindow函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的...
  • 2016-12-06 回答句柄获取方法(获取该窗口的...主窗口的句柄:无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:afxgetmainwnd()->m_hwnd,如:::sendmessage(afxgetmainwnd()->m_hwnd,wm_my_dosome,...
  • 句柄一般是指获取另一个对象的方法——一个广义的指针,它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的惟一的联系使用 selenium 获取窗口句柄from selenium ...
  • 话题:按键精灵怎么获取同名窗口句柄回答:命令名称: Search 遍历符合窗口 命令功能: 遍历符合窗口标题的句柄保存到数组里 命令参数: 参数1 字符串型,窗口符合的标题 返 回 值: 字符串型,句柄数组 脚本例: ...
  • 有道云笔记下的这两个子窗口的类名、标题都是一样的。hwnd=Plugin.Window.find(0,"有道云笔记Haiye")HwndEx=Plugin.Window.findex(hwnd,0,"Popo.UI.Controls.Class.SkinSplitter",0)上面的代码只能找到第一个类名为...
  • hwnd 是窗口句柄,系统分配的一个ID号,对操作系统来说就是这个窗口的唯一标识,通过它就可以操作WIN窗口了,LABVIEW VI的前面板无疑是一个WINDOWS窗口,那如何获得这个窗口句柄那.有两种方法:1.利用API FindWindow函数...
  • 1. 编写控制台程序,获得标准输入输出的窗口句柄GetStdHandle函数声明如下 :HANDLE GetStdHandle(DWORD nStdHandle);GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出 /错误的屏幕缓冲...
  • c++获取窗口句柄的方法

    千次阅读 2021-01-18 14:22:33
    //获取主窗口句柄 /* HWND WINAPI FindWindow( _In_opt_ LPCTSTR lpClassName, //窗口的类名 _In_opt_ LPCTSTR lpWindowName //窗口的标题名 ); */ hWnd = FindWindow(szWindowClass, NULL); //重新绘制客户区 ...
  • ——————— 【 转载请保留 】 ———————作者:Defanive博客:Console.Dec.Cn(Hi.Baidu....得到了窗口句柄,能够做很多事情。控制台程序,若能在窗口效果上下文章,那么这个第三方工具将会很成功。网...
  • usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Media;...
  • 小编典典以下代码使您可以传递Component以获得其窗口句柄(HWND)。要确保Component具有相应的窗口句柄,请在Component上调用isLightWeight()并验证其等于false。如果不是,请通过调用Component.getParent()尝试将其...
  • [WinAPI] 获取窗口句柄的几种方法

    千次阅读 2021-02-24 15:11:47
    1、使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小,并且移动窗口到指定位置。 我们想获得酷我音乐盒的窗口句柄并移动它,该怎么办呢? 首先打开VC或者VS里面tool中...
  • import win32gui hwnd_title = {} def get_all_hwnd(hwnd, mouse): if (win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd)): hwnd_title.update({hwnd: win32...
  • windows获取窗口句柄或者类名 以下步骤记录了windows下,通过vs工具获取窗体或者程序句柄的方法。 1、打开VS2015(以2015为例,2010也可以); 2、菜单/工具/Spy(或者Spy++64); 3、打开的界面可以看到所有已运行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,097
精华内容 50,038
关键字:

所有窗口句柄