C#环境下使用Windows消息传递字符串数据的研究
前言:
日前,师兄交给了我一个课题,将一个后台运行的Console程序,修改为WindowsForm程序,并在其界面上增加配置设置,以及运行记录。
原来的Console程序,后台运行的流程在其中一个类的函数里。我在我创建的主窗体上创建这个类的对象,然后执行它的函数。结果就遇到了一个问题,大部分需要记录下的运行记录,都是在这个类的函数中,而这个类怎么去访问我的主窗体上的RichTextBox呢?
我尝试了下设置RichTextBox为Public,结果还是不能在外面的类调用它,尝试设置WinForm为Static这种蠢方法,也只是使过程变得原来越复杂。
最后决定使用我最不想用的Windows消息方式(因为以前觉得比较麻烦)。虽然用的过程中有些存在风险,并且特别不专业,但是总之是达到了我想要的结果,也算是一个进步吧。
|
1
2
|
[DllImport("User32.dll", EntryPoint ="SendMessage")]privatestaticexternIntPtr SendMessage(inthWnd,intmsg, IntPtr wParam, IntPtr lParam); |
当然,在使用过程中要用到这个SendMessage,具体的使用方法,参照http://blog.sina.com.cn/s/blog_90b91bf10100zj77.html,虽然有点问题,但是大体上是正确的。
但是这个还不足以实现我的需求,因为我需要传递的是字符串,是string,而消息里面的两个参数wParam是IntPtr。在网上找了好一阵之后,发现这两篇文章很有指导意义:http://blog.csdn.net/lanruoshui/article/details/5432891和http://blog.csdn.net/lanruoshui/article/details/5432953(同一个人写的,两篇文章有关联,主要是第二篇)。
主体:
首先,发送端在声明API函数的时候,直接声明wParam和lParam为string(不知道这么做有没有风险,但是确实没有报错……而且管用)
|
1
2
3
4
|
[DllImport("User32.dll", EntryPoint ="SendMessage")]privatestaticexternIntPtr SendMessage(inthWnd,intmsg,stringwParam,stringlParam);[DllImport("User32.dll", EntryPoint ="FindWindow")]privatestaticexternintFindWindow(stringlpClassName,stringlpWindowName); |
然后,封装一个发送消息的函数SendMsgToMainForm,以便调用。这一部分与正常用法基本无异,需要注意封装的函数也需要修改参数属性为string。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//定义消息常数publicconstintCUSTOM_MESSAGE = 0X400 + 2;//自定义消息publicconstintCOMMAND_MESSAGE = 0X400 + 3;//指令消息//向窗体发送消息的函数publicvoidSendMsgToMainForm(intMSG,stringawParam,stringalParam){ intWINDOW_HANDLER = FindWindow(null, Factory.FormName); if(WINDOW_HANDLER == 0) { thrownewException("Could not find Main window!"); } SendMessage(WINDOW_HANDLER, MSG, awParam, alParam); //立即执行此消息 Application.DoEvents();} |
重点在接收端,也就是定义窗体的地方。使用string str = Marshal.PtrToStringAnsi(msg.WParam);//托管Marshal,把WParam托管为可以直接使用的string。这样一个字符串消息就传递过来了。调用窗体的WriteLog函数,来完成运行记录的记录。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
protectedoverridevoidWndProc(refSystem.Windows.Forms.Message msg){ stringstr = Marshal.PtrToStringAnsi(msg.WParam);//托管Marshal switch(msg.Msg) { caseICBC_BankChecking.CUSTOM_MESSAGE://处理消息 { this.WriteLog(str); } break; caseICBC_BankChecking.COMMAND_MESSAGE: { switch(str) { case"00": SetPage(true); break; } } break; default: base.WndProc(refmsg);//调用基类函数处理非自定义消息。 break; }} |
C#环境下使用Windows消息传递字符串数据的研究的更多相关文章
- Vmware ESX5i 环境下部署Windows Storage Server 2008 R2
ESX5i 环境下部署Windows Storage Server 2008 R2 Windows Storage Server 2008 这款产品微软早已发布,WSS2008是基于Win ...
- 在虚拟机linux环境下编译windows版adb fastboot
原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android ...
- Windows和linux环境下按文件名和字符串搜索命令
Windows 1.遍历C盘下所有txt 命令:for /r c:\ %i in (*.txt) do @echo %i 注释:for 循环的意思 /r 按照路径搜索 c:\ 路径 %i in ( ...
- 工作组环境下管理windows.
此处指的是windows7 1.防火墙设置 开启wmi,remote admin,防火墙远程管理 可以使用命令行 netsh advfirewall export "C:\temp\WFco ...
- VS IDE环境下,windows GUI(Qt MFC,win32)使用控制台实时打印调试信息
在工程属性的页面下,点击Build Events,在Build Events下点击Post-Build Event. 然后再Command Line里面输入以下命令: editbin /SUBSYST ...
- MingW环境下的windows编程
一般在进行windows编程时都使用vc++精简版,其插入菜单,图片等资源等更简单,且vc中对中文有更好的支持,win7下安装的Mingw中文并不能很好地显示,有光标显示的位置和光标实际位置不符的问题 ...
- 相同数据源情况下,使用Kafka实时消费数据 vs 离线环境下全部落表后处理数据,结果存在差异
原因分析: 当某个consumer宕机时,消费位点(例如2s提交一次)尚未提交到zookeeper,此时Kafka集群自动rebalance后另一consumer来接替该宕机consumer继续消费, ...
- Ubuntu环境下TensorBoard 可视化 不显示数据问题 No scalar data was found...(作者亲测有效)(转)
TensorBoard:Tensorflow自带的可视化工具.利用TensorBoard进行图表可视化时遇到了图表不显示的问题. 环境:Ubuntu系统 运行代码,得到TensorFlow的事件文件l ...
- 关于在phpStudy环境下,windows cmd中 php不是内部命令问题
首先查看system32是否加入系统变量 其次要把当前运行的php版本的路径加入到系统变量中去,path中, 一定要是这个样子的: D:\phpStudy\php\php-5.6.27-nts 不然没 ...
随机推荐
- 弹框&可用于判断
较常用的弹框:(3种) 1.prompt("显示用户的文本","输入域的默认值"): print();显示打印的对话框: find();显示查找的对话框: (用 ...
- 无法定位程序输入点到_ftol2于动态链接库msvcrt.dll的错误的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 今天同事在Windows XP系统上运行程序遇到这样一个错误: 我试了一下,在Win7上运行则没有这个错误.只是程序运 ...
- HTTPS与SSL(二)
CA Ca介绍 电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系 ...
- web安全防御之RASP技术
作者: 我是小三 博客: http://www.cnblogs.com/2014asm/ 由于时间和水平有限,本文会存在诸多不足,希望得到您的及时反馈与指正,多谢! 0x00:we ...
- font:inherit
font:inherit 字体的设置 设置所有元素的字体保持一致: 所有元素:*{font:inherit;} /* IE8+ */ body体用percent:body{font:100%/1 sa ...
- nginx学习书籍推荐
最好的书是源码 深入理解NGINX" 陶辉著 <实战Nginx...>张宴 <深入理解Nginx:模块开发与架构解析> nginx开发从入门到精通 Nginx HTT ...
- 基于jeesit下的工作流开发步骤
首先jeesit是开源的OA系统,采用的框架是springMVC和mybatis,采用shiro安全验证. 1.新建流程所属表: 在数据库新建所需工作流的表之后,登录jeesit系统,在“代码生成”- ...
- UVA 11040 Add bricks in the wall(线性组合)
砖块上的数字最终都可以看作是最后一行的线性组合,独立变元最多9个. 这类题的一般做法,线性组合都可以列出方程然后高斯消元. 对于这道题,只要确定最后一行剩下的4个变量就好了,对于最后一行的j位置,它对 ...
- POJ 3281 Dining(网络流最大匹配)
分析: 数学模型是三个集合A,B,C,(a,b,c)构成一个匹配.因为图一个点只能匹配一次,把a拆点a',a", 在可以匹配的点上连边,s - b - a' - a" - c - ...
- URL Schemes 不能识别和不能跳转的原因
在app跳转的过程中 需要设置url schemes后,但是设置完后,却不能识别, (测试方式:URL scheme + ://)在浏览器中打开,如果能打开app,就是能跳转 今天遇到了一个坑爹的问题 ...