C#环境下使用Windows消息传递字符串数据的研究
前言:
日前,師兄交給了我一個課題,將一個后臺運行的Console程序,修改為WindowsForm程序,并在其界面上增加配置設(shè)置,以及運行記錄。
原來的Console程序,后臺運行的流程在其中一個類的函數(shù)里。我在我創(chuàng)建的主窗體上創(chuàng)建這個類的對象,然后執(zhí)行它的函數(shù)。結(jié)果就遇到了一個問題,大部分需要記錄下的運行記錄,都是在這個類的函數(shù)中,而這個類怎么去訪問我的主窗體上的RichTextBox呢?
我嘗試了下設(shè)置RichTextBox為Public,結(jié)果還是不能在外面的類調(diào)用它,嘗試設(shè)置WinForm為Static這種蠢方法,也只是使過程變得原來越復(fù)雜。
最后決定使用我最不想用的Windows消息方式(因為以前覺得比較麻煩)。雖然用的過程中有些存在風(fēng)險,并且特別不專業(yè),但是總之是達到了我想要的結(jié)果,也算是一個進步吧。
| 12 | [DllImport("User32.dll", EntryPoint ="SendMessage")]privatestaticexternIntPtr SendMessage(inthWnd,intmsg, IntPtr wParam, IntPtr lParam); |
當(dāng)然,在使用過程中要用到這個SendMessage,具體的使用方法,參照http://blog.sina.com.cn/s/blog_90b91bf10100zj77.html,雖然有點問題,但是大體上是正確的。
但是這個還不足以實現(xiàn)我的需求,因為我需要傳遞的是字符串,是string,而消息里面的兩個參數(shù)wParam是IntPtr。在網(wǎng)上找了好一陣之后,發(fā)現(xiàn)這兩篇文章很有指導(dǎo)意義:http://blog.csdn.net/lanruoshui/article/details/5432891和http://blog.csdn.net/lanruoshui/article/details/5432953(同一個人寫的,兩篇文章有關(guān)聯(lián),主要是第二篇)。
主體:
首先,發(fā)送端在聲明API函數(shù)的時候,直接聲明wParam和lParam為string(不知道這么做有沒有風(fēng)險,但是確實沒有報錯……而且管用)
| 1234 | [DllImport("User32.dll", EntryPoint ="SendMessage")]privatestaticexternIntPtr SendMessage(inthWnd,intmsg,stringwParam,stringlParam);[DllImport("User32.dll", EntryPoint ="FindWindow")]privatestaticexternintFindWindow(stringlpClassName,stringlpWindowName); |
然后,封裝一個發(fā)送消息的函數(shù)SendMsgToMainForm,以便調(diào)用。這一部分與正常用法基本無異,需要注意封裝的函數(shù)也需要修改參數(shù)屬性為string。
| 123456789101112131415 | //定義消息常數(shù)publicconstintCUSTOM_MESSAGE = 0X400 + 2;//自定義消息publicconstintCOMMAND_MESSAGE = 0X400 + 3;//指令消息//向窗體發(fā)送消息的函數(shù)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);????//立即執(zhí)行此消息????Application.DoEvents();} |
重點在接收端,也就是定義窗體的地方。使用string str = Marshal.PtrToStringAnsi(msg.WParam);//托管Marshal,把WParam托管為可以直接使用的string。這樣一個字符串消息就傳遞過來了。調(diào)用窗體的WriteLog函數(shù),來完成運行記錄的記錄。
| 12345678910111213141516171819202122232425 | 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);//調(diào)用基類函數(shù)處理非自定義消息。????????????break;????}} |
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ebony-Ivory/p/4291224.html
總結(jié)
以上是生活随笔為你收集整理的C#环境下使用Windows消息传递字符串数据的研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现flex LinkBar 组件 动态
- 下一篇: C#中Dictionary的用法