Как перехватить состояния клавиш при перетаскивании объекта на элемент управления? - C#
Мне нужно изменить эффекты перетаскивания с помощью некоторых клавиш, пока я перетаскиваю некоторый текст внутри списка.
bool ctrlD = false;
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.D)
ctrlD = true;
}
// KeyUp
private void textBox_MouseDown(object sender, MouseEventArgs e)
{
textBox.DoDragDrop(textBox.Text, DragDropEffects.All);
}
private void listBox_DragOver(object sender, DragEventArgs e)
{
if (ctrlD) e.Effect = DragDropEffects.Copy;
else e.Effect = DragDropEffects.Move;
}
Проблема в том, что метод DragOver не видит, когда нажимаются какие-либо клавиши. Эффекты не меняются. Что я могу сделать для этого?
2 ответа
bool ctrlD = false
Использовать отправителя объекта
private void textBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.DoDragDrop(sender, DragDropEffects.All);
}
}
Убедитесь, что для AllowDrop установлено значение True
Добавить (MyContol) (_DragEnter) и (_DragDrop) события
private void MyControl_DragEnter(object sender, DragEventArgs e)
{
/*
DragDropEffects
*/
e.Effect = DragDropEffects.Copy;
}
private void MyControl_DragDrop(object sender, DragEventArgs e)
{
TextBox tb = e.Data.GetData(typeof(TextBox)) as TextBox;
/*
MyControl.Controls.Add(tb);
* Your code here
*/
}
Вам нужно прочитать DragEventArgs в событии listBox_DragOver, чтобы узнать, какие кнопки и клавиши использовались для операции перетаскивания:
if ((e.KeyState & 32) == 32) { bool alt = true; }
if ((e.KeyState & 16) == 16) { bool mousebuttonmiddle = true; }
if ((e.KeyState & 8) == 8) { bool control = true; }
if ((e.KeyState & 4) == 4) { bool shift = true; }
if ((e.KeyState & 2) == 2) { bool mousebutton2 = true; }
if ((e.KeyState & 1) == 1) { bool mousebutton1 = true; }