WinForm 关于任务栏图标进程结束后图标无法自动清除的问题!
2021-03-22 21:26
标签:数据 内存 有一个 span 标题 .text hal encoding pst 最近在做一个项目,有2个进程,A进程需要定时把B进程强行kill掉,然后再启动,当时这样会有一个问题,就是强行kill掉的进程在任务栏的托盘图标不会自动消失,必须用鼠标经过那个位置才会消失。这样就导致事件久了,任务栏出现一大堆图标,非常影响形象。 后来网上看到一个方法,说是通过进程间的通讯,就是由A发送通知给B,告诉B应该要退出程序了,然后由B自己来结束进程,这样任务栏的图标才会正常的消失。废话少说,直接看代码吧: 对于A进程来说,需要先找到B进程的句柄,然后才能给它发送通知,代码如下: 我这个函数是根据进程的窗体标题来查找的,因为我的标题都是一个固定的端口号,所以按这种方式来做,当然也可以根据进程名称来做,在这里就不举例了。 这里用到了Windows的API函数: SendMessage , 要引用这个函数,必须事先做以下的声明才能使用: 消息结构体: 声明要引用的API函数: ------------------------------------------------------------------------------------------------------------------------------------------------------- 那么对于B进程来说,需要做的事情就是接收A进程发来的消息,根据消费的内容来做出对应的动作, 只要重载 DefWndProc 函数即可实现消息的接收处理,代码如下: 在B进程退出前,只要把 NotifyIcon.Dispose() , 那么任务栏托盘图标就会自动消失了。 WinForm 关于任务栏图标进程结束后图标无法自动清除的问题! 标签:数据 内存 有一个 span 标题 .text hal encoding pst 原文地址:https://www.cnblogs.com/lpq21314/p/9475325.html///
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32", EntryPoint = "GetWindowThreadProcessId")]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int pid);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
const int WM_COPYDATA = 0x004A;
///
上一篇:WinForm 的定时器使用
下一篇:c# linq 汇总
文章标题:WinForm 关于任务栏图标进程结束后图标无法自动清除的问题!
文章链接:http://soscw.com/index.php/essay/67676.html