BOOL EnumThreadWindows(DWORD dwThreadId,
    WNDENUMPROC lpfn,
    LPARAM lParam
);在这个API函数中,第一个参数是指线程ID还是指进程ID呢,因为不管是线程还是进程都可能有窗口的

解决方案 »

  1.   

    http://baike.baidu.com/view/1080309.html?fromTaglisthttp://www.webtropy.com/articles/art9-1.asp?f=EnumThreadWindowshttp://www.webtropy.com/articles/art9-1.asp?f=EnumThreadWindows
      

  2.   

    BOOL EnumThreadWindows(DWORD dwThreadId,楼主脑残,鉴定完毕!
      

  3.   

    [DllImport("user32.dll")]
    public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam);
    dwThreadld:标识将被列举窗口的线程。
    lpfn:指向一个应用程序定义的回调函数指针
      

  4.   

    那如果我知道的是进程的ID,而不是线程的ID,那我有没有办法获取窗口的句柄呢,请大家多多指点啊
      

  5.   

    http://topic.csdn.net/u/20100315/18/b7ea1520-89b3-4ec8-aa32-2a79da5f530b.html枚举所有的进程,通过比较Process.ID,也就是进程ID就可以确定是你想找的进程,然后获取Process.MainWindowHandle就是你想获取的窗口句柄
      

  6.   

    这个进程的进程名为“winlogon”,但是我发现Process.MainWindowHandle为0,
    是不是说明它没有窗口句柄了?它明明是一个窗口,怎么会没有窗口句柄呢?
      

  7.   

    winlogon不是系统进程吗?
    Process.MainWindowHandle为0,说明它要么没有主窗体,要么就是权限不够,无法获取.
      

  8.   

    是不是系统进程就没有主窗体的,我这个winlogon,是在用webbrowser访问路由器页面时弹出来的登陆窗口来的
    this.webbrowser.url = new Uri("http://192.168.1.1");
    然后就弹出那个登陆窗口了,此窗口的进程名正是winlogon
      

  9.   


    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, "窗体的标题"); 这个简单