前言:

日前,师兄交给了我一个课题,将一个后台运行的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/5432891http://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消息传递字符串数据的研究的更多相关文章

  1. Vmware ESX5i 环境下部署Windows Storage Server 2008 R2

    ESX5i 环境下部署Windows Storage Server 2008 R2       Windows Storage Server 2008 这款产品微软早已发布,WSS2008是基于Win ...

  2. 在虚拟机linux环境下编译windows版adb fastboot

    原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android ...

  3. Windows和linux环境下按文件名和字符串搜索命令

    Windows 1.遍历C盘下所有txt 命令:for /r c:\ %i in (*.txt) do @echo %i 注释:for 循环的意思 /r 按照路径搜索 c:\ 路径 %i in   ( ...

  4. 工作组环境下管理windows.

    此处指的是windows7 1.防火墙设置 开启wmi,remote admin,防火墙远程管理 可以使用命令行 netsh advfirewall export "C:\temp\WFco ...

  5. VS IDE环境下,windows GUI(Qt MFC,win32)使用控制台实时打印调试信息

    在工程属性的页面下,点击Build Events,在Build Events下点击Post-Build Event. 然后再Command Line里面输入以下命令: editbin /SUBSYST ...

  6. MingW环境下的windows编程

    一般在进行windows编程时都使用vc++精简版,其插入菜单,图片等资源等更简单,且vc中对中文有更好的支持,win7下安装的Mingw中文并不能很好地显示,有光标显示的位置和光标实际位置不符的问题 ...

  7. 相同数据源情况下,使用Kafka实时消费数据 vs 离线环境下全部落表后处理数据,结果存在差异

    原因分析: 当某个consumer宕机时,消费位点(例如2s提交一次)尚未提交到zookeeper,此时Kafka集群自动rebalance后另一consumer来接替该宕机consumer继续消费, ...

  8. Ubuntu环境下TensorBoard 可视化 不显示数据问题 No scalar data was found...(作者亲测有效)(转)

    TensorBoard:Tensorflow自带的可视化工具.利用TensorBoard进行图表可视化时遇到了图表不显示的问题. 环境:Ubuntu系统 运行代码,得到TensorFlow的事件文件l ...

  9. 关于在phpStudy环境下,windows cmd中 php不是内部命令问题

    首先查看system32是否加入系统变量 其次要把当前运行的php版本的路径加入到系统变量中去,path中, 一定要是这个样子的: D:\phpStudy\php\php-5.6.27-nts 不然没 ...

随机推荐

  1. CSS文档优化

    首先了解下CSS的渲染逻辑,它是从标记的最后一位开始搜索的,例如:.myclass li a,首选它会遍历所有的<a>,然后看哪些<a>之前有<li>,然后再看哪些 ...

  2. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解

    1.(function($){...})(jQuery); (1).原理:       这实际上是匿名函数,如下: function(arg){...} 这就定义了一个匿名函数,参数为arg:而调用函 ...

  3. 原生css3作响应式布局

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. PHP中XML和数组互相转换的方法

    转换代码如下 //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=&g ...

  5. Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单

    如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ...

  6. linux中配置yum源

    1.配置163或者阿里云yum源: 阿里云yum源地址:https://mirrors.aliyun.com/centos/6.9/os/x86_64/Packages/ 阿里云给出的解决办法:htt ...

  7. WebAPI项目添加定时服务

    开发平台: VS2019 背景: 在开发小程序的API服务的时候,由于access_token的有效期为7200秒,也就是2小时,这就需要后端定时的去更新这个access_token,便于调用小程序的 ...

  8. @Valid的坑

    @Valid 只能用来验证 @RequestBody 标注的参数,并且要写在 @RequestBody 之前

  9. UVA 11404 Plalidromic Subsquence (回文子序列,LCS)

    最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度, 要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=le ...

  10. Ubuntu解决winscp连接不上虚拟机问题

    前几天在配置虚拟机的时候,尝试用winscp连接Ubuntu,结果连接被拒绝.原因:Ubuntu的ssh服务需要自己安装和启动,在没启动之前,是无法连接上去的 解决方案: 我们可以输入:ssh loc ...