求高人指点迷津,如何截获TComboBox的下拉列表滚动的消息。 如题,请注意我是想截获那个消息。一、常规的想法我都试了,就是截不到。(WM_VSCROLL,EN_VSCROLL,难道上下滚动的时候不是这两个消息,另有其它?)二、挂钩子就不要说了。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 很有可能不是这个消息我觉得一般TCombobox的消息就以下几种,不知道对不对WS_TABSTOP, WS_GROUP, WS_VSCROLL, and WS_DISABLED........ //给你提供一个思路~~//先找到弹出来的列表窗体,然后截获它的消息~~//实现代码如下,不过此方法并不妥当~~//或者你先说想实现的目的~~var vOldWndProc: Pointer = nil;function NewWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): Integer; stdcall;begin { TODO : 处理hWnd消息 } Result := CallWindowProc(vOldWndProc, hWnd, uMsg, wParam, lParam);end; { NewWndProc }procedure TForm1.ComboBox1DropDown(Sender: TObject);begin Timer1.Enabled := not Assigned(vOldWndProc);end;procedure TForm1.Timer1Timer(Sender: TObject);var vRect: TRect; vHandle: THandle;begin Timer1.Enabled := False; GetWindowRect(ComboBox1.Handle, vRect); vRect.Top := vRect.Top + ComboBox1.Height + 2; vHandle := WindowFromPoint(vRect.TopLeft); vOldWndProc := Pointer(GetWindowLong(vHandle, GWL_WNDPROC)); SetWindowLong(vHandle, GWL_WNDPROC, Integer(@NewWndProc));end;procedure TForm1.FormCreate(Sender: TObject);begin Timer1.Interval := 100;end; to zswang(伴水清清)(专家门诊清洁工): 多谢,你的方法确实可以实现。可以截到WM_VSCROLL消息。to Kshape(伟大的大伟//给我一个机会、我想做好人!) 你说的不是消息,那些是Window Styles,谢谢参与。随便也感谢merkey2002(小样的)帮我顶。就此结帖。 array of char数组该怎么释放? 如何使DBGrid中的数据与DBEdit中的数据同步? tClientDataSet如何排序?似乎没有类似TAdoDataSet.sort的属性 错误"新事务不能登记到指定的事务处理器"??? 使用Variant数组指针时出现错误,诸位帮我看看,如何解决? 在安装一个IMAGE控件时,提示“找不到文件DsgnIntf.dcu”文件,请问怎么解决。、 一个小问题,还请大家帮忙 dephi该怎样入门?? 如何在NT下关机? 关于焦点问题 招哈尔滨delphi方面程序员 100分,QQ给了就揭贴!
我觉得一般TCombobox的消息就以下几种,不知道对不对
WS_TABSTOP, WS_GROUP, WS_VSCROLL, and WS_DISABLED........
//先找到弹出来的列表窗体,然后截获它的消息~~
//实现代码如下,不过此方法并不妥当~~
//或者你先说想实现的目的~~var
vOldWndProc: Pointer = nil;function NewWndProc(hWnd: HWND; uMsg: UINT;
wParam: WPARAM; lParam: LPARAM): Integer; stdcall;
begin
{ TODO : 处理hWnd消息 }
Result := CallWindowProc(vOldWndProc, hWnd, uMsg, wParam, lParam);
end; { NewWndProc }procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
Timer1.Enabled := not Assigned(vOldWndProc);
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
vRect: TRect;
vHandle: THandle;
begin
Timer1.Enabled := False;
GetWindowRect(ComboBox1.Handle, vRect);
vRect.Top := vRect.Top + ComboBox1.Height + 2;
vHandle := WindowFromPoint(vRect.TopLeft);
vOldWndProc := Pointer(GetWindowLong(vHandle, GWL_WNDPROC));
SetWindowLong(vHandle, GWL_WNDPROC, Integer(@NewWndProc));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval := 100;
end;
多谢,你的方法确实可以实现。可以截到WM_VSCROLL消息。to Kshape(伟大的大伟//给我一个机会、我想做好人!)
你说的不是消息,那些是Window Styles,谢谢参与。随便也感谢merkey2002(小样的)帮我顶。
就此结帖。