บทความนี้จะอธิบายรายละเอียดว่า Delphi ได้รับหมายเลขอ้างอิงและส่งข้อความในรูปแบบของตัวอย่างอย่างไร
ค้นหาหมายเลขอ้างอิงของหน้าต่างอื่น:
handle := FindWindow(nil,PChar('Title of the window'));//ค้นหาตัวจัดการแบบฟอร์ม
ค้นหาแบบฟอร์มย่อย:
childHandle := FindWindowEx(จัดการ,0,'คลาสย่อย','ชื่อฟอร์มย่อย');
นอกจากนี้ยังมี API สำหรับแจกแจงแบบฟอร์มย่อย
EnumChildWindows (ตัวจัดการหลัก, ฟังก์ชัน @callback, พารามิเตอร์ผู้ใช้);
หากต้องการใช้ฟังก์ชันนี้ คุณต้องเขียนฟังก์ชันเรียกกลับด้วยตนเอง เช่น:
ฟังก์ชัน EnumChildProc(ahWND:HWND; param:LPARAM):boolean; stdcall;sendmessage(จัดการ,ข้อความ,wl,rl)
หน่วย Unit1; อินเทอร์เฟซใช้ Windows, ข้อความ, Tlhelp32, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, StdCtrls; พิมพ์ TForm1 = คลาส (TForm) ขั้นตอน FormCreate (ผู้ส่ง: TObject) ส่วนตัว {ประกาศสาธารณะ} end; var Form1: TForm1;ขั้นตอนการดำเนินการ { $R *.DFM} TForm1.FormCreate(ผู้ส่ง: TObject);var a,b:PAnsiChar;h:HWND;beginh:= FindWindow(nil,'abc.txt - Notepad');h:= FindWindowEx(h,0,'edit', nil );SendMessage(h,WM_SETTEXT,255,Integer(PChar('ฉันมาที่นี่เพื่อวัด')));ShowMessage( IntToStr(h));สิ้นสุด;
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); ตั้งค่าสีพื้นหลังของทีวี SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0); กดปุ่มซ้ายของเมาส์ SendMessage(Button.Handle,WM_LBUTTONUP , 0,0); ยกปุ่มซ้ายของเมาส์ SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); ส่งข้อความ SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2); ส่งข้อความ( ปุ่ม.จัดการ,BM_SETSTYLE,BS_RADIOBUTTON,1); เปลี่ยนรูปแบบปุ่ม SendMessage (ComboBox.Handle, CB_SETDropPEDWIDTH, 300,0); เปลี่ยน CBDownWidth
WM_CUT, WM_COPY และ WM_PASTE ตัด คัดลอก วาง
ใช้คีย์ผสมใด ๆ :
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);keybd_event(อ๊อด('V'), MapVirtualKey(อ๊อด('V'), 0), 0, 0);keybd_event(อ๊อด('V') , MapVirtualKey(อ๊อด('V'), 0), KEYEVENTF_KEYUP, 0);keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
คำอธิบาย SendMessageA: เรียกใช้ฟังก์ชันหน้าต่างของหน้าต่างเพื่อส่งข้อความไปยังหน้าต่างนั้น ฟังก์ชันนี้จะไม่ส่งคืนเว้นแต่ข้อความจะได้รับการประมวลผล
SendMessage มี 4 พารามิเตอร์:
1. หน้าต่างตัวจัดการหน้าต่าง hwnd 32 บิตสามารถเป็นวัตถุหน้าจอประเภทใดก็ได้ เนื่องจาก Win32 สามารถรักษาตัวจัดการให้กับวัตถุที่มองเห็นได้ส่วนใหญ่
2. wMsg คือค่าคงที่ที่ใช้เพื่อแยกแยะข้อความอื่นๆ ค่าคงที่เหล่านี้สามารถเป็นค่าคงที่ที่กำหนดไว้ล่วงหน้าในหน่วย Windows หรือค่าคงที่ที่กำหนดเองได้
3. wParam มักจะเป็นค่าคงที่ที่เกี่ยวข้องกับข้อความ หรืออาจเป็นหมายเลขอ้างอิงของหน้าต่างหรือตัวควบคุม
4. lParam มักจะเป็นตัวชี้ที่ชี้ไปยังข้อมูลในหน่วยความจำ เนื่องจาก WParm, lParam และ Pointer ทั้งหมดเป็นแบบ 32 บิต จึงสามารถแปลงเป็นกันและกันได้
คำอธิบายโดยละเอียดของฟังก์ชัน wMsg:
★WM_Create สร้างหน้าต่าง
★WM_DESTROY ส่งเมื่อหน้าต่างถูกทำลาย
★WM_MOVE ย้ายหน้าต่าง
★WM_SIZE เปลี่ยนขนาดของหน้าต่าง
★WM_ACTIVATE หน้าต่างถูกเปิดใช้งานหรือปิดใช้งาน
★WM_SETFOCUS หน้าต่างได้รับการโฟกัส
★WM_KILLFOCUS หน้าต่างสูญเสียโฟกัส
★WM_ENABLE เปลี่ยนหน้าต่างเป็นสถานะเปิดใช้งาน
★WM_SETREDRAW ตั้งค่าว่าหน้าต่างสามารถวาดใหม่ได้หรือไม่
★WM_SETTEXT แอปพลิเคชันจะส่งข้อความนี้เพื่อตั้งค่าข้อความของหน้าต่าง
★WM_GETTEXT แอปพลิเคชันส่งข้อความนี้เพื่อคัดลอกข้อความของหน้าต่างที่เกี่ยวข้องไปยังบัฟเฟอร์
★WM_GETTEXTLENGTH รับความยาวของข้อความที่เกี่ยวข้องกับหน้าต่าง (ไม่รวมอักขระว่าง)
★WM_PAINT ขอให้หน้าต่างทาสีใหม่
★WM_CLOSE ส่งสัญญาณเมื่อมีการปิดหน้าต่างหรือแอปพลิเคชัน
★WM_QUERYENDSESSION ผู้ใช้เลือกที่จะสิ้นสุดกล่องโต้ตอบหรือโปรแกรมเรียกใช้ฟังก์ชัน ExitWindows เอง
★WM_QUIT ใช้เพื่อยุติการทำงานของโปรแกรม
★WM_QUERYOPEN เมื่อหน้าต่างผู้ใช้ถูกคืนค่าเป็นขนาดและตำแหน่งก่อนหน้า ให้ส่งข้อความนี้ไปที่ไอคอน
★WM_ERASEBKGND เมื่อต้องลบพื้นหลังหน้าต่าง (เช่น เมื่อหน้าต่างเปลี่ยนขนาด)
★WM_SYSCOLORCHANGE เมื่อระบบเปลี่ยนสี ให้ส่งข้อความนี้ไปยังหน้าต่างระดับบนสุดทั้งหมด
★หลังจากข้อความ WM_QUERYENDSESSION ข้อความนี้จะถูกส่งไปยังแอปพลิเคชันเพื่อแจ้งให้ทราบว่าการสนทนาสิ้นสุดลงแล้วหรือไม่
★WM_SHOWWINDOW ข้อความนี้จะถูกส่งไปยังหน้าต่างนี้เมื่อมีการซ่อนหรือแสดงหน้าต่าง
★WM_ACTIVATEAPP ส่งข้อความนี้ไปยังแอปพลิเคชันว่าหน้าต่างใดทำงานอยู่และหน้าต่างใดไม่ทำงาน
★WM_FONTCHANGE ข้อความนี้จะถูกส่งไปยังหน้าต่างระดับบนสุดทั้งหมดเมื่อไลบรารีทรัพยากรแบบอักษรของระบบเปลี่ยนแปลง
★WM_TIMECHANGE ส่งข้อความนี้ไปยังหน้าต่างระดับบนสุดทั้งหมดเมื่อเวลาของระบบเปลี่ยนแปลง
★WM_CANCELMODE ส่งข้อความนี้เพื่อยกเลิกโหมดที่กำลังดำเนินอยู่ (การทำงาน)
★WM_SETCURSOR หากเมาส์ทำให้เคอร์เซอร์เคลื่อนที่ในหน้าต่าง
★WM_ENDSESSION เมื่อปัญหากระบวนการของระบบและการป้อนข้อมูลเมาส์ไม่ได้รับการบันทึก ข้อความจะถูกส่งไปยังหน้าต่าง
★WM_MOUSEACTIVATE ส่งข้อความนี้ไปยังหน้าต่างปัจจุบันเมื่อเคอร์เซอร์อยู่ในหน้าต่างที่ไม่ได้ใช้งานและผู้ใช้กดปุ่มเมาส์
★WM_CHILDACTIVATE ส่งข้อความนี้ไปยังหน้าต่างลูก MDI เมื่อผู้ใช้คลิกแถบชื่อเรื่องของหน้าต่างนี้ หรือเมื่อเปิดใช้งาน ย้าย หรือปรับขนาดหน้าต่าง
★WM_QUEUESYNC ข้อความนี้ถูกส่งโดยโปรแกรมการฝึกอบรมที่ใช้คอมพิวเตอร์ และข้อความที่ผู้ใช้ป้อนจะถูกคั่นด้วยโปรแกรม hook ของ WH_JOURNALPALYBACK
★WM_GETMINMAXINFO ข้อความนี้จะถูกส่งไปยังหน้าต่างเมื่อกำลังจะเปลี่ยนขนาดหรือตำแหน่ง
★WM_PAINTICON ส่งไปยังหน้าต่างย่อเล็กสุดเมื่อไอคอนของมันกำลังจะวาดใหม่
★WM_ICONERASEBKGND ข้อความนี้จะถูกส่งไปยังหน้าต่างย่อเล็กสุดเฉพาะในกรณีที่ต้องวาดพื้นหลังใหม่ก่อนที่จะวาดไอคอน
★WM_NEXTDLGCT★ส่งข้อความนี้ไปยังโปรแกรมกล่องโต้ตอบเพื่อเปลี่ยนตำแหน่งโฟกัส
★WM_SPOOLERSTATUS ข้อความนี้จะแสดงทุกครั้งที่มีการเพิ่มหรือลบงานออกจากคิวการจัดการการพิมพ์
★WM_DRAWITEM ส่งเมื่อลักษณะที่ปรากฏของปุ่ม, กล่องคำสั่งผสม, กล่องรายการ, เมนูเปลี่ยนแปลง
★WM_MEASUREITEM เมื่อมีการสร้างปุ่ม, กล่องคำสั่งผสม, กล่องรายการ, ตัวควบคุมมุมมองรายการ หรือรายการเมนู
★WM_VKEYTOITEM ข้อความนี้มีลักษณะ LBS_WANTKEYBOARDINPUT ออกให้กับเจ้าของเพื่อตอบสนองต่อข้อความ WM_KEYDOWN
★WM_CHARTOITEM ข้อความนี้ถูกส่งโดยกล่องรายการลักษณะ LBS_WANTKEYBOARDINPUT ไปยังเจ้าของเพื่อตอบสนองต่อข้อความ WM_CHAR
★WM_SETFONT เมื่อวาดข้อความ โปรแกรมจะส่งข้อความนี้เพื่อให้ตัวควบคุมใช้สี
★WM_GETFONT แอปพลิเคชันส่งข้อความนี้เพื่อรับแบบอักษรของข้อความที่วาดโดยตัวควบคุมปัจจุบัน
★WM_SETHOTKEY แอปพลิเคชันจะส่งข้อความนี้เพื่อเชื่อมโยงหน้าต่างกับปุ่มลัด
★WM_GETHOTKEY แอปพลิเคชันจะส่งข้อความนี้เพื่อตรวจสอบว่าฮอตคีย์เชื่อมโยงกับหน้าต่างหรือไม่
★WM_QUERYDRAGICON ข้อความนี้จะถูกส่งไปยังหน้าต่างที่ย่อเล็กสุด เมื่อหน้าต่างนี้กำลังจะถูกลากและวาง และไม่มีไอคอนที่กำหนดไว้ในคลาส แอปพลิเคชันสามารถส่งคืนไอคอนหรือหมายเลขอ้างอิงเคอร์เซอร์ได้ ผู้ใช้ลากและวางไอคอน
★WM_COMPAREITEM ส่งข้อความนี้เพื่อกำหนดตำแหน่งสัมพันธ์ของรายการที่เพิ่มใหม่ในคอมโบบ็อกซ์หรือกล่องรายการ
★WM_COMPACTING แสดงว่าหน่วยความจำเหลือน้อยมาก
★WM_WINDOWPOSCHANGING ส่งข้อความนี้ไปยังฟังก์ชัน setwindowpos หรือฟังก์ชันการจัดการหน้าต่างอื่น ๆ เมื่อขนาดและตำแหน่งของหน้าต่างกำลังจะมีการเปลี่ยนแปลง
★WM_WINDOWPOSCHANGED ส่งข้อความนี้ไปยังฟังก์ชัน setwindowpos หรือฟังก์ชันการจัดการหน้าต่างอื่นๆ เมื่อขนาดและตำแหน่งของหน้าต่างมีการเปลี่ยนแปลง
★WM_POWER ข้อความนี้จะถูกส่งเมื่อระบบกำลังจะเข้าสู่สถานะหยุดชั่วคราว
★WM_COPYDATA ข้อความนี้จะถูกส่งเมื่อแอปพลิเคชันหนึ่งส่งข้อมูลไปยังแอปพลิเคชันอื่น
★WM_CANCELJOURNA เมื่อผู้ใช้ยกเลิกสถานะการเปิดใช้งานบันทึกโปรแกรม ให้ส่งข้อความนี้ไปยังโปรแกรม
★WM_NOTIFY เมื่อมีเหตุการณ์ของตัวควบคุมเกิดขึ้น หรือตัวควบคุมจำเป็นต้องได้รับข้อมูลบางอย่าง ข้อความนี้จะถูกส่งไปยังหน้าต่างหลัก
★WM_INPUTLANGCHANGEREQUEST เมื่อผู้ใช้เลือกภาษาอินพุต หรือปุ่มลัดของภาษาอินพุตเปลี่ยน
★WM_INPUTLANGCHANGE ข้อความนี้จะถูกส่งไปยังหน้าต่างระดับบนสุดที่ได้รับผลกระทบ เมื่อฉากของแพลตฟอร์มมีการเปลี่ยนแปลง
★WM_TCARD ข้อความนี้จะถูกส่งไปยังแอพพลิเคชั่นเมื่อโปรแกรมเริ่มต้นรูทีนวิธีใช้ windows แล้ว
★WM_HELP ข้อความนี้แสดงว่าผู้ใช้กด F1 หากมีการเปิดใช้งานเมนู ข้อความนี้จะถูกส่งไปยังเมนูที่เกี่ยวข้องกับหน้าต่างนี้ มิฉะนั้น ข้อความจะถูกส่งไปยังหน้าต่างที่มีโฟกัสอยู่ ข้อความจะถูกส่งสำหรับหน้าต่างที่ใช้งานอยู่ในปัจจุบัน
★WM_USERCHANGED ข้อความนี้จะถูกส่งไปยังหน้าต่างทั้งหมดหลังจากที่ผู้ใช้เข้าสู่ระบบหรือออกจากระบบ เมื่อผู้ใช้เข้าสู่ระบบหรือออกจากระบบ ระบบจะอัปเดตข้อมูลการตั้งค่าเฉพาะของผู้ใช้ ระบบจะส่งข้อความนี้ทันทีเมื่อผู้ใช้อัปเดตการตั้งค่า
★WM_NOTIFYFORMAT การควบคุมสาธารณะ การควบคุมแบบกำหนดเอง และหน้าต่างหลักใช้ข้อความนี้เพื่อตรวจสอบว่าตัวควบคุมใช้โครงสร้าง ANSI หรือ UNICODE หรือไม่
ฟังก์ชั่น EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; var buffer: array[0..255] of char; start Result := True; GetClassName(hwnd,buffer,256); if StrPas(Buffer)='Edit' เริ่ม SendMessage(hwnd,WM_GETTEXT,256,lparam); ผลลัพธ์:=False; สิ้นสุด ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject); var hwnd: Integer; buffer: array[0..255] of char; Begin hwnd := FindWindow('CabinetWClass',nil); (hwnd,@EnumChildWindowsProc,Longint(@buffer[0])); คำบรรยายภาพ := StrPas (บัฟเฟอร์); สิ้นสุด;