C#环境下使用Windows消息传递字符串数据的研究
前言:
日前,師兄交給了我一個課題,將一個后臺運行的Console程序,修改為WindowsForm程序,并在其界面上增加配置設置,以及運行記錄。
原來的Console程序,后臺運行的流程在其中一個類的函數里。我在我創建的主窗體上創建這個類的對象,然后執行它的函數。結果就遇到了一個問題,大部分需要記錄下的運行記錄,都是在這個類的函數中,而這個類怎么去訪問我的主窗體上的RichTextBox呢?
我嘗試了下設置RichTextBox為Public,結果還是不能在外面的類調用它,嘗試設置WinForm為Static這種蠢方法,也只是使過程變得原來越復雜。
最后決定使用我最不想用的Windows消息方式(因為以前覺得比較麻煩)。雖然用的過程中有些存在風險,并且特別不專業,但是總之是達到了我想要的結果,也算是一個進步吧。
| 12 | [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(不知道這么做有沒有風險,但是確實沒有報錯……而且管用)
| 1234 | [DllImport("User32.dll", EntryPoint ="SendMessage")]privatestaticexternIntPtr SendMessage(inthWnd,intmsg,stringwParam,stringlParam);[DllImport("User32.dll", EntryPoint ="FindWindow")]privatestaticexternintFindWindow(stringlpClassName,stringlpWindowName); |
然后,封裝一個發送消息的函數SendMsgToMainForm,以便調用。這一部分與正常用法基本無異,需要注意封裝的函數也需要修改參數屬性為string。
| 123456789101112131415 | //定義消息常數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函數,來完成運行記錄的記錄。
| 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);//調用基類函數處理非自定義消息。????????????break;????}} |
?
轉載于:https://www.cnblogs.com/Ebony-Ivory/p/4291224.html
總結
以上是生活随笔為你收集整理的C#环境下使用Windows消息传递字符串数据的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现flex LinkBar 组件 动态
- 下一篇: 逻辑智力题【更新中】