Как перехватить состояния клавиш при перетаскивании объекта на элемент управления? - 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; }
Другие вопросы по тегам