Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-03-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Es lo que tu dices y ya lo puse. Con respecto a usar un salvapantallas pues no sirve porque a veces estoy viendo una peli y el gato decide que el teclado es una buena cama jajaja.
Ahora que he puesto esa linea aparece una excepcion al mostrar el menu del systrayicon. El problema es que no hay ningun form activo al ser el unico y estar oculto y el componente hace uso de este codigo:
Código PHP:
void __fastcall TSysTrayIcon::ShowMenu()
{
   if(
FPopupMenu == NULL) return;

   
TPoint point;
   
GetCursorPos((tagPOINT*)&point);

   try
   {
      if (
Screen->ActiveForm->Handle != NULL)
         
SetForegroundWindow(Screen->ActiveForm->Handle);
   }
   catch (...)
   {
   }

   
FPopupMenu->Popup(point.xpoint.y);

El caso es que ActiveForm vale NULL y da una excepcion y no la pasa ni con el catch correctamente.
He hecho un chapú para solucionarlo que es hacer en el evento OnCreate del form Form1->Show() y Form1->Hide() y con eso ya hay un form activo y no falla pero durande unas decimas aparece y desaparece el form y no quiero que pase eso.
Responder Con Cita
  #2  
Antiguo 25-03-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
...Ahora que he puesto esa linea aparece una excepcion al mostrar el menu del systrayicon. El problema es que no hay ningun form activo al ser el unico y estar oculto y el componente hace uso de este codigo:
Código PHP:
void __fastcall TSysTrayIcon::ShowMenu()
{
   if(
FPopupMenu == NULL) return;

   
TPoint point;
   
GetCursorPos((tagPOINT*)&point);

   try
   {
      if (
Screen->ActiveForm->Handle != NULL)
         
SetForegroundWindow(Screen->ActiveForm->Handle);
   }
   catch (...)
   {
   }

   
FPopupMenu->Popup(point.xpoint.y);

El caso es que ActiveForm vale NULL y da una excepcion y no la pasa ni con el catch correctamente.
He hecho un chapú para solucionarlo que es hacer en el evento OnCreate del form Form1->Show() y Form1->Hide() y con eso ya hay un form activo y no falla pero durande unas decimas aparece y desaparece el form y no quiero que pase eso.
Efectivamente la función falla cuando Application->ShowMainForm = false porque en ese caso Screen->ActiveForm == NULL
He aprovechado para corregir eso y ampliar esa funcionalidad de forma sencilla.
Código PHP:
// Esto hará que la App arranque escondida, no visible en la barra de tareas y si en el SysTray 
__fastcall TForm1::TForm1(TComponentOwner)
   : 
TForm(Owner)
{
   
Application->ShowMainForm false;
   
SysTrayIcon1->Hide true;
   
SysTrayIcon1->Visible true;

El enlace del componente actualizado lo tienes aquí


Saludos

Última edición por escafandra fecha: 25-03-2016 a las 18:08:30.
Responder Con Cita
  #3  
Antiguo 25-03-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Bueno pues tengo novedades.
La primera es que al final he decidido que no quedaba todo lo correcto que pensaba el que no se mostrase el form principal al inicio asi que he quitado esa parte del codigo y ahora permito que salga de inicio.
La segunda es que despues de haber solucionado el error que me daba en lo del hook del mouse de un modo diferente usando:
Código PHP:
GetCursorPos(&Point);
ScreenToClient(Form1->Handle, &Point);
::
GetClientRect(Form1->Handle,&r);
if(
PtInRect(rPoint))
... 
Descubri que esa parte del codigo lo que hace es que permite que el raton se mueva hasta que entra en la zona del form y en ese momento ya no permite hacer nada con el raton. Este comportamiento no era lo que yo deseaba, yo deseaba que al darle al boton no funcionase el raton indistintamente de su posicion asi que he prescindido de ese codigo tambien y asi ha quedado todo mi codigo al final:
Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SysTrayIcon"
#pragma resource "*.dfm"

#define OK -32767 //Necesario para el keylogger

LRESULT WINAPI KeyboardEvent(int nCodeWPARAM wParamLPARAM lParam);
LRESULT WINAPI MouseEvent(int nCodeWPARAM wParamLPARAM lParam);

TForm1 *Form1;
HHOOK hKeyboardHook;
HHOOK hMouseHook;
bool CloseApp;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponentOwner)
   : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonColocarHookClick(TObject *Sender)
{
   
hKeyboardHook  SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEventGetModuleHandle(NULL), 0);

   if(
CheckBox2->Checked)
      
hMouseHook SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)MouseEventGetModuleHandle(NULL), 0);

   
ButtonColocarHook->Enabled false;
   
ButtonQuitarHook->Enabled true;
   
Activarteclado1->Enabled=ButtonQuitarHook->Enabled;
   
Desactivarteclado1->Enabled=ButtonColocarHook->Enabled;
   
SysTrayIcon1->IconIndex=0;
   
SysTrayIcon1->ShowBalloon("El teclado ha sido bloqueado""Gato, ya puedes jugar con mi teclado, esta vez gano yo jajaja.");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonQuitarHookClick(TObject *Sender)
{
   if(
hKeyboardHook != NULL){
      
UnhookWindowsHookEx(hKeyboardHook);
      
hKeyboardHook NULL;
   }
   if(
hMouseHook != NULL){
      
UnhookWindowsHookEx(hMouseHook);
      
hMouseHookNULL;
   }
   
ButtonColocarHook->Enabled true;
   
ButtonQuitarHook->Enabled false;
   
Activarteclado1->Enabled=ButtonQuitarHook->Enabled;
   
Desactivarteclado1->Enabled=ButtonColocarHook->Enabled;
   
SysTrayIcon1->IconIndex=1;
   
SysTrayIcon1->ShowBalloon("El teclado ha sido desbloqueado""Gato, no te digo nada.");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   
hKeyboardHook  NULL;
   
hMouseHook NULL;
   
CloseApp false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *SenderTCloseAction &Action)
{
   if(
hKeyboardHook != NULL){
      
UnhookWindowsHookEx(hKeyboardHook);
      
hKeyboardHook NULL;
   }
   if(
hMouseHook != NULL){
      
UnhookWindowsHookEx(hMouseHook);
      
hMouseHookNULL;
   }
   
ButtonColocarHook->Enabled true;
   
ButtonQuitarHook->Enabled false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCloseQuery(TObject *Senderbool &CanClose)
{
   if(
CloseApp){
      
CanClose CloseApp;
   }else{
      
CanClose = !CheckBox1->Checked;
      
SysTrayCanClose CanClose;
      
SysTrayIcon1->Minimize();
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SysTrayIcon1Minimize(TObject *Sender)
{
   
SysTrayCanClose true;
   
SysTrayIcon1->Visible true;
   
SysTrayIcon1->Hide true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SysTrayIcon1Restore(TObject *Sender)
{
   
SysTrayIcon1->Visible false;
   
SysTrayIcon1->Hide false;
   
CloseApp=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CheckBox2Click(TObject *Sender)
{
   
Bloquearelratn1->Checked CheckBox2->Checked;
   if(
CheckBox2->Checked)
      if(
hKeyboardHook != NULL)
         
hMouseHook SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)MouseEventGetModuleHandle(NULL), 0);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Desactivarteclado1Click(TObject *Sender)
{
   
ButtonColocarHook->Click();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Activarteclado1Click(TObject *Sender)
{
   
ButtonQuitarHook->Click();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Bloquearelratn1Click(TObject *Sender)
{
   
Bloquearelratn1->Checked = !Bloquearelratn1->Checked;
   
CheckBox2->Checked Bloquearelratn1->Checked;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Salir1Click(TObject *Sender)
{
   
CloseApp true;
   
Close();
}
//---------------------------------------------------------------------------

LRESULT WINAPI MouseEvent(int nCodeWPARAM wParamLPARAM lParam)
{
   
//Las lineas comentadas son para hacer que el mouse no funcione una vez que
   //entra en el area del formulario indicado. En mi caso quiero que se bloquee
   //siempre asi que comento esas lineas

   
TPoint Point;
   
//TRect r;

   
if(nCode == HC_ACTION){
      
//GetCursorPos(&Point);
      //ScreenToClient(Form1->Handle, &Point);
      //::GetClientRect(Form1->Handle,&r);
      //if(PtInRect(r, Point))
         
return -1;
   }
   return 
CallNextHookEx(hMouseHooknCodewParamlParam);
}
//---------------------------------------------------------------------------

LRESULT WINAPI KeyboardEvent(int nCodeWPARAM wParamLPARAM lParam)
{
   static 
count=0;

   if(
nCode == HC_ACTION){
      if((
wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)){
         if(!
GetAsyncKeyState(VK_CONTROL) && !GetAsyncKeyState(VK_SHIFT) && !GetAsyncKeyState(VK_MENU)){
            if(
count == && *(PDWORD)lParam == toupper(Form1->Edit1->Text.operator [](1))){
               
count++;
            }else if(
count == Form1->Edit1->Text.Length()-&& *(PDWORD)lParam == toupper(Form1->Edit1->Text.operator [](Form1->Edit1->Text.Length()))){
               
count 0;
               
Form1->ButtonQuitarHook->Click();
            }else if(*(
PDWORD)lParam == toupper(Form1->Edit1->Text.operator [](count+1))){
               
count++;
            }else{
               
count=0;
            }
         }else{
            
count 0;
         }
      }
      return -
1;
   }
   return 
CallNextHookEx(hKeyboardHooknCodewParamlParam);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::CheckBox3Click(TObject *Sender)
{
   if(
CheckBox3->Checked)
      
Edit1->PasswordChar='\0';
   else
      
Edit1->PasswordChar='*';
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Mostrarlacontrasea1Click(TObject *Sender)
{
   
SysTrayIcon1->ShowBalloon("Contraseña""La contraseña es \"" Edit1->Text "\"");
}
//--------------------------------------------------------------------------- 
Si veis algo raro avisadme para poderlo corregir .
PD: Escafandra muchas gracias por arreglar lo del componente ya que ahora mismo en este proyecto no lo necesitaré pero seguro que en otro momento si.
Gracias a todos.
Responder Con Cita
  #4  
Antiguo 26-03-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Algunas aclaraciones:

1.- SysTrayIcon1->ShowBalloon no mostrará nada si la App no es visible en el SysTray.
2.- Cuidado de no modificar la clave inadvertidamente pues tendrás problemas si bloqueas teclado y ratón.
3.- ¿No te parece más simple esta forma de detectar la clave?
Código PHP:
LRESULT WINAPI KeyboardEvent(int nCodeWPARAM wParamLPARAM lParam)
{
  static 
count=0;

  if(
nCode == HC_ACTION && (wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)){
    if(!
GetAsyncKeyState(VK_CONTROL) && !GetAsyncKeyState(VK_SHIFT) && !GetAsyncKeyState(VK_MENU)){
      if(
count >= && count Form1->Edit1->Text.Length()){
        if(*(
PDWORD)lParam == toupper(Form1->Edit1->Text[count+1]))
          
count++;
        else 
count 0;
        if(
count == Form1->Edit1->Text.Length()){
          
count 0;
          
Form1->ButtonQuitarHook->Click();
        }
      }
    }
    return -
1;
  }
  return 
CallNextHookEx(hKeyboardHooknCodewParamlParam);

Saludos.
Responder Con Cita
  #5  
Antiguo 26-03-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
1. Lo se .
2. También lo se jejeje.
3. Pues si que se ve más clara y sencilla así que lo cambiaré.
Por cierto, en el form uso un checkbox que indicará si se bloquea el ratón o no y en el popup del systrayicon tengo un ítem el cual se tilda o no igual y que realiza la misma función. Siempre tienen que estar ambos igual. Como lo tengo funciona pero no se si es lo más correcto o hay un modo mejor.
Responder Con Cita
  #6  
Antiguo 26-03-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Me di cuenta que tu solucion aun se podia reducir mas y la he dejado así:
Código PHP:
LRESULT WINAPI KeyboardEvent(int nCodeWPARAM wParamLPARAM lParam)
{
   static 
count=0;

   if(
nCode == HC_ACTION && (wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN)){
      if(!
GetAsyncKeyState(VK_CONTROL) && !GetAsyncKeyState(VK_SHIFT) && !GetAsyncKeyState(VK_MENU)){
         if(*(
PDWORD)lParam == (unsigned int)toupper(Form1->Edit1->Text[count+1]))
            
count++;
         else
            
count 0;
         if(
count == Form1->Edit1->Text.Length()){
            
count 0;
            
Form1->ButtonQuitarHook->Click();
         }
      }
      return -
1;
   }
   return 
CallNextHookEx(hKeyboardHooknCodewParamlParam); 

Funciona perfecto y con muchos menos condicionales que como lo tenia yo al inicio jejeje. Gracias amigo.
Responder Con Cita
  #7  
Antiguo 03-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
He descubierto un inconveniente y no se a que se debe. Si ejecutó la aplicación y activo el bloqueo y doy a apagar el pc, empiezan a cerrarse todas las aplicaciones pero no se apaga. Si doy a Ctrl + Alt +Sup veo que, aunque mi aplicación parece haberse cerrado y no aparece ni la ventana ni en el systray, mi aplicación sigue en la lista de aplicaciones. Da igual cuantas veces de a apagar que mientras siga mi aplicación en la lista no se apaga el pc y además sigue estando el bloqueo activo. Si lo termino desde el administrador de aplicaciones y doy apagar ya si se apaga. ¿alguien sabe que puede estar pasando y como solucionarlo?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Bloqueador para Android FabianSiza Desarrollo en Delphi para Android 1 14-01-2015 13:22:45
teclado usb armando Varios 1 12-02-2011 04:09:00
Bloqueador solar.... RONPABLO La Taberna 5 16-07-2007 19:48:47
Teclado D-MO Linux 3 14-07-2006 21:06:07
USB Teclado en Red Hat 9 nicocer Linux 0 05-07-2004 22:04:56


La franja horaria es GMT +2. Ahora son las 23:19:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi