C#使用线程ID获取指针

时间:2015-04-21 09:44:30

标签: c# multithreading dll dllimport handle

EDIT3: 我需要一个线程所有窗口的列表。不是FindWindowsEnum(),因为它只返回顶级Windows ....我需要窗口句柄,因为它是可见的 END EDIT3

EDIT2: 简短说明:我需要一个方法,我可以从一个线程获得一个“窗口句柄”。

END EDIT2:

编辑: 首先,我不能使用FindWindowsEnum()! 因为它只返回顶部窗口。我必须杀死窗口,因为它是可见的。所以我必须通过线程ID获取窗口的句柄。 编辑结束:

我遇到了一个问题,我必须关闭一个没有聚焦的窗口或类似的东西。弹出窗口时我必须关闭窗口。我只使用代码。

我得到了什么:

这是extern类,我导入一个dll和一些使用dll函数的函数。

    class FindWindowApi
{
    //[DllImport("user32.dll", SetLastError = true)]
    //public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    public IntPtr[] GetWindowHandlesForThread(int threadHandle)
    {
        _results.Clear();
        EnumWindows(WindowEnum, threadHandle);
        return _results.ToArray();
    }

    public  delegate int EnumWindowsProc(IntPtr hwnd, int lParam);

    [DllImport("user32.Dll")]
    public static extern int EnumWindows(EnumWindowsProc x, int y);

    public List<IntPtr> _results = new List<IntPtr>();

    public int WindowEnum(IntPtr hWnd, int lParam)
    {

        _results.Add(hWnd);
        return 1;
    }


    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int GetWindowText(
        IntPtr handle,
        [MarshalAs(UnmanagedType.LPWStr)] StringBuilder caption,
        int count);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int GetWindowTextLength(IntPtr handle);

    public const UInt32 WM_CLOSE = 0x0010;
}

在这个班级我使用extern类的函数。

我启动一个每10毫秒运行一次的线程并用另一种方法杀死一个窗口。

    public Disk_UC()
    {
        InitializeComponent();
        Thread killit = new Thread(this.killIt);
        killit.Start();
        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
        comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;
        Thread nt = new Thread(this.fillData);
        nt.Start();

    }

    //Thread Method
    private void killIt()
    {
        bool blac = false;
        Int32 oldThreadID = threadID;
        FindWindowApi api = new FindWindowApi();
        while ((!blac) 
            && (!MainDiag.isGoingDown))
        {
            if (oldThreadID != threadID)
            {

                IntPtr[] windows = api.GetWindowHandlesForThread(threadID);
                if (windows != null && windows.Length > 0)
                    foreach (IntPtr hWnd in windows)
                    {
                        killWindow(hWnd, threadID);
                    }

            }
            Thread.Sleep(10);
        }
    }   

    //Method which calls all the extern dll stuff
    private bool killWindow(IntPtr handle, int param)
    {
        var length = FindWindowApi.GetWindowTextLength(handle);
        var caption = new StringBuilder(length + 1);
        FindWindowApi.GetWindowText(handle, caption, caption.Capacity);

        IntPtr windowPtr = FindWindowApi.FindWindowByCaption(IntPtr.Zero, caption.ToString());
        if (windowPtr == IntPtr.Zero)
        {
            return false;
        }
        FindWindowApi.SendMessage(windowPtr, FindWindowApi.WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        return true;
    }

我现在的问题是如何才能获得这个特定的窗口句柄。 当线程“fillData”弹出窗口时。所以我从这个Thread fillData中保存了线程ID。

现在我用这个线程id调用其他方法。我得到了线程ID,我从进程中获得了很多窗口。但是我需要来自那个帖子的这个特定窗口。

0 个答案:

没有答案