C#根据句柄改变窗体控件值

简介: 原文:C#根据句柄改变窗体控件值需求是这样,有个程序界面我们需要通过自己的程序持续输入数据,界面如图。 可以获得控件的句柄而用钩子写入值。这里需要用到spy++工具。在VS的工具下有个spy++工具,打开如下图 通过这个工具可以获得窗体的句柄,当然这里获得的句柄只能用于测试,因为.net开发的程序窗体每次打开句柄都会变,都需要重新获得。
原文: C#根据句柄改变窗体控件值

需求是这样,有个程序界面我们需要通过自己的程序持续输入数据,界面如图。

img_7c155fc2207c216eca8dc77e06613dce.png

可以获得控件的句柄而用钩子写入值。这里需要用到spy++工具。在VS的工具下有个spy++工具,打开如下图

img_fc4734e56cb336ca3f05dede152e8641.png

通过这个工具可以获得窗体的句柄,当然这里获得的句柄只能用于测试,因为.net开发的程序窗体每次打开句柄都会变,都需要重新获得。这个工具的用处在于找一个控件的前一句柄控件和后一句柄控件。

一、引用

//寻找目标进程窗口       
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL", EntryPoint = "FindWindowEx", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter,string lpszClass, string lpszWindow);
//设置进程窗口到最前       
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//模拟键盘事件         
[DllImport("USER32.DLL")]
public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);
public delegate bool CallBack(IntPtr hwnd, int lParam);
[DllImport("USER32.DLL")]
public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
//给CheckBox发送信息
[DllImport("USER32.DLL", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, UInt32 wMsg, int wParam, int lParam);
//给Text发送信息
[DllImport("USER32.DLL", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, string lParam);
[DllImport("USER32.DLL")]
public static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);

二、方法

公共方法

/// <summary>
/// 查找窗体上控件句柄
/// </summary>
/// <param name="hwnd">父窗体句柄</param>
/// <param name="lpszWindow">控件标题(Text)</param>
/// <param name="bChild">设定是否在子窗体中查找</param>
/// <returns>控件句柄,没找到返回IntPtr.Zero</returns>
private static IntPtr FindWindowEx(IntPtr hwnd, string lpszWindow, bool bChild)
{
    IntPtr iResult = IntPtr.Zero;
    // 首先在父窗体上查找控件
    iResult = FindWindowEx(hwnd, 0, null, lpszWindow);
    // 如果找到直接返回控件句柄
    if (iResult != IntPtr.Zero) return iResult;
    // 如果设定了不在子窗体中查找
    if (!bChild) return iResult;
    // 枚举子窗体,查找控件句柄
    int i = EnumChildWindows(
    hwnd,
    (h, l) =>
    {
        IntPtr f1 = FindWindowEx(h, 0, null, lpszWindow);
        if (f1 == IntPtr.Zero)
            return true;
        else
        {
            iResult = f1;
            return false;
        }
    },
    0);
    // 返回查找结果
    return iResult;
}

/// <summary>
/// 输入回车
/// </summary>
private static void PrintEnter()
{
    keybd_event(Convert.ToByte(13), 0, 0, 0);
    keybd_event(Convert.ToByte(13), 0, 2, 0);
}

获得窗体句柄

IntPtr wcHandle = FindWindow(null, "窗体名称");
if (wcHandle != IntPtr.Zero)
{
    //设置游戏窗口到最前
    SetForegroundWindow(wcHandle);
}

获得有Title的控件句柄

uint BM_GETCHECK = 0xF0;
uint BST_CHECKED = 0xF1;

IntPtr weightIntPtr = FindWindowEx(wcHandle, "输入重量[&H]", true);
if (weightIntPtr != IntPtr.Zero)
{
    //获得Checkbox值
    int i = SendMessage(weightIntPtr, BM_GETCHECK, 0, 0);
    //更改CheckBox值
    SendMessage(weightIntPtr, BST_CHECKED, 1, 0);
}

获得没Title的控件句柄

public enum WindowSearch
{
    GW_HWNDFIRST = 0, //同级别第一个
    GW_HWNDLAST = 1, //同级别最后一个
    GW_HWNDNEXT = 2, //同级别下一个
    GW_HWNDPREV = 3, //同级别上一个
    GW_OWNER = 4, //属主窗口
    GW_CHILD = 5 //子窗口}获取与指定窗口具有指定关系的窗口的句柄 
}
IntPtr waybill = GetWindow(waybillIntPtr, (int)WindowSearch.GW_HWNDNEXT);
SendMessage(waybill, WM_SETTEXT, IntPtr.Zero, waybillValue);

这里完成了我们的需求,改变了窗体中选择框和Text文本框的值。

目录
相关文章
|
2月前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
72 4
|
4月前
|
C#
|
1月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
2月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
103 0
|
5月前
|
开发框架 数据可视化 C#
|
6月前
|
索引
详细解读c#ListBox控件
详细解读c#ListBox控件
41 0
|
7月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 Control 类
C# Web控件与数据感应之 Control 类
|
7月前
|
SQL 存储 C#
C# Web控件与数据感应之 TreeView 类
C# Web控件与数据感应之 TreeView 类
|
7月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 CheckBoxList 类
C# Web控件与数据感应之 CheckBoxList 类
|
7月前
|
SQL 存储 Oracle
C# Web控件与数据感应之 ListControl 类
C# Web控件与数据感应之 ListControl 类