Simulace stisku tlačítka   otázka

VB.NET, WinForms, .NET

Jak simulovat stisk tlačítka vím, např. takto:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Button2.PerformClick()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Label1.Text = "pokus1"
End Sub

Jak ale zařídím, aby ke stisku Button2 došlo i "opticky", tzn. aby bylo vidět, že tlačítko Button2 bylo stisknuto?

(snad rozumíte, jak o myslím)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Náročnost vytvoření něčeho takového by zcela jistě překračovala vaše znalosti a v mnoha případech i složitost celé aplikace. Nenapadá mě jediný důvod, proč něco takového dělat.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK, rozumím. Myslel jsem si, že je na to nějaká událost a že jsem ji jen nemohl najít.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zkus třeba todle:

Button2_Click(Me, System.EventArgs.Empty)

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Bohužel, to neudělá nic...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tak trochu rozved co nebo kdy se to tlacitko ma zmacknout samo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tento kod je odzkouseny funguje:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Button2_Click(Me, System.EventArgs.Empty)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Label1.Text = "Pokus"
    End Sub
End Class

Když kliknu na Button1 tak se vykonají události jako když klikneš na Button2

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je pouze vyvolání kódu, který se má vykonat při stisknutí tlačítka - s tlačítkem to ale nemá nic společného. Dotaz byl na "animaci" stisknutí tlačítka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně tak, dotaz byl na animaci...

Myslel jsem si, že tu animaci lze nějak jednoduše vyvolat, ale jak vyplývá z Vaší reakce (a kolegy Linharta), tak to asi tak jednoduché není, takže se s tím dál zabývat nebudu.

Dík za snahu!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tohle se dá úplně jednoduše udělat pomocí winapi.

Podívejte se, jak se volá win api z C# nebo VB. K simulaci pohybu kurzoru použijte fci mousemove a k simulaci stisku mouseinput.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Něco takového bude podle mě snažší naprogramovat ve WPF, protože tam máte lepší přístup v vizuálním stavům ovládacích prvků. Nicméně to není úplně banální a je to proti principům návrhu uživatelského prostředí a rozmyslel bych se, zda je to skutečně potřeba.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Upravte jsi tento příklad dle potřeby:

<Window x:Class="MouseSimulation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowState="Maximized">
    <Grid>
        <Button Content="Click" Height="100" Click="Button_Click" PreviewMouseMove="Button_PreviewMouseMove"></Button>
    </Grid>
</Window>

using System;
using System.Windows;
using System.Runtime.InteropServices;
namespace MouseSimulation
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
        private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;
        [DllImport("user32.dll")]
        private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, uint dwExtraInf);
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        public MainWindow()
        {
            InitializeComponent();
            timer.Interval = 10;
            timer.Tick += new EventHandler(MoveNow);
            timer.Start();
        }

        void MoveNow(object sender, EventArgs e)
        {
            System.Windows.Forms.Cursor.Position = new System.Drawing.Point(System.Windows.Forms.Cursor.Position.X + 1, System.Windows.Forms.Cursor.Position.Y + 1);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Click");
        }

        private void Button_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            timer.Stop();
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//make left button down
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//make left button up        
        }
    }
}
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Niekedy som to riešil takto:

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Button1.Text = 1
        Button2.Text = 2
        TextBox1.BorderStyle = BorderStyle.None
        TextBox1.Select()
    End Sub

    Private Sub TextBox1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        Select Case e.KeyCode
            Case Keys.NumPad1
                Button1_Click(sender, EventArgs.Empty)
                Button1.BackColor = SystemColors.ControlDark
            Case Keys.NumPad2
                Button2_Click(sender, EventArgs.Empty)
                Button2.BackColor = SystemColors.ControlDark
        End Select
        e.Handled = True
    End Sub

    Private Sub TextBox1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
        Select Case e.KeyCode
            Case Keys.NumPad1
                Button1_Click(sender, EventArgs.Empty)
                Button1.BackColor = SystemColors.ControlLight
            Case Keys.NumPad2
                Button2_Click(sender, EventArgs.Empty)
                Button2.BackColor = SystemColors.ControlLight
        End Select
        e.Handled = True
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        TextBox1.Text = 1
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        TextBox1.Text = 2
    End Sub
End Class

Stlačte 1 a 2

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

"-", ktorý chudák anonymný a úbohý? Budem rád a vážiť si to, ak mi to vysvetlí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

zdravím

a čo takto zistiť poziciu button

mousepositon na poziciu button

a potom click mousebuuton.left?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

po čase som objavil oveľa jednoduchšie riešenie. miesto button použij checkbox v properties nastav apearence na button. potom v nastaveni flat apperence si nastav odlišné farby pre stisk tlačidla stistnute tlačidlo a zatlčené tlačidlo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback