Windows 有没有办法从TComboBox跟踪滚动条消息?

Windows 有没有办法从TComboBox跟踪滚动条消息?,windows,delphi,winapi,combobox,delphi-6,Windows,Delphi,Winapi,Combobox,Delphi 6,在扩展的TComboBox类中,我重写了ComboWndProc过程处理程序,但无法从列表FListHandle的滚动条中检测到CN_VSCROLL和WM_VSCROLL消息 我基本上想用winapi实现一个无限滚动。 我想,要想做我想做的事情,我基本上需要知道滚动条的轨迹条位置,这样当轨迹条触按line down按钮时,我会向字符串添加更多数据 这个想法很简单,也许很幼稚,但我可以从那里开始,看看我会遇到什么问题 有可能做这样的事吗 有没有办法从TComboBox跟踪滚动条消息 更重要的是:

在扩展的TComboBox类中,我重写了ComboWndProc过程处理程序,但无法从列表FListHandle的滚动条中检测到CN_VSCROLL和WM_VSCROLL消息

我基本上想用winapi实现一个无限滚动。 我想,要想做我想做的事情,我基本上需要知道滚动条的轨迹条位置,这样当轨迹条触按line down按钮时,我会向字符串添加更多数据

这个想法很简单,也许很幼稚,但我可以从那里开始,看看我会遇到什么问题

有可能做这样的事吗

有没有办法从TComboBox跟踪滚动条消息

更重要的是:

如果是,如何进行? 若否,原因为何? 您可以使用WM_VSCROLL,为此,您必须对combobox的listbox控件进行子类化。CN_VSCROLL将无法工作,因为combobox的listbox部分不是VCL控件

下面的例子基本上是来自Kobik的,为了完整起见包括在这里

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FComboListWnd: HWND;
    FComboListWndProc, FSaveComboListWndProc: Pointer;
    procedure ComboListWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Info: TComboBoxInfo;
begin
  ZeroMemory(@Info, SizeOf(Info));
  Info.cbSize := SizeOf(Info);
  GetComboBoxInfo(ComboBox1.Handle, Info);
  FComboListWnd := Info.hwndList;
  FComboListWndProc := classes.MakeObjectInstance(ComboListWndProc);
  FSaveComboListWndProc := Pointer(GetWindowLong(FComboListWnd, GWL_WNDPROC));
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FComboListWndProc));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FSaveComboListWndProc));
  classes.FreeObjectInstance(FComboListWndProc);
end;

procedure TForm1.ComboListWndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_VSCROLL: OutputDebugString('scrolling');
  end;
  Message.Result := CallWindowProc(FSaveComboListWndProc,
      FComboListWnd, Message.Msg, Message.WParam, Message.LParam);
end;
您可以使用WM_VSCROLL,为此,您必须对combobox的listbox控件进行子类化。CN_VSCROLL将无法工作,因为combobox的listbox部分不是VCL控件

下面的例子基本上是来自Kobik的,为了完整起见包括在这里

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FComboListWnd: HWND;
    FComboListWndProc, FSaveComboListWndProc: Pointer;
    procedure ComboListWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Info: TComboBoxInfo;
begin
  ZeroMemory(@Info, SizeOf(Info));
  Info.cbSize := SizeOf(Info);
  GetComboBoxInfo(ComboBox1.Handle, Info);
  FComboListWnd := Info.hwndList;
  FComboListWndProc := classes.MakeObjectInstance(ComboListWndProc);
  FSaveComboListWndProc := Pointer(GetWindowLong(FComboListWnd, GWL_WNDPROC));
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FComboListWndProc));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FSaveComboListWndProc));
  classes.FreeObjectInstance(FComboListWndProc);
end;

procedure TForm1.ComboListWndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_VSCROLL: OutputDebugString('scrolling');
  end;
  Message.Result := CallWindowProc(FSaveComboListWndProc,
      FComboListWnd, Message.Msg, Message.WParam, Message.LParam);
end;

也欢迎其他选择,只是简单地说你需要ListWndProc。我看不到你收到任何CN_XXX消息。我希望这是一个纯Win32窗口。@davidheffernanlistwndproc只调用ComboWndProc。我想知道的是,我认为这些信息永远不会到达列表中。你的组合是什么风格的?万一matters@DavidHeffernanCSDROPDOWN替代方案也很受欢迎,只是简单地说您需要ListWndProc。我看不到你收到任何CN_XXX消息。我希望这是一个纯Win32窗口。@davidheffernanlistwndproc只调用ComboWndProc。我想知道的是,我认为这些信息永远不会到达列表中。你的组合是什么风格的?万一matters@DavidHeffernan我非常感谢你。我相信我现在能做到。顺便问一下,你怎么知道这个列表是桌面窗口的子窗口呢。我怎样才能了解更多?这种知识只有实践才能得到?我可以在什么地方读到它吗?@epro-我想你能找到的最多的文档是listbox控件是一些“ComboLBox”。除此之外,你可能会在这里和那里找到碎片。我所做的是快速检查易失性弹出窗口,如此菜单等。。是构造一个所有者绘制的代码,并在绘图代码中放置断点。然后您可以冻结窗口并尝试spy++对其进行监视。虽然这有点微妙,但当我还包括消息处理时,这个设置有时会冻结整个框。否则,如果可以对窗口进行子类化,则可以执行任何操作。。不客气!非常感谢你。我相信我现在能做到。顺便问一下,你怎么知道这个列表是桌面窗口的子窗口呢。我怎样才能了解更多?这种知识只有实践才能得到?我可以在什么地方读到它吗?@epro-我想你能找到的最多的文档是listbox控件是一些“ComboLBox”。除此之外,你可能会在这里和那里找到碎片。我所做的是快速检查易失性弹出窗口,如此菜单等。。是构造一个所有者绘制的代码,并在绘图代码中放置断点。然后您可以冻结窗口并尝试spy++对其进行监视。虽然这有点微妙,但当我还包括消息处理时,这个设置有时会冻结整个框。否则,如果可以对窗口进行子类化,则可以执行任何操作。。不客气!