[DllImport("user32.dll")] public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam); dwThreadld:标识将被列举窗口的线程。 lpfn:指向一个应用程序定义的回调函数指针
是不是系统进程就没有主窗体的,我这个winlogon,是在用webbrowser访问路由器页面时弹出来的登陆窗口来的 this.webbrowser.url = new Uri("http://192.168.1.1"); 然后就弹出那个登陆窗口了,此窗口的进程名正是winlogon
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading;namespace ExitApp { public class ExitApp { private const UInt32 WM_CLOSE = 0x0010; public delegate bool EnumThreadDelegate (IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll")] static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [STAThread] static void Main(string[] args) { string processName; // Find process. Process[] p = Process.GetProcessesByName(args[0]); if (p.Length > 0) { foreach(Process proc in p) { // Check if main window exists. If the window is minimized to the tray this might be not the case. if (proc.MainWindowHandle == IntPtr.Zero) { // Try closing application by sending WM_CLOSE to all child windows in all threads. foreach (ProcessThread pt in proc.Threads) { EnumThreadWindows((uint) pt.Id, new EnumThreadDelegate(ExitApp.EnumThreadCallback), IntPtr.Zero); } } else { // Try to close main window. if(proc.CloseMainWindow()) { // Free resources used by this Process object. proc.Close(); } } } } } static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam) { // Close the enumerated window.
public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam);
dwThreadld:标识将被列举窗口的线程。
lpfn:指向一个应用程序定义的回调函数指针
是不是说明它没有窗口句柄了?它明明是一个窗口,怎么会没有窗口句柄呢?
Process.MainWindowHandle为0,说明它要么没有主窗体,要么就是权限不够,无法获取.
this.webbrowser.url = new Uri("http://192.168.1.1");
然后就弹出那个登陆窗口了,此窗口的进程名正是winlogon
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;namespace ExitApp
{
public class ExitApp
{
private const UInt32 WM_CLOSE = 0x0010; public delegate bool EnumThreadDelegate (IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll")]
static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [STAThread]
static void Main(string[] args)
{
string processName; // Find process.
Process[] p = Process.GetProcessesByName(args[0]); if (p.Length > 0)
{
foreach(Process proc in p)
{
// Check if main window exists. If the window is minimized to the tray this might be not the case.
if (proc.MainWindowHandle == IntPtr.Zero)
{
// Try closing application by sending WM_CLOSE to all child windows in all threads.
foreach (ProcessThread pt in proc.Threads)
{
EnumThreadWindows((uint) pt.Id, new EnumThreadDelegate(ExitApp.EnumThreadCallback), IntPtr.Zero);
}
}
else
{
// Try to close main window.
if(proc.CloseMainWindow())
{
// Free resources used by this Process object.
proc.Close();
}
}
}
}
} static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam)
{
// Close the enumerated window.
//这里的hWnd就是子窗体的句柄 PostMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); return true;
}
}
}
[DllImport("User32.dll")]
private extern static int FindWindow(string lpClassName, string lpWindowName);
int fhwnd;
fhwnd = FindWindow(null, "窗体的标题"); 这个简单