网站大量收购独家精品文档,联系QQ:2885784924

WinForm的开发者们,想必对PostMessage和SendMessage两个API都.doc

WinForm的开发者们,想必对PostMessage和SendMessage两个API都.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WinForm的开发者们,想必对PostMessage和SendMessage两个API都.doc

小技巧分享:使用PostMessage向表單傳遞任何資料 WinForm的開發者們,想必對PostMessage和SendMessage兩個API都非常熟悉了。下面給出PostMessage函數在C#中的兩種聲明形式: 代碼 [DllImport(user32.dll , CharSet = CharSet.Unicode)] static extern bool PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); [DllImport(user32.dll , CharSet = CharSet.Unicode)] static extern bool PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); wParam參數和lParam參數是一個32位(在32位元的系統中)的整型。因為C++支援指標,wParam和lParam可以是指向任意類型物件的指標(指標本質上就是整型),而C#不支持指標,所以wParam參數和lParam參數只能為int型或IntPtr型。這就限制了我們向控制項傳遞任意的資料類型。 當然IntPtr有類似指標的作用,但我們又如何使自訂類型的物件獲得IntPtr呢?當然會想到用System.Runtime.InteropServices.Marshal.StructureToPtr()方法,使用該方法,不但有諸多限制,而且效率極為低下(因為需要額外分配記憶體和進行記憶體拷貝)。 今天我和大家分享一個“曲線救國”的方法和該方法的一些使用場景。 首先定義一個用於承載傳遞資料的類或結構,可以如下: 代碼 /// summary /// 資料傳遞類 /// /summary public class DataTransfer { /// summary /// 傳遞的字串 /// /summary public string transferMessage; /// summary /// 傳遞的其他任意類型的資料 /// /summary public object obj; } 您可以自訂DataTransfer類來承載你需要傳遞的資料,裡面的transferMessage和obj欄位就是你要傳遞的實際資料。 定義一個類型為Dictionaryint, DataTransfer的集合物件datas,當你需要給某控制項傳遞資料時,先生成一個DataTransfer物件value,把value加入到datas集合中,則會獲得從datas中提取該value的資料鍵key(關鍵是該key是整型的),調用PostMessage把key賦值給wParam參數或lParam參數發送消息到表單,表單收到消息後用key來datas中提取資料,再把datas中該鍵值對刪除。這樣貌似就達到了利用 PostMessage函數向控制項發送任意類型資料的目的。當然,我們可以定義一個傳遞資料的輔助類,該輔助類看起來應該像是這樣子的: 代碼 /// summary /// 傳遞資料的輔助類 /// /summary class TransferDataHelper { /// summary /// 自訂消息號 /// /summary public const int User_Message = 0x401; /// summary /// 資料集合 /// /summary static Dictionaryint, DataTransfer datas; /// summary /// 執行緒同步對象 /// /summary static object objLock; /// summary /// 資料鍵,用於標記資料 /// /summary static int dataKey=0; [DllImport(user32.dll , CharSet = CharSet.Unicode)] private static extern bool PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); static TransferDataHelper() { datas = new Dictionaryint, DataTransfer(); objLock = new object(); } /// summary /// 傳遞資料 /// /summary /// param name=value/param /// param name=formHandle/param public static voi

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档