windows的訊息傳遞--訊息盒子

來源:互聯網
上載者:User

標籤:

使用delphi的訊息機制可以方便操作後台,其中重要的就是sendmessage()函數。下面講解一下這個函數

 

[delphi] view plain copy 
  1. function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;  

 

其中四個參數的含義和說明如下:
1.hWnd:
對象的控制代碼。希望將訊息傳送給哪個對象,就把該對象的控制代碼作為實參傳送,在 VB 中可以簡單地
用“對象.hWnd”獲得某個對象的控制代碼,如 Text1.hWnd和 Form1.hWnd分別可以得到 Text1和Form1的句
柄。它是一個長整型數。Windows給每個控制項一個編號,這個編號就稱為視窗控制代碼。有了這個控制代碼,我們
就可告訴 Windows 我們要控制哪個控制項,所以這個控制代碼在 API 呼叫中至關重要。VB 的大多數控制項都包
括hwnd屬性,如下拉框、TreeView等,表單也有這個屬性。但也有一些控制項沒有這個屬性,如標籤控制項。
沒有這個屬性就無法利用Windows API函數,但可以節省系統資源。
2.wMsg:
被發送的訊息。根據具體需求和不同的對象,將不同的訊息作為實參傳送,以產生預期的動作。使
SendMessage 傳遞訊息,大多是為了完成以下幾個工作:
①設定控制項的一些選項,象我們要使用的CB_SETDROPPEDWIDTH的就屬於這種情況。儘管VB的每個控
件都提供了許多屬性,但仍然有許多控制項的選項沒有包括在其中。而這些選項中的大多數都可以利用該
函數進行設定?
②獲得控制項的一些設定。同上一種情況相反,有時我們需要獲得控制項的一些設定,相當於讀取屬性。
例如,如果想知道一個下拉框的下拉部分的寬度是多少,就可以向控制項發送CB_GETDROPPEDWIDTH訊息。
對於這種情況,SendMessage函數的傳回值就是結果。
③執行一定的操作。例如,我們要在下拉框中尋找是否有“ABC”這個字串,當然,我們可以編寫
一個迴圈,逐條比較看是否存在這樣的字串。如果使用API,我們只需要向下拉框發送CB_FINDSTRING
訊息,這條訊息就會自動進行尋找工作並返回結果。
④類比使用者操作。我們有時希望類比使用者的操作,比如關閉其他應用程式的視窗。其實只要我們能知
道那個視窗的控制代碼,我們就可以發送WM_CLOSE訊息給那個視窗,視窗接受到這條訊息就會關閉,如同使用者
關閉視窗一樣?
3.wParam、4.lParam:
附加的訊息資訊。這兩個是可選的參數,用來提供關於wMsg訊息更多的資訊,不同的wMsg可能使用這
兩個參數中的0、1或2個,如果不需要哪個附加參數,則將實參賦為NULL(在VB中賦為0)。
lParam定義為Any類型。指定 Any類型可禁止VB進行類型檢查,從而允許將任意資料類型傳遞給該過
程。由於每條訊息對參數的類型和傳遞方式的要求都不同:有的可能要求為Long型,有的可能要求為自定
義類型;大多數要求按傳值方式傳遞,但也有一些要求按傳地址方式。為了滿足各種要求,我們將這個參
數定義為Any類型。比如,我們要傳遞一個Long型變數lData。如果訊息要求傳地址方式傳遞,可以使用:
SendMessage ……, lData
而如果要求傳值方式傳遞,則使用
SendMessage ……, ByVal lData
如果傳遞常數,我們則需要使用類型尾碼來指定常數的類型,比如"0&",表示Long型的常數0,如
SendMessage ……, ByVal 0&
我們也可以使用類型轉換函式CLng將常數指定為Long型,如CLng(0)。

程式中,有時定義 lParam As Any,有時定義 ByVal lParam As String。這是為什麼呢?對於
SendMessage函數,lParam的使用是很靈活的,在一般情況下,lParam是一個指標,它指向的資料類型
有三種:長整形、自訂資料結構類型、字串類型。對於前兩種類型,需要將 lParam定義為 lParam
As Any,從而將 lParam 資料的指標傳遞到 SendMessage 函數。對於字串類型,則需要定義 Byval
lParam As String,因為字串類型資料不同,只有定義 ByVal,得到的才是字串的指標,如果沒有
ByVal,得到的將是指向字串指標的指標。另外對於少數的訊息來說,SendMessage 函數需要的只是
lParam 本身的值,這時就需要將 lParam定義為 Byval lParam As Long,或者在程式調用時在 lParam
之前加 ByVal?
當使用者在編輯控制項上進行各種操作時,其父視窗將收到 WM_COMMAND 通知訊息,lParam帶控制項控制代碼
(hWnd),同時 wParam 的低16位帶控制項的 ID,高16位帶有如下表的訊息代碼.

常用編輯控制項訊息:

 

[delphi] view plain copy 
  1. EC_LEFTMARGIN(&H1) EC_USEFONTINF //設定左邊距時使用  
  2. EC_RIGHTMARGIN EC_USEFONTINF //設定右邊距時使用  
  3. EC_USEFONTINF,O//邊距 設定編輯控制項的左、右邊距,當wParam含EC_LEFTMARGIN時在lParam的低16位指定左邊距點數,當wParam含EC_RIGHTMARGIN時在lParam的高16位指定右邊距點數。當指定wParam為EC_USEFONTINFO時,則用當前字型的字元"A"的寬度指定右邊距和字元"C"的寬度指定左邊距lParam被忽略。  
  4. EM_CHARFROMPOS(&HD7=215),0, //取得編輯控制項中指定位置的字元相對於文本頭部的位移量。使用本操作應先在第4個參數的高16位指定行號,低16位指定列號(或一個POINTAPI結構),行列是按編輯控制項的客戶區左上方為原點(0,0)計算的。如果指定的位置超出控制項客戶區則返回-1  
  5. EM_CANUNDO(&HC6=198),0,0   //決定前一次編輯操作是否能夠撤消:檢測控制項撤消緩衝區是否為空白,通常控制項把最後一次在控制項的編輯操作儲存在一個撤消緩衝區,如果緩衝區非空則返回TRUE表示上次操作可以撤消,否則返回FALSE,應用程式可以利用該傳回值來禁止或允許菜單或工具條的"撤消"項。  
  6. EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0 //清除控制項的撤消緩衝區,使其不能撤消前一次編輯操作  
  7. EM_FMTLINES(&HC8=200)   //決定是否在取回的文本宇串中包含軟斷行符號字元  
  8. EM_GETFIRSTVISIBLEINE(&HCE=206),0,0 //獲得文本控制項中處於可見位置的最頂部的文本所在的行號  
  9. EM_GETLINE(&HC4=196 )//行號,ByVal 變數 擷取編輯控制項某一行的內容,變數須預先賦空格  
  10. EM_GETLINECOUNT(&HBA=186,0,0// 擷取編輯控制項的總行數  
  11. EM_GETMODIFY(&HB8=184),0,0  //判斷編輯控制項的內容是否已發生變化,返回TRUE則控制項文本已被修改,返回FALSE則未變。  
  12. EM_GETPASSWORDCHAR( ),0,0  //擷取編輯控制項的密碼字元,返回NULL表示沒有字元  
  13. EM_GETRECT(&HB2=178),0,結構   //擷取編輯控制項的格式化矩形  
  14. EM_GETTHUMB(&HBE=190),0,0 //取得多行文本編輯控制項的捲動方塊的當前位置(注意:是象素值)  
  15. EM_GETSEL(&HB0=176),0,//變數 擷取游標位置(以位元組數表示),或:(緩衝區起點,緩衝區終點)取得編輯控制項中選定內容的範圍,傳回值中低16位為起點,高16位為終點  
  16. EM_GETHANDLE(&HBD=189),0,0// 取得文本緩衝區  
  17. EM_GETWORDBREAKPROC(&HD1=209),0,0 //取得整字換行回呼函數EditWordBreakProc指標  
  18. EM_GETLIMITTEXT(WM_USER+37=1061),0,0 //擷取一個編輯控制項中文本的最大長度  
  19. EM_GETMARGINS( ),0,0 //擷取編輯控制項的左、右邊距,傳回值低16位為左邊距,高16位為右邊距(不得用於NT3.51)  
  20. EM_LIMITTEXT(&HC5=197),//最大值,0 設定編輯控制項中的文本長度  
  21. EM_SCROLLCARET(&HB7=183),0,0 //把可見範圍移至游標處  
  22. EM_LINEFROMCHAR(&HC9=201),//位移值,0 擷取指定位置(或:-1,0 表示游標位置)所在的行號  
  23. EM_LINEINDEX(&HBB=187),//行號,0 擷取指定行(或:-1,0 表示游標所在行)首字元在文本中的位置(以位元組數表示)  
  24. EM_LINELENGTH(&hC1=193)//位移值,0 擷取指定位置所在行(或:-1,0 表示游標所在行)的文本長度(以位元組數表示)  
  25. EM_POSFROMCHARPOINT,結構地址,位移值 取得指定字元位置的行列號,位移值是字元相對於文本頭部的位移。  
  26. EM_LINESCROLL(&HB6=182)//列數,行數 指定行數的文本水平滾動,每次滾動N列  
  27. EM_EXGETSEL (&H434 = 1076)  
  28. EM_EXSETSEL(&H437=1079),0//結構 RichEdit控制項設定文本選定範圍,參閱 EM_SETSEL 訊息,結構是指 CHARRANGE 結構  
  29. EM_PASTESPECIAL(&H440=1088),2(1),1// RichEdit控制項粘貼剪貼簿中的位元影像(或文本)  
  30. EM_FINDTEXT(&H738=1080) //RichEdit控制項本文搜尋操作  
  31. EM_FINDTEXTEX(&H44F=1103) //同上  
  32. EM_SETTEXTEX(&H461=1121) //RichEdit控制項本文替換/插入操作  
  33. EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width // 15)設定 RichTextBox 自動換行,後續代碼是:RichText.RightMargin = iif(RichText.RightMargin = 0,1,0)  
  34. EM_SETTARGETDEVICE, 0, 1 //設定 RichTextBox 不自動換行  
  35. EM_POSFROMCHAR(&HD6或&H426)// 判斷指定字元在編輯控制項的位置(用於NT3.51)  
  36. EM_SCROLL(&HB5=181),*,0 //文本垂直滾動。第三個參數*控制滾動方向:SB_LINEDOWN(1)向下滾動一行,SB_LINEUP(0)向上滾動一行,SB_PAGEDOWN(3)向下滾動一頁,SB_PAGEUP(2)向上滾動一頁。  
  37. EM_REPLACESEL(&HC2=194),1(0)//,字串 用指定字串替換編輯控制項中的當前選定內容,如果第三個參數wParam為1,則本次操作允許撤消,0禁止撤消。字串可用傳值方式,也可用傳址方式(例:SendMessage Text1.hwnd, EM_REPLACESEL, 0, Text2.Text ‘這是傳值方式)  
  38. EM_SETSEL(&HB1=177)//,起點,終點 設定編輯控制項中文本選定內容約制(或設定游標位置),該範圍被反相顯示,用於為複製、替換、粘貼、剪下、刪除等編輯功能指定範圍,游標將被移至指定的終點後面。還可使用指定相同起點和終點來移動游標而不是選定範圍。當指定的起點等於0和終點等於-1時,文本全部被選中,此法常用在清空編輯控制項。當指定的起點等於-2和終點等於-1時,全文均不選,游標移至文本未端,此法常用在文本未端追加內容。注意:當控制項沒有輸入焦點時,本操作將會失敗,一般在執行本操作前都應調用SetFocus先取得輸入焦點。  
  39. EM_UNDO(&HC7=199),0,0 //撤消前一次編輯操作,當重複發送本訊息,控制項將在撤消和恢複中來回切換  
  40. EM_SETCHARFORMAT(&H444)// 改變選定文本的顏色  
  41. EM_SETHANDLE(&HBC=188),//緩衝區指標,0 為編輯控制項指定新的文本緩衝區。此操作僅適用對話方塊建立帶DS_LOCALEDIT風格的控制項。  
  42. EM_SETLIMITTEXT,長度(位元組),0 //設定編輯控制項中的文本最大長度(不得用於NT3.51)  
  43. EM_SETMARGINS(&HD3=211) //設定編輯控制項的左、右邊距(不得用於NT3.51)  
  44. EM_SETMODIFY(&HB9=185),1(0),0 //設定或清除一個編輯控制項的修改標誌  
  45. EM_SETPASSWORDCHAR(&HCC=204),//字元,0 指定控制項用來顯示密碼的字元,預設為"*"。當第三個參數wParam為0時,本操作將清除控制項的ES_PASSWORD風格,並按實際字元顯示。  
  46. EM_SETREADONLY(&HCF=207),1(0),0 //決定是否將編輯控制項設為唯讀,同時決定控制項的ES_READONLY風格  
  47. EM_SETRECT(&HB3=179),0(或RECT),//結構地址 為一個編輯控制項設定格式化矩形  
  48. EM_SETRECTNP(&HB4=180),0(或RECT)//,結構地址 為一個編輯控制項設定格式化矩形,只是控制項此時不會重畫  
  49. EN_CHANGE(&H300=768)// 編輯控制項的內容發生改變。與EN_UPDATE不同,該訊息是在編輯框顯示的本文被重新整理後才發出的。  
  50. EN_ERRSPACE(&H500=1280) //任何時候只要由於記憶體不足以完成一項編輯操作  
  51. EN_HSCROLL(&H601=1537)// 使用者單擊了編輯控制項的水平捲軸。注意:這條訊息是在控制項更新顯示之前發送出去的。  
  52. EN_VSCROLL(&H602=1538) //使用者單擊了編輯控制項的垂直捲軸。注意:這條訊息是在控制項更新顯示之前發送出去的。  
  53. EN_KILLFOCUS(&H200=512) //編輯控制項失去了輸入焦點  
  54. EN_SETFOCUS(&H100=256) //編輯控制項獲得了輸入焦點  
  55. EN_UPDATE(&H400=1024) //控制項準備顯示改變了的本文時發送該訊息。它與EN_CHANGE通知訊息相似,只是它發生於更新文本顯示出來之前。  
  56. EN_MAXTEXT(&H501=1281)// 使用者輸人的文字數超出由EM_LIMITTEXT訊息規定的界限,或超出由VB Maxlength屬性規定的界限,就會發送這條訊息 。此外,倘若不允許自動進行水平滾動,同時插入點要超出控制項的寬度;或者不允許自動垂直滾動,同時插入點要超出控制項的高度,那麼也會觸發這條訊息。在沒有ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當本文超出了編輯框的邊框時也會發出該訊息。  
  57. 編輯風格訊息:  
  58. ES_MULTILINE   //指定編輯控制項能否進行多行文本編輯,若多行編輯器不指定ES_AUTOHSCROLL風格,則會自動換行,使用者每按一次Enter,在當前游標處輸入一個斷行符號分行符號(0Dh,0Ah),文本增加一行。若不指定ES_AUTOVSCROLL,則多行編輯器會在視窗中本文裝滿時發出警告聲響。  
  59. ES_LEFT //文本顯示居左?  
  60. ES_CENTER// 文本顯示置中?  
  61. ES_RIGHT //文本顯示居右?  
  62. ES_LOWERCASE //把使用者輸入的字母統統轉換成小寫字母?  
  63. ES_UPPERCASE// 把使用者輸入的字母統統轉換成大寫字母?  
  64. ES_OEMCONVERT // 把輸入的文本從ANSI碼轉換成OEM碼,然後又轉換成ANSI碼,目的是保證函數AnsiToOem的正確調用。這在編輯框中包含檔案名稱時是很有用的。  
  65. ES_AUTOHSCROLL(自動增加水平捲軸?) 當使用者在行尾鍵入一個字元時,本文將自動向右滾動10個字元,當使用者按斷行符號鍵時,本文總是滾向左邊。  
  66. ES_AUTOVSCROLL // 當使用者在最後一個可見行按斷行符號鍵時,本文向上滾動一頁。  
  67. ES_NUMBER  //只接收數位輸入,其它字元輸入一律無效。  
  68. ES_NOHIDESEL(&H100=256) //當編輯框失去輸入焦點時,選中的文本將隱藏,本文中的選擇保持不變。預設時本文中的選擇將失效,當獲得輸入焦點後才又顯示出來。  
  69. ES_READONLY 將編輯框設定成唯讀?  
  70. ES_PASSWORD(&H20=32) //使所有鍵入的字元都用"*"來顯示。  
  71. ES_WANTRETURN  //使多行編輯器接收斷行符號鍵輸入並換行。如果不指定該風格,按斷行符號鍵會選擇預設的命令按鈕,這往往會導致對話方塊的關閉。  
  72. 列表框操作:  
  73. LB_FINDSTRING(&H18F=399),-1,ByVal //字串 尋找清單項目的字串,傳回值=字串所在的清單項目的索引。-1表示從第0行開始尋找,如果改為一個有效清單項目索引值,將從該行開始尋找。  
  74. LB_ITEMFROMPOINT(&H1A9=425) //擷取游標所在的清單項目的索引  
  75. LB_SETHORIZONTALEXTENT(&H194=404),//長度,0 設定列表框的橫向捲軸以及滾動長度,長度為象素值  
  76. 組合框操作:  
  77. CB_SHOWDROPDOWN(&H14F),1(0),0// 開啟(關閉)組合框的列表  
  78. TVM_SETBKCOLOR(&H1100+29=4381)// 設定擴充樹型清單控制項的背景色(TVM開頭的常數)  
  79. 常用視窗訊息:  
  80. WM_GETFONT(&H31=49)// 得到當前控制項繪製文本的字型(的控制代碼)  
  81. WM_GETTEXT(&HD=13),//變數長度,變數 取得表單的標題,變數須預先賦空字串(chr(0)),變數長度=Len(變數)  
  82. WM_SETTEXT(&HC=12),0,ByVal //"字串" 設定表單的標題  
  83. WM_NCLBUTTONDOWN(&HA1=161),2,0 //在非客戶區,即邊框及標題列上(假如定義的是一個組件,則非客戶區包括Form等)按下滑鼠左鍵;  
  84. WM_LBUTTONDOWN(&H201=513),2,0 //在客戶區,也就是除邊框及標題列以外按下滑鼠左鍵  
  85. WM_VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0 //同步滾動文本,p是位置改變數  
  86. WM_PAINT  
  87. WM_USER (&H400 = 1024)  
  88. WM_CUT(&H300=768),0,0// 剪下  
  89. WM_COPY(&H301=769)),0,0// 複製  
  90. WM_PASTE(&H302=770)),0,0/// 粘貼  
  91. WM_CLEAR(&H303=771)),0,0 //刪除  
  92. WM_UNDO(&H304=772)),0,0 /撤消  
  93. 按紐訊息:  
  94. BM_SETSTYLE(&HF4)// 設定按紐樣式  
  95. BS_RADIOBUTTON(&H4) //收音機旋紐式的按紐,是 BM_SETSTYLE 使用的參數  


例如對windows發訊息讓文本選中。

 

 

[delphi] view plain copy 
  1. SendMessage(Text1.hwnd,EM_GETSEL,0,-1 );  

文本全全選。

http://blog.csdn.net/sushengmiyan/article/details/7836500

windows的訊息傳遞--訊息盒子

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.