VB 2012 - PictureBox - MouseMove(HowKey)   otázka

VB.NET, WinForms

Dobrý den, potřeboval bych vědět jak zjistím která klávesa je zmáčknuta (POZOR v PictureBoxu při MouseMove).

Děkuji.

P.S.: Funkce: když myš bude se pohybovat v PictureBoxu a já zároveň zmáčknu klávesu tak aby se zapsala jako hlavní název programu (Me.Text = [Zmáčknutá - klávesa])

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

Nějak si neumím představit k čemu to je.

        public Form1()
        {
            InitializeComponent();

            //Událost stisknutí klávesy (na formuláři)
            this.KeyDown += OnKeyDown;
        }

        //poslední pozice kurzoru
        private Point _lastMousePosition;

        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            
            //aktuální pozice kurzoru
            var cKurzor = System.Windows.Forms.Cursor.Position;

            //pokud bude poslední pozice myši stejná nic se neděje
            if (_lastMousePosition.X == cKurzor.X && _lastMousePosition.Y == cKurzor.Y) return;

            _lastMousePosition = cKurzor;

            //pozice pictureboxu
            var cPic = this.pictureBox1.PointToScreen(new Point(0, 0));
            var sPic = this.pictureBox1.Size;

            //Ověření zdali je kurzor na pictureboxu
            if (cKurzor.X >= cPic.X && cKurzor.X <= cPic.X + sPic.Width &&
                cKurzor.Y >= cPic.Y && cKurzor.Y <= cPic.Y + sPic.Height)
                this.Text = e.KeyCode.ToString();
            


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

ok.

Ale jestli to dobře chápu tak to obsluhuje hlavní okno...

Já potřebuju aby ten kod byl tady: (Obsluhuje to PictureBox)

Private Sub PictureBox_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox.MouseMove
        
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak to je nesmysl, picturebox zavolá event ve formu a zpracovává ho také vlákno formu.

Pokud, ale nutně chcete řešení v události MouseMove tak to také lze. Na http://stackoverflow.com/questions/11002... je jedno z řešení, ale pro začátečníka je trochu složitější.

Třída KeyMessageFilter

    public class KeyMessageFilter : IMessageFilter
    {
        private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();

        public Dictionary<Keys, bool> KeyTable
        {
            get { return m_keyTable; }
            private set { m_keyTable = value; }
        }

        public bool IsKeyPressed()
        {
            return m_keyPressed;
        }

        public bool IsKeyPressed(Keys k)
        {
            bool pressed = false;

            if (KeyTable.TryGetValue(k, out pressed))
            {
                return pressed;
            }

            return false;
        }

        private const int WM_KEYDOWN = 0x0100;

        private const int WM_KEYUP = 0x0101;

        private bool m_keyPressed = false;


        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == WM_KEYDOWN)
            {
                KeyTable[(Keys)m.WParam] = true;

                m_keyPressed = true;
            }

            if (m.Msg == WM_KEYUP)
            {
                KeyTable[(Keys)m.WParam] = false;

                m_keyPressed = false;
            }

            return false;
        }
    }

Hlavní formulář:

        public Form1()
        {
            InitializeComponent();

            pictureBox1.MouseMove += OnMouseMove;
            m_filter = new KeyMessageFilter();
            Application.AddMessageFilter(m_filter);
        }

        private KeyMessageFilter m_filter;


        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (!m_filter.IsKeyPressed()) return;
            if (m_filter.KeyTable.Count == 0) return;

            var k = (from i in m_filter.KeyTable
                     where (i.Value)
                     select i).First();

            this.Text = k.Key.ToString();
        }
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky moc.

A jak zjistím architekturu OS ?

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

První odkaz co my vylezl na googlu :D

http://www.codeproject.com/Questions/292...

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

Hele a co takhle tedle kod:

    Private Sub PictureBox_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox.MouseMove
        Dim Shift As Short = System.Windows.Forms.Control.ModifierKeys \ &H10000
        Select Case Shift
            Case 0 REM Hide (Nothing)
            Case 1 REM Shift (NoHide - Only)
            Case 2 REM Control (ChangeAll)
            Case 3 REM Shift + Control
            Case 4 REM Alt + Tab
            Case 5 REM Shift + Alt
            Case 6 REM Control + Alt 
            Case 7 REM Control + Shift + Alt
        End Select
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

SRY Ty zavorky jsem zapomnel smazat (Nothing), (NoHide - Only), (ChangeAll)

Ty do kodu nepatří...

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

To je pro zjištění shift, ctrl a alt stisknutých kláves jiné to neumí.

Shift a ctrl řeší i KeyMessageFilter, kterou jsem Vám zde uvedl.

S altem se to chová dost podivně - asi by to potřebovalo upravit.

Třída KeyMessagefilter Vám vrací KeyTable (dictionary) se všemi aktuálně zmáčnutými klávesami (valupair má value == true)

Nebo si tam dopište property:

        public List<Keys> ActualyPrressedKeys
        {
            get 
            { return (from k in KeyTable
                      where k.Value
                      select k.Key).ToList(); }

        }

Která vám vrátí rovnou stisklé klávesy.

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