当前位置: 首页 > article >正文

如何发送一个指令给另外一个进程[进程通信2]

上一篇文章讲的是如何用Windows API去控制其他进程的显示,这次主要说的是一个应用程序如何如何获得指令并执行一系列的内部操作。如最大化,最小化等。


为什么要对消息进行转化处理?

因为Windows API只支持string类型的参数传递,所以在应用程序中对string进行转化,转化成进程可以识别的类型。


Scenario: 

1. 用户发送指令给另外一个进程

2. 另外一个应用程序接收指令并做相应处理


----------------------------------------------------- 消息转化 开始----------------------------------------------------- 

using System;//[assembly: System.Runtime.InteropServices.ComVisible(false)]
[assemblyCLSCompliant(false)]
namespace SDK
{public class CMDParameters{static UIArtifact Command { getset; }/// <summary>/// Parse command line arguments./// </summary>/// <param name="args">command line arguments</param>/// <returns>True if parse ok, false means print help message only.</returns>public static UIArtifact ParseParameters(string[] args){Command = new UIArtifact();            #region parse command line parametersfor (int i = 0; i < args.Length; i++){string arg = args[i];string candidateArg = string.Empty;bool isSwitch = false;// normalize argumentif (arg.StartsWith("/") || arg.StartsWith("-")){isSwitch = true;int index = arg.IndexOf(":");if (index != -1){candidateArg = arg.Substring(index + 1);arg = arg.Substring(0, index);}}arg = arg.ToLower();// if it is a switch argumentif (isSwitch){   // parse argument by argument matchParseArguments(arg, candidateArg);}}return Command;
            #endregion}/// <summary>/// Parse command line arguments./// </summary>/// <param name="args">command line arguments</param>/// <returns>True if parse ok, false means print help message only.</returns>public static UIArtifact ParseParameters(string args){
            #region parse command line parametersstring[] newargs = args.Split(new Char[] { ' ' });return ParseParameters(newargs);
            #endregion}private static bool ArgumentMatch(string arg, string formal){return ArgumentMatch(arg, formal, true);}/// <summary>/// Provides two match kinds:/// extra match: argu == formal./// short-form match: argu is a char and equals to formal's first char./// argu is striped from command line arg, without '/' or '-'/// </summary>/// <param name="arg">the command line argument which starts with '/' or '-'</param>/// <param name="formal">the expected argument string</param>/// <param name="exactMatch">true means exact match mode, false means short-form match</param>/// <returns>true if argument matches, else false.</returns>private static bool ArgumentMatch(string arg, string formal, bool exactMatch){if ((arg[0] == '/') || (arg[0] == '-')){arg = arg.Substring(1);if (arg == formal){return true;}else if (!exactMatch && arg.Length == 1){return (arg[0] == formal[0]);}}return false;}private static void WriteHelpMessage(){Console.WriteLine(String.Format("Help PTMC",System.Reflection.Assembly.GetExecutingAssembly().GetName().Name));}private static void ParseArguments(string arg, string candidateArg){if (ArgumentMatch(arg, "?") || ArgumentMatch(arg, "help")){WriteHeader();WriteHelpMessage();}else if (ArgumentMatch(arg, "v") || ArgumentMatch(arg, "visible")){if (!string.IsNullOrEmpty(candidateArg.Trim())){bool isSucess = false;if (bool.TryParse(candidateArg, out isSucess)){Command.IsShowInWindow = isSucess;}}}else if (ArgumentMatch(arg, "t") || ArgumentMatch(arg, "tablepage")){if (!string.IsNullOrEmpty(candidateArg.Trim())){UIView.Tab tab;bool isSucess = Enum.TryParse(candidateArg.Trim(), trueout  tab);if (isSucess){switch (tab){case UIView.Tab.Review:Command.TabPage = UIView.Tab.Review;break;case UIView.Tab.Scheduling:Command.TabPage = UIView.Tab.Scheduling;break;case UIView.Tab.Reporting:Command.TabPage = UIView.Tab.Reporting;break;case UIView.Tab.Quality:Command.TabPage = UIView.Tab.Quality;break;case UIView.Tab.Administration:Command.TabPage = UIView.Tab.Administration;break;case UIView.Tab.None:Command.TabPage = UIView.Tab.None;break;}}}}else if (ArgumentMatch(arg, "c") || ArgumentMatch(arg, "cluster")){if (!string.IsNullOrEmpty(candidateArg.Trim())){int cluster = 0;if (int.TryParse(candidateArg.Trim(), out cluster)){Command.Cluster = cluster;}}}else if (ArgumentMatch(arg, "p") || ArgumentMatch(arg, "protocolname")){if (!string.IsNullOrEmpty(candidateArg.Trim())){Command.ProtocolName = candidateArg.Trim();}}else if (ArgumentMatch(arg, "f") || ArgumentMatch(arg, "folder")){if (!string.IsNullOrEmpty(candidateArg.Trim())){if (!string.IsNullOrEmpty(candidateArg.Trim())){Command.FolderPath = candidateArg.Trim();}}}else if (ArgumentMatch(arg, "fresh")){bool isSucess = false;if (bool.TryParse(candidateArg, out isSucess)){Command.Isfresh = isSucess;}}else if (ArgumentMatch(arg, "close")){bool isSucess = false;if (bool.TryParse(candidateArg, out isSucess)){Command.IsClose = isSucess;}}else if (ArgumentMatch(arg, "cmd") || ArgumentMatch(arg, "command")){if (!string.IsNullOrEmpty(candidateArg.Trim())){UIView.Command command;bool isSucess = Enum.TryParse(candidateArg.Trim(), trueout  command);if (isSucess){switch (command){case UIView.Command.FileCommons:Command.Command = UIView.Command.FileCommons;break;case UIView.Command.ReviewRequest:Command.Command = UIView.Command.ReviewRequest;break;case UIView.Command.None:Command.Command = UIView.Command.None;break;}}}}else{throw new Exception("[ERROR] Invalid switch: " + arg);}}}public class UIArtifact{private PTMCHostBase windowInfo;public PTMCHostBase WindowInfo{get{if (windowInfo == null){windowInfo = new PTMCHostBase();}return windowInfo;}set{windowInfo = value;}}public bool? IsShowInWindow { getset; }public bool Isfresh { getset; }public bool? IsClose { getset; }public UIView.Tab TabPage { getset; }public UIView.Command Command { getset; }public int Cluster { getset; }public string ProtocolName { getset; }public string FolderPath { getset; }}public class UIView{public enum Tab{None = 0x00,Quality,Review,Scheduling,Reports,Reporting,Administration,}public enum Command{None = 0x00,ReviewRequest,FileCommons,}public enum AppWindowName{}}public class PTMCHostBase{public bool isShowInWindow { getset; }public bool isShowInTaskBar { getset; }public IntPtr IntPtr { getset; }public string WindowName { getset; }public string WindowClassName { getset; }}
}


----------------------------------------------------- 消息转化 结束----------------------------------------------------- 


----------------------------------------------------- 初始化 必要接口----------------------------------------------------- 

/// 在程序初始化的时候进行第一遍的消息处理
private  void XXX(){

        string[] cmd = System.Environment.GetCommandLineArgs();

            UIArtifact command = CMDParameters.ParseParameters(cmd);

            // MessageBox.Show(command.isShowInWindow.ToString());

            ShowWindow(command);
	}

    	private void RibbonWindow_Loaded(object sender, RoutedEventArgs e){this.InitialHook();}

        private void InitialHook(){(PresentationSource.FromVisual(thisas HwndSource).AddHook(new HwndSourceHook(this.WndProc));}private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){
	    // 在其他进程需要的时候进行消息处理
            if (msg == NativeMethodsExtensibility.WM_COPYDATA)            {                NativeMethodsExtensibility.COPYDATASTRUCT cds = (NativeMethodsExtensibility.COPYDATASTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(NativeMethodsExtensibility.COPYDATASTRUCT));                if (!string.IsNullOrEmpty(cds.lpData))                {                    UIArtifact command = CMDParameters.ParseParameters(cds.lpData);                    // MessageBox.Show(cds.lpData); //测试返回消息                    // ShowWindow(command);//对返回消息进行处理                }            }            return hwnd;        }

----------------------------------------------------结束初始化 必要接口----------------------------------------------------- 


http://www.lryc.cn/news/2413795.html

相关文章:

  • DSPTMS320F28335入门
  • 网易163邮箱和网易126邮箱有什么区别?
  • ListView的优化
  • 基于Nexus3搭建Maven私服
  • C#中e.Cancel,e.Handled的区别与应用
  • 《异域狂想曲》官方秘籍
  • 沸点网络电视 v3.2 官方版
  • 《小强与小明》——正在疯传的伟大的故事
  • WorldView卫星家族简介
  • 北京大气污染PM2.5预测(LSTM)
  • 《安卓最佳免费应用》
  • Windows Hook 易核心编程(4) API Hook 续 拦截API
  • 非常全面的DolphinScheduler(海豚调度)安装使用文档
  • Redhat Linux 9/AS 3上安装清华紫光拼音输入法智能五笔全拼等
  • 网络速度变慢的常见23种解决方法
  • A start job is running for /etc/rc.d/rc.local ... ... no limit
  • 微云秒点七级图标。
  • 十六条超炫代码让你的QQ空间改头换面(转)
  • 应用本地数据库
  • 嗜血法医第一二三季/Dexter全集迅雷下载
  • 梦幻西游默认服务器怎么修改器,梦幻西游古龙服务端安装教程
  • vs2008在打了SP1补丁后编译版本不匹配,导致“应用程序配置不正确,应用程序未能启动
  • java移位操作_java 移位运算
  • 春节灯谜及答案
  • 探秘雀魂智能助手:majsoul_wrapper项目深度剖析
  • SQuirrel SQL Client数据库连接工具的配置与使用
  • 精品PHP实现的博客网站的设计与实现
  • android权限(permission)大全
  • 1kb病毒解决方案
  • u盘低级格式化数据怎么恢复,u盘低级格式化还能恢复吗