Как подделать положение курсора мыши в Windows Forms C #?

У меня есть это приложение Windows Forms с простой всплывающей подсказкой. В зависимости от расположения окна приложения на рабочем столе и положения курсора мыши всплывающая «подсказка» (или стрелка, указывающая выноску) может указывать или не указывать в нужное мне место.

Например, мое приложение привязывается к сторонам рабочего стола, и когда оно привязано к правой стороне, если курсор мыши находится ниже 100 пикселей от правой стороны, всплывающая подсказка будет указывать не в том месте. Но если курсор мыши находится где-то еще, он будет указывать в нужное место.

В этой ситуации я хотел имитировать положение курсора мыши (без фактического изменения положения курсора мыши), чтобы оно было где-то еще, чтобы проблема не возникла.

Это возможно? Как я могу этого добиться?

private void noteTitleInput_KeyPress(object sender, KeyPressEventArgs e) {
    if(e.KeyChar == Convert.ToChar(Keys.Return, CultureInfo.InvariantCulture) && noteTitleInput.Text.Length > 0) {
        e.Handled = true;

        noteInputButton_Click(null, null);
    } else if(!Char.IsControl(e.KeyChar)) {
        if(Array.IndexOf(Path.GetInvalidFileNameChars(), e.KeyChar) > -1) {
            e.Handled = true;

            System.Media.SystemSounds.Beep.Play();

            noteTitleToolTip.Show("The following characters are not valid:\n\\ / : * ? < > |",
                groupNoteInput, 25, -75, 2500);

            return;
        }
    }

    noteTitleToolTip.Hide(groupNoteInput);
}

person rfgamaral    schedule 14.08.2010    source источник


Ответы (4)


Я не совсем уверен, почему вам нужно устанавливать положение курсора, потому что вы можете настроить всплывающую подсказку так, чтобы она отображалась там, где вы ее указываете, а не обязательно там, где находится мышь.

Например:

tooltip1.Show("My tip", controlOnWhichToShow, 15, 15);

будет отображать подсказку в верхнем левом углу controlOnWhichToShow, на расстоянии 15 пунктов от краев.

Если я вас неправильно понял, то укажите, в какой момент времени используется позиция мыши.

person veljkoz    schedule 08.09.2010

Если вы синхронизируете событие MouseHover, вы можете создать всплывающую подсказку, как описывает veljkoz. Таким образом, вы можете разместить всплывающую подсказку как угодно. Код будет выглядеть примерно так:

protected override void OnMouseHover(EventArgs e)
{
  ToolTip myToolTip = new ToolTip();
  myToolTip.IsBalloon = true;
  // TODO The x and y coordinates should be what ever you wish.
  myToolTip.Show("Helpful Text Also", this, 50, 50);
  base.OnMouseHover(e);
}

Надеюсь, это поможет.

person Pat O    schedule 08.09.2010

В Windows Forms мышь захватывается элементом управления, когда пользователь нажимает кнопку мыши на элементе управления, а мышь отпускается элементом управления, когда пользователь отпускает кнопку мыши.

Свойство Capture класса Control указывает, захватил ли элемент управления мышь. Чтобы определить, когда элемент управления теряет захват мыши, обработайте событие MouseCaptureChanged.

Только окно переднего плана может захватывать мышь. Когда фоновое окно пытается захватить мышь, окно получает сообщения только о событиях мыши, которые происходят, когда указатель мыши находится в видимой части окна. Кроме того, даже если окно переднего плана захватило мышь, пользователь все равно может щелкнуть другое окно, переведя его на передний план. Когда мышь захвачена, горячие клавиши не работают.

Подробнее здесь. Захват мыши в Windows Forms

person JustBoo    schedule 14.08.2010
comment
В моем сценарии нет кнопок, поэтому я действительно не понимаю, что вы предлагаете. Я собираюсь обновить вопрос своим текущим кодом ... - person rfgamaral; 15.08.2010

Вы можете делать то, что говорите, с Классом. Сделать это можно очень просто.

один класс создания и

namespace MousLokasyonbulma

{class benimtooltip: ToolTip {[System.Runtime.InteropServices.DllImport ("User32.dll")] static extern bool MoveWindow (IntPtr h, int x, int y, int width, int height, bool redraw); общедоступный benimtooltip () {this.OwnerDraw = true; this.Draw + = Benimtooltip_Draw; }

    private void Benimtooltip_Draw(object sender, DrawToolTipEventArgs e)
    {
        e.DrawBackground();
        e.DrawBorder();
        e.DrawText();
        var t = (ToolTip)sender;
        var h = t.GetType().GetProperty("Handle",
          System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var handle = (IntPtr)h.GetValue(t);
        var location = new Point(650, 650);
        var ss= MoveWindow(handle, location.X, location.Y, e.Bounds.Width, e.Bounds.Height, false);
    }
}

}

полный код MyGithup

Пример изображения проекта https://i.hizliresim.com/1pndZG.png https://i.hizliresim.com/Lvo3Rb.png

person Ebubekir Bastama    schedule 05.06.2019