C# 多个程序实例只允许一个及进程间通信sendMessage
来源:互联网 发布:上海微创软件怎么样 编辑:程序博客网 时间:2024/06/07 15:31
发送方:
static class Program
{
#region 只运行一个实例
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//遍历与当前进程名称相同的进程列表 foreach (Process process in processes) { //Ignore the current process if (process.Id != current.Id) { //Make sure that the process is running from the exe file. if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) { //Return the other process instance. //MessageBox.Show("已经有了!"); return process; } } } return null; } #endregion [DllImport("User32.dll")] private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow); [DllImport("User32.dll")] private static extern bool SetForegroundWindow(System.IntPtr hWnd); private static void HandleRunningInstance(Process instance) { //MessageBox.Show("该应用系统已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); ShowWindowAsync(instance.MainWindowHandle, 1); //调用api函数,正常显示窗口 SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端。 } #region sendMessage [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } //Win32 API函数: [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int msg, int wP, ref COPYDATASTRUCT lParam); private const int WM_COPYDATA = 0x004A; #endregion public static bool SendString(IntPtr hWnd, string str) { try { byte[] sarr = System.Text.Encoding.Default.GetBytes(str); var ptr = Marshal.StringToHGlobalUni(str); COPYDATASTRUCT cds = new COPYDATASTRUCT(); cds.dwData = ptr; cds.cbData = sarr.Length; cds.lpData = Marshal.AllocHGlobal(sarr.Length); Marshal.Copy(sarr, 0, cds.lpData, sarr.Length); SendMessage(hWnd, WM_COPYDATA, 0, ref cds); //MessageBox.Show("我在sendMesasage后"); return true; } catch (Exception e) { return false; } } /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] path) { //MessageBox.Show("我在这儿"+path.Length); Process instance = RunningInstance(); if (instance == null) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //MessageBox.Show("我在这儿null"); Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CurrentCulture; ChineseStringLocalizer.Register(); Localizer.SetStringLocalizer(new ChineseStringLocalizer()); var catalog = new TypeCatalog( typeof(SettingsService), typeof(CommandService), typeof(StatusService), typeof(ControlHostService), typeof(StandardFileExitCommand), typeof(DocumentRegistry), typeof(ContextRegistry), typeof(DefaultTabCommands), typeof(MyOutputs), // passes messages to all log writers typeof(ResFileInfo), typeof(FileTreeView), typeof(FolderViewer), typeof(ResListView), //typeof(ShortcutKey), typeof(FileViewer), typeof(MyOutputService), typeof(Editor) //,typeof(StandardEditCommands) ); var container = new CompositionContainer(catalog); var toolStripContainer = new ToolStripContainer(); var mainForm = new ResCopyTool.MainForm(toolStripContainer) { Text = "美术资源移动工具".Localize(), Icon = GdiUtil.CreateIcon(ResourceUtil.GetImage(Sce.Atf.Resources.AtfIconImage)) }; var batch = new CompositionBatch(); //MessageBox.Show("我是窗口"+path); mainForm.Args = path; batch.AddPart(mainForm); //batch.AddPart(new WebHelpCommands("http://192.168.2.121:8090/pages/viewpage.action?pageId=14745613".Localize())); container.Compose(batch); container.InitializeAll(); Application.Run(mainForm); container.Dispose(); } else { //MessageBox.Show("我在这儿not null"); HandleRunningInstance(instance); IntPtr hWnd = instance.MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄 SendString(hWnd, path[0]); instance.Start(); } }
接收方:
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
//Win32 API函数: [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int msg, int wP, ref COPYDATASTRUCT lParam); private const int WM_COPYDATA = 0x004A; protected override void DefWndProc(ref Message m) { switch (m.Msg) { //接收自定义消息MYMESSAGE,并显示其参数 case WM_COPYDATA: { //MessageBox.Show("我在收到 sendMesasage前"); //My_lParam a = new My_lParam(); ////Type t = a.GetType(); //a = (My_lParam)m.GetLParam(typeof(My_lParam)); //Marshal.PtrToStringAnsi(m.LParam) //this.textBox1.Text = a.s[0]; COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); //this.textBox1.Text = Marshal.PtrToStringUni(mystr.lpData);Marshal. byte[] bt = new byte[mystr.cbData]; Marshal.Copy(mystr.lpData, bt, 0, bt.Length); string tmp = System.Text.Encoding.Default.GetString(bt); m_args[0] = tmp; //MessageBox.Show("我在收到 sendMesasage后"); OnReceiveMsgChanged.Raise(this, new OnReceiveMsgArgs(tmp)); } break; default: base.DefWndProc(ref m); break; } }
0 0
- C# 多个程序实例只允许一个及进程间通信sendMessage
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C# 程序只允许运行一个实例的正确代码
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C# Winform程序只允许运行一个实例
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- C#程序只允许运行一个实例的解决方案
- 只允许启动个一个进程
- C#只允许启动一个WinFrom进程
- C#只允许启动一个进程
- C#只允许启动一个WinFrom进程
- 《Android xml文件中转移字符的使用》
- Ubuntu 14.04 降低硬盘转速,减少硬盘发热量
- 如何利用JavaScript 在页面间传值
- 我了解的Wcf
- android studio导入aar文件
- C# 多个程序实例只允许一个及进程间通信sendMessage
- Java提高篇——对象克隆
- 导航栏下拉至一定高度后固定在顶部的特效
- C#.NET里面抽象类和接口有什么区别
- 欢迎使用CSDN-markdown编辑器
- 各大博客汇总
- mysql 数据库优化
- 【jQuery】图片上传回显
- LBS