描述:
我想通过编程实现,找到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()); //显示端口号 //问题所在:句柄无法动态得到,原因 它没有固定窗体类名和标题。只有进程的名称是固定的 }
请给出详细实现代码,有一定的注释便于理解,谢谢了··
我想通过编程实现,找到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()); //显示端口号 //问题所在:句柄无法动态得到,原因 它没有固定窗体类名和标题。只有进程的名称是固定的 }
请给出详细实现代码,有一定的注释便于理解,谢谢了··
http://topic.csdn.net/t/20030114/16/1357899.html
myProcess = Process.GetProcessesByName("");
public IntPtr handle;
foreach (Process instance in myProcess)
{
handle = instance.MainWindowHandle;
}
你说只有进程的名称是固定的,那么通过进程名字获取不就好了 handle得到窗口句柄
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 的方法.
在其他线程里的.
int i= proce[0].MainWindowHandle.ToInt32();
int hwnd = proce[0].MainWindowHandle.ToInt32(); 程序代码在这里就没了· 首先用VS创建一个WEBSERVICE 再调试状态打开。然后再创建一个windows应用程序·在构造器中写入上面的代码·引用名称空间 using System.Diagnostics;
·您调试就能看到···
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";