elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ayuda timer en C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda timer en C#  (Leído 2,548 veces)
KiddKeo

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Ayuda timer en C#
« en: 1 Julio 2018, 12:38 pm »

Hola buenas, tengo tres timers, uno en false y los otros dos en true.
Estoy intentando hacer para que cuando presione el F1 el timer1 se active, y al soltar la tecla este se desactive.
He logrado hacer que se active y desactive pero tengo que pulsar dos veces el F1, esa no es la idea.
Aquí adjunto el código.
Código:
        private void timer3_Tick(object sender, EventArgs e)
        {
            if (GetAsyncKeyState(Keys.F1) == -32767)
            {
                if(timer1.Enabled == false)
                {
                    timer1.Start();
                }
                else
                {
                    timer1.Enabled = false;
                    timer1.Stop();
                }
            }
        }


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Ayuda timer en C#
« Respuesta #1 en: 1 Julio 2018, 14:10 pm »

Imagino que quieres poder pulsar la tecla F1 fuera de la aplicación y que se procese en tu programa, de lo contrario si solo quieres que la tecla se procese cuando haces click en la interfaz de usuario de la aplicación entonces es más que suficiente con suscribirse a los eventos Form.KeyDown y Form.KeyUp.

En cualquier caso es innecesario el uso directo de código nativo / llamar a las funciones de la API de Windows, en su lugar puedes usar código administrado expuesto en los miembros la librería de clases de WPF, y aunque estés en Windows Forms (como parece ser el caso). Aquí te muestro la solución:

Código
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. using System.Windows.Input;
  5. using WpfKey = System.Windows.Input.Key;
  6.  
  7. namespace WindowsFormsApp1 {
  8.  
  9.    public partial class Form1 : Form {
  10.  
  11.        public Form1() {
  12.            this.InitializeComponent();
  13.        }
  14.  
  15.        private void Timer1_Tick(object sender, EventArgs e) {
  16.            Console.WriteLine("timer1 has ticked...");
  17.        }
  18.  
  19.        private void Timer3_Tick(object sender, EventArgs e) {
  20.  
  21.            KeyStates keyState = Keyboard.GetKeyStates(WpfKey.F1);
  22.  
  23.            if (keyState.HasFlag(KeyStates.Down)) {
  24.                if (!(this.Timer1.Enabled)) {
  25.                    this.Timer1.Enabled = true;
  26.                    this.Timer1.Start();
  27.                }
  28.  
  29.            } else {
  30.                if (this.Timer1.Enabled) {
  31.                    this.Timer1.Stop();
  32.                    this.Timer1.Enabled = false;
  33.                }
  34.  
  35.            }
  36.  
  37.        }
  38.  
  39.    }
  40.  
  41. }

PD: en tu proyecto debes añadir una referencia al ensamblado WindowsBase.dll y PresentationCore.dll para poder importar y usar los namespaces de WPF.

Espero que te haya servido de ayuda.

Saludos!


« Última modificación: 1 Julio 2018, 14:20 pm por Eleкtro » En línea

KiddKeo

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Ayuda timer en C#
« Respuesta #2 en: 1 Julio 2018, 14:34 pm »

Imagino que quieres poder pulsar la tecla F1 fuera de la aplicación y que se procese en tu programa, de lo contrario si solo quieres que la tecla se procese cuando haces click en la interfaz de usuario de la aplicación entonces es más que suficiente con suscribirse a los eventos Form.KeyDown y Form.KeyUp.

En cualquier caso es innecesario el uso directo de código nativo / llamar a las funciones de la API de Windows, en su lugar puedes usar código administrado expuesto en los miembros la librería de clases de WPF, y aunque estés en Windows Forms (como parece ser el caso). Aquí te muestro la solución:

Código
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. using System.Windows.Input;
  5. using WpfKey = System.Windows.Input.Key;
  6.  
  7. namespace WindowsFormsApp1 {
  8.  
  9.    public partial class Form1 : Form {
  10.  
  11.        public Form1() {
  12.            this.InitializeComponent();
  13.        }
  14.  
  15.        private void Timer1_Tick(object sender, EventArgs e) {
  16.            Console.WriteLine("timer1 has ticked...");
  17.        }
  18.  
  19.        private void Timer3_Tick(object sender, EventArgs e) {
  20.  
  21.            KeyStates keyState = Keyboard.GetKeyStates(WpfKey.F1);
  22.  
  23.            if (keyState.HasFlag(KeyStates.Down)) {
  24.                if (!(this.Timer1.Enabled)) {
  25.                    this.Timer1.Enabled = true;
  26.                    this.Timer1.Start();
  27.                }
  28.  
  29.            } else {
  30.                if (this.Timer1.Enabled) {
  31.                    this.Timer1.Stop();
  32.                    this.Timer1.Enabled = false;
  33.                }
  34.  
  35.            }
  36.  
  37.        }
  38.  
  39.    }
  40.  
  41. }

PD: en tu proyecto debes añadir una referencia al ensamblado WindowsBase.dll y PresentationCore.dll para poder importar y usar los namespaces de WPF.

Espero que te haya servido de ayuda.

Saludos!

Muchas gracias, por tu ayuda.
He añadido las referencias que nombraste y las librerías se han añadido correctamente, el problema es que me muestra errores de compilación. Aquí la lista:

Aquí el código que estoy intentando compilar:
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Windows.Input;
using WpfKey = System.Windows.Input.Key;


namespace TestClic
{
    public partial class Form1 : Form
    {

        private const int MOUSEEVENTF_LEFTDOWN = 0x0002;
        private const int MOUSEEVENTF_LEFTUP = 0x0004;
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void mouse_event(int dwflags, int dx, int dy, int cbuttons, int dwExtraInfo);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool GetCursorPos(out Point lpPoint);
        [DllImport("user32.dll")]
        public static extern int GetAsyncKeyState(Keys vkeys);
        public static int xPos, yPos;

        public Form1()
        {
            this.InitializeComponent();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            if (GetAsyncKeyState(Keys.F3) == -32767)
            {
                Point cursor = new Point();
                GetCursorPos(out cursor);
                xPos = cursor.X;
                yPos = cursor.Y;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Point newPoint = new Point();
            GetCursorPos(out newPoint);
            int x = newPoint.X;
            int y = newPoint.Y;
            Cursor.Position = new Point(xPos, yPos);
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            Cursor.Position = new Point(x, y);
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            KeyStates state = Keyboard.GetKeyStates(WpfKey.F1);

            if (state.HasFlag(KeyStates.Down))
            {
                if (!(this.timer1.Enabled))
                {
                    this.timer1.Enabled = true;
                    this.timer1.Start();
                }

            }
            else
            {
                if (this.timer1.Enabled)
                {
                    this.timer1.Stop();
                    this.timer1.Enabled = false;
                }
            }
        }
    }
}
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Ayuda timer en C#
« Respuesta #3 en: 1 Julio 2018, 14:48 pm »

Los errores que mencionas no tienen que ver con el código que te mostré...

Para solucionar el primer y segundo error:
Código
  1. using Cursor = System.Windows.Forms.Cursor;
( o bien escribe el namespace completo en las lineas donde se te marca el error )

El tercer (y último) error directamente no te debería ocurrir, asegúrate de que tienes una referencia añadida el ensamblado System.dll (que es la libreria que contiene la función Enum.HasFlag) aunque por supuesto debes tenerla añadida por que de lo contrario tendrías gran cantidad de errores de definiciones de tipos no encontrados... como ya digo ese error en principio no te debería estar ocurriendo, revisa que todas las referencias estén bien.

Saludos
« Última modificación: 1 Julio 2018, 14:53 pm por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con timer:P « 1 2 3 »
.NET (C#, VB.NET, ASP)
<sylar> 20 10,784 Último mensaje 23 Mayo 2009, 03:51 am
por <sylar>
Ayuda con Timer C#.. « 1 2 »
.NET (C#, VB.NET, ASP)
ronald hisp 13 23,674 Último mensaje 15 Julio 2009, 18:30 pm
por raul338
[Ayuda] Timer y.. « 1 2 3 »
Programación Visual Basic
jorgelin95 20 6,255 Último mensaje 17 Septiembre 2010, 00:55 am
por bizco
ayuda timer
Programación Visual Basic
asdexiva 3 2,104 Último mensaje 13 Marzo 2013, 00:01 am
por MCKSys Argentina
[Ayuda]Timer en Android « 1 2 »
Java
PabloPbl 15 7,279 Último mensaje 13 Abril 2015, 21:38 pm
por PabloPbl
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines