longteng670603753 2023-09-22 15:04 采纳率: 50%
浏览 9
已结题

VS2019 SPY++ 获取句柄操作

#怎么用SPY++ 点击 “ 打开程序”

img

img

img

hwnd 获取到了当前窗体的句柄,但是不知道怎么通过 这个窗口的句柄 获取 ” 打开程序“ 这个按钮的句柄

  • 写回答

9条回答 默认 最新

  • Leodong. 2023-09-22 16:58
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    【第一种实现方式】
    要获取"打开程序"按钮的句柄,你可以使用Spy++工具。首先,确保你已经安装了Spy++。然后按照以下步骤操作:

    1. 打开Spy++。
    2. 在Spy++窗口中,点击菜单栏的"Search",然后选择"Find Window"。
    3. 在"Find Window"对话框中,输入你想要查找的窗口类名,例如"Button"。
    4. 在"Search Subtree"选项卡中,点击"Search"按钮。
    5. Spy++将搜索并列出所有匹配的窗口。你应该能在列表中找到"打开程序"按钮。
    6. 选中"打开程序"按钮,然后在右侧的"Handle"列中查看其句柄。

    现在你已经获取了"打开程序"按钮的句柄,可以将其用于你的C#代码中。在你的代码中,可以将hwnd变量替换为从Spy++获取到的句柄值。例如:

    private void btnUploadProgramFromPLCF_Click(object sender, EventArgs e)
    {
        const int BM_CLICK = 0xF5;
        int buttonHandle = /* 从Spy++获取到的句柄值 */;
        SendMessage(buttonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    }
    

    请注意,你需要将/* 从Spy++获取到的句柄值 */替换为实际的句柄值。


    【第二种实现方式】
    要使用Spy++获取窗口句柄和控件句柄,您可以按照以下步骤进行操作:

    1. 打开Spy++:在Visual Studio中,选择“工具(Tools)”菜单,然后选择“Spy++”选项。

    2. 启动目标程序:在Spy++中,选择“搜索(Search)”菜单,然后选择“查找窗口(Find Window)”选项。在弹出的对话框中,选择目标程序的窗口,然后点击“确定”。

    3. 获取窗口句柄:在Spy++中,选择目标程序的窗口,可以看到窗口的句柄(Window Handle)。将窗口句柄记录下来,以便后续使用。

    4. 获取控件句柄:在Spy++中,选择“搜索(Search)”菜单,然后选择“查找(Find)”选项。在弹出的对话框中,选择“句柄(Handle)”选项卡,并输入窗口句柄。点击“查找下一个(Find Next)”按钮,可以查找到该窗口下的所有控件句柄。

    5. 记录按钮句柄:找到您需要的按钮控件后,将按钮的句柄记录下来,以便后续使用。

    在您的C#代码中,通过使用窗口句柄和控件句柄,您可以执行相应的操作。以下是一个示例:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
    private const int BM_CLICK = 0xF5;
    
    // 在按钮点击事件中执行点击操作
    private void btnUploadProgramFromPLC_Click(object sender, EventArgs e)
    {
        IntPtr formHandle = FindWindow(null, "Form1"); // 根据窗口标题查找窗口句柄
        IntPtr buttonHandle = FindWindowEx(formHandle, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.141b42a_r7_ad1", null); // 根据控件类名查找按钮句柄
    
        // 发送点击消息给按钮
        SendMessage(buttonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    }
    

    请注意,以上示例中的窗口标题和控件类名是根据您提供的信息推测的,如果不准确,请根据实际情况进行调整。

    希望这能帮助到您!如果您有任何其他问题,请随时提问。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • threenewbee 2023-09-22 15:13
    关注

    继续调用 FindWindowEx
    hButton = FindWindowEx(hwnd,NULL, NULL, NULL); //这里第一个参数表示查找hwnd的第一个子窗口,因为你界面上只有一个按钮,所以就是
    也可以用 EnumChildWindows,类似的。

    评论 编辑记录
  • 专家-赤兔[在线] 2023-09-22 15:17
    关注

    引用 皆我百晓生 小程序回应内容作答:
    要获取窗口中的按钮句柄,您可以使用Windows API函数FindWindowEx和FindWindow来搜索窗口和控件。下面是一个示例代码,展示如何使用FindWindowEx和FindWindow函数获取按钮的句柄:

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpClassName, string lpWindowName);
    
        static void Main()
        {
            // 获取父窗口句柄
            IntPtr parentHandle = FindWindow(null, "打开程序");
    
            // 检查父窗口句柄是否有效
            if (parentHandle == IntPtr.Zero)
            {
                Console.WriteLine("父窗口未找到");
                return;
            }
    
            // 获取按钮句柄
            IntPtr buttonHandle = FindWindowEx(parentHandle, IntPtr.Zero, "Button", null);
    
            // 检查按钮句柄是否有效
            if (buttonHandle == IntPtr.Zero)
            {
                Console.WriteLine("按钮未找到");
                return;
            }
    
            // 输出按钮句柄
            Console.WriteLine("按钮句柄: " + buttonHandle.ToString());
        }
    }
    

    请确保将窗口标题("打开程序")和控件类名("Button")替换为实际的值。通过FindWindow函数,您可以查找具有指定标题的顶级窗口的句柄。通过FindWindowEx函数,您可以查找指定父窗口下的具有指定类名的子控件的句柄。

    评论
  • node版本不兼容 2023-09-22 16:00
    关注

    获取窗口句柄

    #include <Windows.h>
    
    int main() {
        // 根据窗口标题查找窗口句柄
        HWND hWnd = FindWindow(NULL, L"窗口标题");
    
        if (hWnd != NULL) {
            // 窗口句柄获取成功,可以在这里进行操作
            // 例如:显示窗口
            ShowWindow(hWnd, SW_SHOW);
        } else {
            MessageBox(NULL, L"窗口句柄获取失败!", L"Error", MB_OK | MB_ICONERROR);
        }
    
        return 0;
    }
    
    
    

    获取控件句柄并进行操作

    #include <Windows.h>
    
    int main() {
        // 获取窗口句柄,假设hWnd是窗口句柄
        HWND hWnd = FindWindow(NULL, L"窗口标题");
    
        if (hWnd != NULL) {
            // 获取按钮控件句柄,假设IDC_BUTTON是按钮的ID
            HWND hButton = GetDlgItem(hWnd, IDC_BUTTON);
    
            if (hButton != NULL) {
                // 按钮控件句柄获取成功,可以在这里进行操作
                // 例如:模拟按钮点击
                SendMessage(hButton, BM_CLICK, 0, 0);
            } else {
                MessageBox(NULL, L"按钮控件句柄获取失败!", L"Error", MB_OK | MB_ICONERROR);
            }
        } else {
            MessageBox(NULL, L"窗口句柄获取失败!", L"Error", MB_OK | MB_ICONERROR);
        }
    
        return 0;
    }
    
    
    
    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-22 18:03
    关注

    【以下回答由 GPT 生成】

    我可以提供以下步骤来帮助你使用VS2019 SPY++获取窗口句柄并操作按钮:

    1. 首先,确保你已经安装了VS2019和SPY++工具。如果没有,请先安装它们。

    2. 打开SPY++工具,并点击菜单栏上的"Finder"选项,然后选择"Find Window"。或者你也可以使用快捷键Ctrl+F

    3. 在"Find Window"对话框中,你可以使用不同的方式来查找你想要获取句柄的窗口。你可以选择使用鼠标指针来选择窗口,然后点击"OK"按钮。你也可以通过选择"By Name"选项并输入窗口标题来查找窗口。还可以通过选择"By Class"选项并输入窗口类名来查找。

    4. 一旦你找到了想要获取句柄的窗口,你可以在SPY++主窗口的树状视图中看到窗口的层级结构。找到该窗口,在树状视图中双击它,窗口的详细信息将显示在右侧的属性视图中。

    5. 在属性视图中,你可以看到该窗口的句柄。你可以将这个句柄记录下来以备后用。

    6. 要获取该窗口中的按钮句柄,首先你需要确保按钮是窗口的子控件之一。在树状视图中找到该窗口的子控件并双击它,子控件的详细信息将显示在右侧的属性视图中。

    7. 在属性视图中,你可以找到子控件的句柄。你可以将这个句柄记录下来以备后用。

    以上是使用VS2019 SPY++获取窗口句柄并操作按钮的步骤。可以根据具体情况进行相应的修改和调整。如果你遇到了问题或有其他疑问,请告诉我。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 数据大魔王 2023-09-22 18:47
    关注

    打开Spy++工具:首先,确保您已经安装了Spy++工具,它通常包含在Visual Studio安装中。在开始菜单或Visual Studio的工具菜单中可以找到Spy++。

    启动Spy++并附加到目标窗口:打开Spy++并选择“附加”菜单,然后在弹出的窗口中选择要附加到的目标窗口。在您的情况下,目标窗口似乎是“打开程序”对话框。

    寻找窗口控件:在Spy++的主界面中,您将看到一个窗口树形结构,显示了系统中所有的窗口。在树中展开“打开程序”对话框的节点,以查看其子窗口。

    查找按钮控件:浏览窗口树,找到“打开程序”对话框中的按钮控件。按钮通常以类名为Button或ButtonEx,并且它们可能会有相应的标题或标签。一旦找到按钮,您将在Spy++的窗口树中看到它。

    获取按钮的句柄:右键单击按钮控件,然后选择“复制”以复制按钮的句柄。这样,您就可以将它粘贴到您的代码中以使用该句柄。

    评论
  • 呈两面包夹芝士 2023-09-22 20:03
    关注

    引自GPT
    要通过窗口句柄获取"打开程序"按钮的句柄,你可以使用Spy++工具。以下是使用Spy++的步骤:

    1. 打开Spy++工具。你可以在开始菜单或桌面上找到它。
    2. 在Spy++工具中,点击"文件"菜单,然后选择"打开进程"。
    3. 在弹出的对话框中,输入你想要分析的进程的名称,然后点击"打开"按钮。
    4. Spy++将显示该进程的所有窗口及其句柄。
    5. 在窗口列表中,找到包含"打开程序"按钮的窗口。它的句柄应该是一个长整型值。
    6. 选中该窗口,然后在右侧的"对象"面板中找到"Button"对象。
    7. 双击"Button"对象,Spy++将自动定位到"打开程序"按钮的句柄。

    现在你已经成功获取了"打开程序"按钮的句柄,你可以根据需要对其进行操作。

    评论
  • 心梓知识 2023-09-23 01:02
    关注

    结合GPT给出回答如下请题主参考
    可以使用以下步骤来获取 "打开程序" 按钮的句柄:

    1. 打开 SPY++ 工具,选择 "Find Window" 菜单选项,或者使用快捷键 Ctrl + F。

    2. 在 "Find Window" 对话框中,选择 "Find Window with the mouse" 选项。

    3. 将光标移动到 "打开程序" 按钮上,并单击一次。这将在 SPY++ 工具中显示该按钮的句柄和类名等详细信息。

    4. 复制该句柄,并在程序中使用 FindWindow 或 FindWindowEx 函数来获取该按钮的句柄。

    下面是一个示例代码,演示如何通过窗口的句柄来获取 "打开程序" 按钮的句柄:

    HWND hWnd = // 窗口句柄
    HWND hOpenButton = FindWindowEx(hWnd, NULL, L"Button", L"打开程序");
    if (hOpenButton != NULL) {
        // 找到了 "打开程序" 按钮,进行操作
    }
    else {
        // 没有找到 "打开程序" 按钮
    }
    

    在上面的代码中,使用了 FindWindowEx 函数来查找 "打开程序" 按钮。该函数需要一个父窗口句柄,一个类名,和一个窗口标题等参数来查找指定的子窗口。注意,类名和窗口标题都是以 Unicode 字符串的形式传递的。如果找到了指定的窗口,则函数将返回该窗口的句柄;否则返回 NULL。

    评论
  • 监狱和高墙 2023-09-26 14:58
    关注

    通过窗口句柄获取窗口内的子控件(如按钮)的句柄,可以使用Windows API函数FindWindowEx和FindWindow。以下是一些示例代码,演示如何获取“打开程序”按钮的句柄:

    首先,你需要获取“打开程序”窗口的句柄。你可以使用FindWindow来做到这一点,提供窗口的类名或窗口标题:

    // 寻找“打开程序”窗口的句柄
    IntPtr openProgramWindow = FindWindow(null, "打开程序");
    
    

    接下来,使用FindWindowEx函数获取按钮控件的句柄。你需要提供父窗口的句柄(在这种情况下是“打开程序”窗口的句柄),以及按钮的类名或其他标识符:

    // 寻找按钮控件的句柄
    IntPtr openButton = FindWindowEx(openProgramWindow, IntPtr.Zero, "Button", "打开(&O)");
    
    

    在上面的代码中,第三个参数是按钮的类名,第四个参数是按钮上显示的文本。你可以根据你的实际情况来更改这些参数。

    现在,openButton变量中存储了“打开程序”窗口中“打开(&O)”按钮的句柄。你可以使用这个句柄执行各种操作,如模拟点击按钮。

    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 10月3日
  • 已采纳回答 9月25日
  • 创建了问题 9月22日

悬赏问题

  • ¥15 uniapp中全局引入的scss样式,会在每个使用的文件中都添加重复的代码,导致打包出来文件很大
  • ¥15 shopify网站提速
  • ¥15 深海控制器DSE7320MKII和博世ECU间can通讯知识
  • ¥15 Ru的复折射率用于FDTD 200nm到1200nm
  • ¥15 使用Fiddler抓包,textview的乱码如何解决
  • ¥50 trio连接驱动器报错
  • ¥15 有谁懂nhanes的权重计算啊
  • ¥15 欧姆龙PLC 电机控制 限位
  • ¥30 如何处理shell命令接收到的视频流并实时播放出来
  • ¥15 虚心请教C#的代码优化问题