日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#环境下使用Windows消息传递字符串数据的研究

發(fā)布時間:2024/4/14 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#环境下使用Windows消息传递字符串数据的研究 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

日前,師兄交給了我一個課題,將一個后臺運行的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ù),來完成運行記錄的記錄。

12345678910111213141516171819202122232425protectedoverridevoidWndProc(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。