unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const InputboxMessage = WM_USER + 200; //定義消息 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure InputboxPassword(var MSG: TMessage); message InputBoxMessage; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin PostMessage(Handle,InputboxMessage,0,0); //發送消息 inputbox('a','b','ssss') end; procedure TForm1.InputboxPassword(var MSG: TMessage); var InputForm,Hedit: THandle; begin InputForm:= Screen.Forms[0].Handle; if InputForm <> 0 then begin Hedit:= FindWindowEx(InputForm,0,'Tedit',nil); SendMessage(Hedit,EM_SETPASSWORDCHAR,Ord('*'),0); end; end; end.
經過發消息的方式指定輸入顯示EM_SETPASSWORDCHAR.函數
要注意SendMessage和PostMessage的區別(如下是轉載):spa
在控制別的應用程序的時候,常常須要等待直到某個功能結束,例如:
打開一個窗口-->等待直到窗口結束
這個時候就能夠用到SendMessage
若是在打開這個窗口後仍然須要對該窗口的界面進行設置,好比Edit的value等等,好比:
打開一個窗口-->控制窗口的control的屬性
這個時候就須要PostMessage
使用一個鉤子程序截獲消息後,使用SendMessage把消息發送到主處理程序進行處理,可是在主處理程序尚未完成任務的時候,被設置鉤子的程序進入了中止的狀態,不能夠處理
WM_PAINT,
WM_MOVE,
.......等的基本信息,
必需要等SendMessage發送出的消息完成後,才能繼續運行,整個界面一片空白,把鉤子消息設置成PostMessage的發送消息形式後,問題解決!
我查了MSDN對這兩個API的定義,
PostMessage只是把消息放入隊列,無論其餘程序是否處理都返回,而後繼續執行;
而SendMessage必須等待其餘程序處理消息後才返回,繼續執行。
PostMessage的返回值表示PostMessage函數執行是否正確;
而SendMessage的返回值表示其餘程序處理消息後的返回值。
使用這兩個發送消息函數的最重要的是要看你的程序是否要對消息的滯後性關注否,PostMessage會形成消息的滯後性,而SendMessage則不會,但若是SendMessage消息處理失敗,則會形成程序中止!code