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

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]);
        }
    }
}

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

时间: 2024-08-03 07:17:51

遍历指定程序名窗口上的所有控件的相关文章

c# winform 循环遍历界面上的所有控件,foreach,Controls,AllowDrop

foreach (System.Windows.Forms.Control control in this.groupBox2.Controls)//遍历groupBox2上的所有控件 { if (control is System.Windows.Forms.PictureBox) { System.Windows.Forms.PictureBox pb = (System.Windows.Forms.PictureBox)control; pb.AllowDrop = true; } if

jquery上传文件控件Uploadify

基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件. 要求使用jquery1.4或以上版本,flash player 9.0.24以上. 有两个版本,一个用flash,一个是html5.html5的需要付费~所以这里只说flash版本的用法. 官网:http://www.uploadify.com/ 控件截图: 用法: 首先引用下面的文件 <link rel="stylesheet" type="text/css&

上传文件控件

我们在编写页面的时候会遇到这样的情况,需要上传文件.我们一般会使用<input type="file" />来处理. 但是他会有一个小问题.下面我们一起来看一看. 不同浏览器下式样差别较大. IE8:在按钮前面有一个文本框用来显示文件路径. chrome:在按钮后面显示文件上传状态.默认文言略有不同. Firefox:与chrome相似. 不同浏览器下的式样不同,导致我们不能基于一个稳定的式样做设置,当我们设置width和height也会遮盖不同的部分. 解决方案1:将&l

C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级

首先在form1的窗体载入中新建了一个Class1对象并将本身的引用传递进入其构造函数,然后在Class1的构造函数中创建一个线程.该线程所代理的方法事件是本类中的一个add方法.而add方法的内容则是在form1上放一个textbox.然而这个流程你需要注意的有几个问题:1.哪个是主线程?所谓主线程是第一个启动的线程,是从main开始的.form1的这个窗体是由主线程创建的.2.Thread t的线程是什么?t是由主线程创建的,t的操作内容是在由主线程创建的窗体上放一个textbox.也就是说

窗口使用半透明图片,控件不透明的方法

最近项目软件需要制作半透明窗口,但控件不能透明.窗口和控件都是自绘的.网上大部分例子都是直接设置窗口透明度实现,这样只能让整个窗口透明,达不到我们想要的效果.经研究发现,需要使用父子两个窗口配合制作,父窗口不能在OnPaint那里自绘,而是直接GetDC得到句柄自绘背景,子窗口负责自绘控件. 关键代码:父窗口 OnInitDialog() { m_dlg.Create(m_hWnd); m_dlg.ShowWindow(SW_SHOW); m_dlg.MoveWindow(&rct); HDC

可能用得上的UI控件

为了便于开发者打造各式各样的优秀App,UIKit框架提供了非常多功能强大又易用的UI控件以下列举一些在开发中可能用得上的UI控件:   红色表明最常用,蓝色代表一般,黑色代表几乎不用(这不是绝对的,仅供参考)

如何在UIScrollView的xib上添加子控件并添加AutoLayout约束

引言 自从苹果推出了autoLayout之后,作为开发者,深深的体验到了他的便捷之处,再也不用为适配不同屏幕布局UI而烦恼,我们仅仅需要和类关联一个xib文件,想上面放置我们需要的控件xib,并打好其相对于父视图以及同级视图的约束关系,这样我们就做好了不同屏幕的适配.但是奇怪的是UIScrollView上添加子控件,和之前的一样的操作,报的错却很吓人,那是为什么呢? 原因分析 因为UIScrollView想要能滑动的前提是要知道他的ContentSize的大小,我们直接向上面添加约束,他不知道自

在Web上调用Ocx控件

原文:http://blog.csdn.net/goodadult2012/article/details/6343369 在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中:将该控件下载给用户:在用户机器上安装该控件.如果只是针对IE用户,在HTML中插入ActiveX控件就比较简单:如果同时兼顾IE和Netscape用户,则要做更多工作.大家知道,HTML文件由文本和各种标志 (tags)组成,ActiveX 控件对于IE在HTML中的标志是<OBJECT>,该标

【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码

再上数据分页控件-更加灵活,更加实用 关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页.各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了.下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便.对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅. 1. 原创企业级控件库之大数据量