码迷,mamicode.com
首页 > 其他好文 > 详细

遍历指定程序名窗口上的所有控件

时间:2019-01-25 15:13:50      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:proc   windows   user   ring   child   cti   erp   sam   box   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", EntryPoint = "FindWindowExA")]
        private static extern IntPtr FindWindowExA(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMacCount);
        [DllImport("user32.dll")]
        private static extern int GetWindowTextA(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ParPtr">Set with main window handle on first call</param>
        /// <param name="ChildAfterPtr"></param>
        /// <param name="CurNode"></param>
        /// <returns></returns>
        private IntPtr GetChild(IntPtr ParPtr, IntPtr ChildAfterPtr, TreeNode CurNode)
        {
            // IntPtr ChildPtr = IntPtr.Zero;
            IntPtr NextChildPtr = IntPtr.Zero;
            IntPtr ChildPtr = FindWindowExA(ParPtr, ChildAfterPtr, null, null);
            StringBuilder CurClassName = new StringBuilder();
            StringBuilder CurWindowTitle = new StringBuilder();
            if (ChildPtr != IntPtr.Zero)
            {
                GetClassName(ChildPtr, CurClassName, 100);
                GetWindowTextA(ChildPtr, CurWindowTitle, 100);
                CurNode.Nodes.Add(ChildPtr.ToString("X2") + " : " + CurClassName.ToString() + " : " + CurWindowTitle);
                NextChildPtr = GetChild(ChildPtr, IntPtr.Zero, CurNode.Nodes[CurNode.Nodes.Count - 1]);     // for next level controls
            }
            if (ChildPtr != IntPtr.Zero)
            {
                NextChildPtr = GetChild(ParPtr, ChildPtr, CurNode);     // for same level controls
            }
            return ChildPtr;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string MainWindowsProcName = textBox1.Text;
            IntPtr HeMainWindowHandle = IntPtr.Zero;
            StringBuilder CurClassName = new StringBuilder();
            StringBuilder CurWindowTitle = new StringBuilder();
            treeView1.Nodes.Clear();

            Process[] AllHeProcs = Process.GetProcessesByName(MainWindowsProcName);     // get process by specific name
            if (AllHeProcs.Count() != 1)
            {
                MessageBox.Show("Process instance count not equal 1, use first one");
            }
            HeMainWindowHandle = AllHeProcs[0].MainWindowHandle;    // get main window handle
            GetClassName(HeMainWindowHandle, CurClassName, 100);
            GetWindowTextA(HeMainWindowHandle, CurWindowTitle, 100);
            treeView1.Nodes.Add(HeMainWindowHandle.ToString("X2") + " : " + CurClassName + " : " + CurWindowTitle);
            GetChild(HeMainWindowHandle, IntPtr.Zero, treeView1.Nodes[0]);
        }
    }
}

  

技术分享图片

 

遍历指定程序名窗口上的所有控件

标签:proc   windows   user   ring   child   cti   erp   sam   box   

原文地址:https://www.cnblogs.com/tiger9637/p/10319273.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!