Delphi获取句柄方法详解:查找窗口与发送消息,WM_CUT、WM_COPY等组合键实现
handle := FindWindow(nil,PChar('窗口的标题'));//查到窗体句柄
窗口句柄这一个在Windows编程里不能缺少的概念,然而好多开发人员对它的实际运用仅仅只有一点了解,今天我们就要深入剖析这个支撑着整个GUI系统的核心机制 。
childHandle := FindWindowEx(handle,0,'子窗体类','子窗体标题');
什么是窗口句柄
EnumChildWindows(主创体句柄,@回调函数,用户参数);
function EnumChildProc(ahWND:HWND; param:LPARAM):boolean; stdcall; sendmessage(handle,message,wl,rl)
32位的Windows系统里,可视对象都有标识符,这个标识符是唯一的,它就是窗口句柄。窗口句柄本质上是个32位整数,系统借助这个数值识别、管理不同界面元素。从按钮到对话框,从菜单到滚动条,屏幕上能看到的所有对象都有对应的句柄。
unit Unit1;
interface
uses Windows,Messages,Tlhelp32,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;
type
TForm1=class(TForm)
procedure FormCreate(Sender: TObject);
private
{
Private declarations
}
public
{
Public declarations
}
end;
var Form1: TForm1;
implementation
{
$R *.DFM
}
procedure TForm1.FormCreate(Sender: TObject);
var a,b:PAnsiChar;
h:HWND;
begin
h:= FindWindow(nil,'abc.txt - 记事本');
h:= FindWindowEx(h,0,'edit',nil);
SendMessage(h,WM_SETTEXT,255,Integer(PChar('我来测度了')));
ShowMessage( IntToStr(h));
end;
负责系统内核的部分,维护着这么一个句柄表,此句柄表会详细记录,每个句柄所对应的内存方面的地址,以及与之关联的对象属性。在应用程序开始动手去创建窗口这个环节之时,系统会专门进行分配,从而给出一个全新的句柄,而当窗口进入到销毁的阶段时,系统则会将该句柄回收回来。这样一套机制,切实保证了系统资源能够得到有效的管理,成功做到了避免出现内存泄漏以及资源冲突这两种情况。
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 设置TV背景颜色
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); 传递字符
SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1); 改变Button风格
SendMessage(ComboBox.Handle,CB_SETDropPEDWIDTH,300,0); 改变CBDownWidth
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
消息传递机制
窗口相互之间借助消息来开展通信,那些消息涵盖特定的常量数值以及相关的参数,举例来说 WM_SETTEXT 消息被用来设定窗口文本,然而 WM_GETTEXT 是用于获取窗口内容,每一个消息都携带着发送者、接收者以及必要的数据信息。
当使用者施行操作之际,系统会把相应的消息投放至目标窗口所在的消息队列。假定点击按钮就会生成WM_COMMAND消息,要是移动窗口便会触发WM_MOVE消息。应用程序借由消息循环持续从队列里拿取且处置这些消息,达成与用户之间的交互联系。
窗口状态变化
系统借助特定消息来通知窗口状态发生改变,WM_ACTIVATE消息用以告知窗口激活状态出现的变化,WM_SYSCOLORCHANGE在系统颜色方案更新之际发送给所有顶层窗口,这些消息使得界面元素能够及时对系统设置的变化作出响应。
当窗口有重绘需求之际,系统会发送WM_PAINT消息,当该窗口的大小发生变动之时,WM_SIZE消息会被触发,应用程序借由处理这些消息去更新界面呈现效果,以此确保视觉呈现的效果跟实际情形保持一致 。
用户输入处理
当鼠标移动之际,WM_MOUSEMOVE消息会被发送,然而WM_KEYDOWN以及WM_KEYUP却是对应着键盘按键的。当光标处在非激活窗口之上的时候,WM_MOUSEACTIVATE消息在决定着应该怎样去处理鼠标点击。
对于触摸输入而言,系统会随之发送WN_TOUCH信息,手写笔输入的话,就会产生WM_POINTER消息。这些消息当中涵盖有详细的输入信息,像坐标啊,还有压力值之类的,从而让应用程序能够精准地响应用户所进行的各类操作。
系统级通知
在系统时间发生改变的情况下,WM_TIMECHANGE这个消息会将通知传达给所有的顶层窗口,WM_FONTCHANGE会在字体资源进行更新之际予以发送,而WM_SETTINGCHANGE会在系统设置被修改之时做出广播。
在内存存在紧张状况之际,WM_COMPACTING被发出,以此起到提示作用,提示应用程序去释放资源。当电源状态发生变化之时,WM_POWERBROADCAST被发送,从而使得应用程序能够据此相应地调整运行模式。
特殊应用场景
MDI子窗口借助WM_MDIACTIVATE通知来实现激活状态的变更,对话框运用WM_NEXTDLGCTL去切换具有焦点的控件。热键管理借助WM_SETHOTKEY以及WM_GETHOTKEY得以达成,帮助系统依靠WM_HELP为用户给予支持,。
控件借由WM_CTLCOLOR去获取绘制颜色,借助WM_GETFONT来获得字体设置。这些消息致使应用程序能够维持一贯的视觉风格景象,与此同时还能给予灵活的自定义能力条件 。
于您过往的开发历程里面,哪一个窗口消息之际的处理曾经给您造成了最为严重的挑战呢?欢迎于评论区域当中分享相关经验哟,要是感觉此篇文章具备一定帮助的,那就请点赞予以支持吧!


