获取进程/主窗口的句柄

获取进程/主窗口的句柄

获取进程/主窗口的句柄

通过Process的MainWindowHandle的方式不一定获取到到句柄,因此我们需要结束Win32的Api来来获取

Win32的Api中有EnumWindows可以枚举中所有的窗体,通过继承id和进程名的方式进行匹配,便可以获取到指定的进程的主窗体的句柄

具体的代码如下:

///

/// 枚举窗体的回调

///

///

///

///

public delegate bool EnumWindowsCallBack(IntPtr hwnd, IntPtr lParam);

///

/// 枚举出窗体

///

///

///

///

[DllImport("user32")]

public static extern int EnumWindows(EnumWindowsCallBack x, IntPtr y);

///

/// 获取窗体的名称

///

///

///

///

///

[DllImport("user32.dll")]

public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpString, int nMaxCount);

[DllImport("User32.dll", CharSet = CharSet.Auto)]

public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);

///

/// 枚举方式获取句柄

///

///

public static IntPtr EnumWindows(Process process)

{

IntPtr msgPtr = Marshal.StringToHGlobalAnsi(_processName + "^" + process.Id);

IntPtr handle=IntPtr.Zero;

EnumWindows(new EnumWindowsCallBack((hwnd, lpam) =>

{

var msgs = (Marshal.PtrToStringAnsi(lpam)).Split('^');

if (msgs.Length < 2) return false;//停止枚举

string msg = msgs[0];

var lpid = int.Parse(msgs[1]);

StringBuilder sb = new StringBuilder(256);

GetWindowTextW(hwnd, sb, sb.Capacity);

GetWindowThreadProcessId(hwnd, out int pid);

if (sb != null && sb.ToString().Equals(msg) && pid == lpid)

{

handle= hwnd;

return false; //停止枚举

}

return true;//继续枚举

}), msgPtr);

return handle;

}

通过以上的方式,便可以获取我们想要的进程的主窗体句柄了

相关推荐

“你好”日语怎么说?怎么发音?
bt365备用网站

“你好”日语怎么说?怎么发音?

📅 08-13 👁️ 1095
湘H车牌的归属地是哪里?
365bet提款多久到

湘H车牌的归属地是哪里?

📅 09-25 👁️ 3847
a4纸是多少乘多少英寸
bt365备用网站

a4纸是多少乘多少英寸

📅 07-30 👁️ 5733
堆糖软件哪个好用
mobile365体育投注备用

堆糖软件哪个好用

📅 10-02 👁️ 8290
僵尸毁灭工程死鸟
365bet提款多久到

僵尸毁灭工程死鸟

📅 08-13 👁️ 4472
做一个论坛需要多少钱?
bt365备用网站

做一个论坛需要多少钱?

📅 09-23 👁️ 9499