hatte ich ja auch gedacht, aber komisch ... vorhin ging es noch, als ich es so hatte:
Delphi-Quellcode:
Procedure TForm1.ListBox1MouseDown ...
Begin
Keybd_Event(VK_CONTROL, 0, 0, 0);
End;
Procedure TForm1.ListBox1MouseUp ...
Begin
Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
End;
Hab's jetzt noch 4, 5-mal versucht und jetzt wills nichtmehr gehn
Na ja, man könnte es ja auch mal vorm Klickereignis machen und dann über'nen Timer wieder abschalten, da es ja kein onMouseLeave bei der Listbox gibt:
Delphi-Quellcode:
Procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Begin
If CheckBox1.Checked Then Begin
Keybd_Event(VK_CONTROL, 0, 0, 0);
ListBox1.Tag := 1;
End;
End;
Procedure TForm1.Timer1Timer(Sender: TObject);
{ein Interval von 10 bis 10 ms reicht voll aus}
Var P: TPoint;
Begin
P := ListBox1.ScreenToClient(Mouse.CursorPos);
If CheckBox1.Checked and (ListBox1.Tag <> 0) and
((P.X < 0) or (P.Y < 0) or (P.X >= ListBox1.Width) or (P.Y >= ListBox1.Height)) Then Begin
Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
ListBox1.Tag := 0;
End;
End;
mehrfach getestet ^^
Klar, wenn man die Maus nicht bewegt und zwischendurch mal auf 'ne Taste drückt, dann wird gibt es auf diese Weise Probleme -.-''
Die ander Möglichkeit mit 'nem Timer wäre dann
Delphi-Quellcode:
Procedure TForm1.Timer1Timer(Sender: TObject);
{ein Interval von 10 bis 10 ms reicht voll aus}
Var P: TPoint;
Begin
If CheckBox1.Checked Then Begin
P := ListBox1.ScreenToClient(Mouse.CursorPos);
If (P.X >= 0) and (P.Y >= 0) and (P.X < ListBox1.Width) and (P.Y < ListBox1.Height) Then
Keybd_Event(VK_CONTROL, 0, 0, 0)
Else
Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
End;
End;
Procedure TForm1.CheckBox1Click(Sender: TObject);
Begin
If not CheckBox1.Checked Then Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
End;
Dort ist dann das Problem mit dem Drücken einer Taste nicht mehr so groß.
Oder über 'nen Maus-Hook, da sollte es auch möglich sein.