c# 通过窗口名字关闭窗口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 通过窗口名字关闭窗口相关的知识,希望对你有一定的参考价值。
怎么实现呢?不好意思,新手不怎么熟悉。
窗口的名称是一个字符,而不是如一楼那样,那个名称已经是一个form型的对象了。
EnumWindows 方法用来枚举所有的窗口,并对每个窗口回调一个指定的方法。然后在这个回调方法中调用 GetWindowTextLength 和 GetWindowText 来获取窗口标题。将这个标题和要找的比较,如果一致,就用 SendMessage 发送一个 WM_CLOSE 的消息将其关闭。
这里有个问题,就是 EnumWindows 方法是枚举当前系统中所有的窗口(不是当前进程的也会被选出来。当其他进程的标题也是要找的话,就有问题了)(如果没记错的话)!所有楼主可以看看还有没有其他的 API。这个找 MSDN 比较好找的说
具体实现:
[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern int GetWindowTextLength(IntPtr hWnd);
private delegate bool EnumWindowProcDelegate(IntPtr hwnd, int lParam);
[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowProcDelegate proc, int lParam);
[DllImport("user32.dll"]
public static extern IntPtr SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
private void foo()
EnumWindows(new EnumWindowProcDelegate(enum_proc), 0);
private bool enum_proc(IntPtr hwnd, int lParam)
int length;
length = GetWindowTextLength(hwnd) + 1;
StringBuilder buffer = new StringBuilder(length);
GetWindowText(hwnd, buffer, length);
if (buffer.ToString() == "MyForm1")
SendMessage(hwnd, 16, 0, 0);
return false;
return true;
===================================
当然另外还有不像这么复杂的方法:
1. 你从 System.Windows.Forms.Form 类继承一个自己的类。比如叫 MyBaseForm
2. 这个 MyBaseForm 基本上和 Form 完全一样,它的作用只是将标题保存到一个全局的地方,比如 MyBaseForm.__registeredForms 里面
3. 然后这个 Win-Form 里面的所有窗口都从这个 MyBaseForm 继承
4. 这样要查找的时候,直接到那个 MyBaseForm.__registeredForms 里面找就行了,呵呵 参考技术A 我关闭的时候,是按窗体的名称
例如: frmMain.Close();
c#关闭窗口怎么强制退出所有运行的线程
将线程的isbauckground设置为true当住线程关闭时(也就是推出程序时),其他线程将自动关闭 参考技术A 调用线程的KILL方法即可。
thread.kill(); 参考技术B thread.kill().
如果可以最好在线程中加入同步信号,根据信号判断决定是否退出,这样比较安全。 参考技术C Thread.kill();
退出时运行这个方法.就结束掉所有的线程了.
以上是关于c# 通过窗口名字关闭窗口的主要内容,如果未能解决你的问题,请参考以下文章