描述:
    我想通过编程实现,找到WebDve.Webserver.EXE 的端口号,用于动态调试WEBSERVICE,因为端口号是随机生成的·非常麻烦·每次都要重新设置一次··现在我想通过程序来找到它显示端口号的那个文本框的句柄。通过API getwindowTEXT来找到它的值.目前已经实现的代码如下:        [DllImport("user32.dll", EntryPoint="GetWindowText")]
        public static extern int GetWindowText (int hwnd,StringBuilder lpString,int cch);          public Form1()
        {   
            int hwnd =263842;// 文本框的句柄 
            StringBuilder sb = new StringBuilder(256);
            GetWindowText(hwnd, sb, sb.Capacity);             MessageBox.Show(sb.ToString()); //显示端口号             //问题所在:句柄无法动态得到,原因 它没有固定窗体类名和标题。只有进程的名称是固定的        }
        请给出详细实现代码,有一定的注释便于理解,谢谢了··

解决方案 »

  1.   

    参考
    http://topic.csdn.net/t/20030114/16/1357899.html
      

  2.   

     public Process[] myProcess;
             myProcess = Process.GetProcessesByName("");
            public IntPtr handle;
                foreach (Process instance in myProcess)
                {
                    handle = instance.MainWindowHandle;
                }
    你说只有进程的名称是固定的,那么通过进程名字获取不就好了 handle得到窗口句柄
      

  3.   

    //问题所在:句柄无法动态得到,原因 它没有固定窗体类名和标题。只有进程的名称是固定的你可以通过 
    System.Diagnostics.Process.GetProcessesByName("进程名") 获取进程信息通过 _Process.MainWindowHandle 来获取主窗体..这里如果获取到的主窗体不是你要的窗体..那就需要用   [DllImport("user32.dll")]
            public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
    配合
     [DllImport("user32.dll")]
            public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
    来获取进程下所有窗体然后使用
          [DllImport("user32.dll")]
            public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam);
    获取窗体的控件...最后才是你
    GetWindowText 的方法.
      

  4.   

    窗体不可能为0 ..你调试的程序给我发下 我给你写把? 如果MainWindowHandle为0 那只能说明程序的窗体..所名程序的窗体不是主线程里的而已..
    在其他线程里的.
      

  5.   

               Process[] proce = Process.GetProcessesByName("WebDev.WebServer");
               int i=  proce[0].MainWindowHandle.ToInt32();
               int hwnd = proce[0].MainWindowHandle.ToInt32();   程序代码在这里就没了· 首先用VS创建一个WEBSERVICE 再调试状态打开。然后再创建一个windows应用程序·在构造器中写入上面的代码·引用名称空间 using System.Diagnostics;
    ·您调试就能看到···
      

  6.   

    MainWindowHandle不一定能得到句柄,用FindWindow函数可以得到
      

  7.   

    你想获取到ASP.NET Development Server-端口 ????  或则这个字符串?
      

  8.   

    谢谢  【zgke】给我实现方案·问题已经解决·我直接遍历所有父级窗体·在遍历子窗体。找到匹配的URL了·虽然没有理想的那么完美·但是问题解决了·解决了调试改端口的问题·呵呵·只是有点浪费效率·还好只是在自己的电脑上用的一个小东西··下面发出全部实现的代码·结贴·呵呵 部分接口参数理解可能存在曲解哈·实现类using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Diagnostics;namespace ChangeWebServiceDebugStatePort
    {
        public class WebServicePort
        {
            internal delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);  //定义线程枚举委托
            internal delegate bool EnumChildrenCallback(IntPtr hwnd, IntPtr lParam);       //定义子窗体枚举委托        private string PortString = "";  //接受端口字符串        //
            //引入API 枚举所有顶级窗体接口
            //
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            internal static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);        //
            //引入API 枚举所有子窗体接口
            //
            [DllImport("user32.dll", ExactSpelling = true)]
            internal static extern bool EnumChildWindows(HandleRef hwndParent, EnumChildrenCallback lpEnumFunc, HandleRef lParam);        //
            //引入API 枚举所有线程接口
            //
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            internal static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);        //
            //引入API 获取窗体文本接口
            //
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            internal static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, int nMaxCount);        //
            //引入API 获取窗体文本长度接口
            //
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowTextLength(HandleRef hWnd);        /// <summary>
            /// 枚举所有顶级窗体
            /// </summary>
            /// <param name="handle">句柄</param>
            /// <param name="extraParameter">指针位置</param>
            /// <returns>返回枚举结果</returns>
            private bool EnumWindowsCallback(IntPtr handle, IntPtr extraParameter)
            {
                int capacity = GetWindowTextLength(new HandleRef(this, handle)) * 2;
                StringBuilder lpString = new StringBuilder(capacity);
                GetWindowText(new HandleRef(this, handle), lpString, lpString.Capacity);
                if (lpString.Length > 0)
                {
                    EnumChildWindows(new HandleRef(null, handle), new EnumChildrenCallback(EnumChildWindowsCallBack), new HandleRef(null, IntPtr.Zero));
                }
                return true;
            }        /// <summary>
            /// 枚举所有父级窗体下的子窗体
            /// </summary>
            /// <param name="handle">句柄</param>
            /// <param name="lparam">索引位置</param>
            /// <returns>返回枚举结果</returns>
            private bool EnumChildWindowsCallBack(IntPtr handle, IntPtr lparam)
            {
                int capacity = GetWindowTextLength(new HandleRef(this, handle)) * 2;
                StringBuilder lpString = new StringBuilder(capacity);
                GetWindowText(new HandleRef(this, handle), lpString, lpString.Capacity);
                if (lpString.Length > 0 && lpString.ToString().IndexOf("http://localhost:") != -1) //判断是否包含指定的字符
                {
                    PortString = lpString.ToString(); //设置返回值
                    EnumChildWindows(new HandleRef(null, handle), new EnumChildrenCallback(EnumChildWindowsCallBack), new HandleRef(null, IntPtr.Zero));
                }            return true;
            }        public string GetWebServicePort()
            {
                EnumThreadWindowsCallback callback = new EnumThreadWindowsCallback(this.EnumWindowsCallback);
                EnumWindows(callback, IntPtr.Zero);
                return PortString;
            }
           
        }
    }调用类     WarehouseService.WarehouseService WarehouseDAO = new HYCMS.MangeUI.WarehouseService.WarehouseService();
                WarehouseDAO.Url = new WebServicePort().GetWebServicePort() + "WarehouseService.asmx";