Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Hooks de teclado y mouse funcionando.. !! (https://www.clubdelphi.com/foros/showthread.php?t=18778)

COCOL 23-02-2005 01:06:46

Hooks de teclado y mouse funcionando.. !!
 
Hola a todos...

Roman, gracias a Dios no tuve que implementar una Dll jajaja como dice la documentación... pude resolver el problema del Mouse de la siguiente manera...

Solamente hay que especificar otro hook de mouse a instalar...

El normal es WH_MOUSE.. pero especifiqué este:

const
WH_MOUSE_LL = 14;

MouseHook := SetWindowsHookEx(WH_MOUSE_LL, @CallBackMouse, HInstance, 0);

y listo.... con esto funcionó... al menos eso parece jajaja

Muchas gracias por todo!!!

roman 23-02-2005 02:40:07

Pues muy bien. Ahora que ya sabes hacerlo podrías implementar algo que siempre he querido: medir cuántos kilómetros recorre el ratón en un tiempo dado. De esta forma sabríamos cuándo es momento de sacar la bolita para limpiarla :D

// Saludos

NPIdea 30-03-2005 13:56:32

Ante todo daros las gracias, proque me ha servido de mucho estos posts sobre hooks de teclado y mouse.


El problema que tengo es que quiero deshabilitar las teclas de Apagar, Hibernar, Sleep del teclado. Mediante el código del ejemplo detecto el valor de las teclas, pero no se como alterar el mensaje a nivel de sistema y que no me apague el ordenador.

Por ejemplo si es vkCode=156 pues mandarle al sistema que es la tecla valor #0 y así como si nunca se hubiese pulsado.

roman 30-03-2005 16:54:02

Quizá me equivoque pero tengo la impresión de que no hay manera "correcta" de manejar las teclas que mencionas. No todos los teclados las tienen (de hecho nunca he visto una tecla apagar) y en algunos son configurables y puedes asignarles otra tarea.

Si quieres evitar que apaguen, hibernen o sueñen, además de darles un café, puedes establecer políticas de grupo en Windows que impidan llevar a cabo esas actividades.

// Saludos

Ohcan 30-03-2005 17:35:57

Haberlas haylas
 
Bueno Roman...

Yo tampoco había visto una tecla apagar en un teclado :cool: ...
hasta ayer...:o
¡Y está justo al lado del ESC! :D ... el diseñador se ha cubierto de gloria (a mi humilde entender)

NPIdea 30-03-2005 19:09:12

Pues gracias por contestar tan rapidamente.

La solución que he encontrado (de pensamiento) es impedir que apaguen el ordenador con el mensaje de fin de sesión, pero lo he probado en W2000 y no me funciona.

Un saludo.

PD: Los teclados con esas teclas no son nada raros, yo tengo uno en el trabajo y otro en casa. Es que ya no saben que inventar para tocar los eggs (jejeje), más de una vez he apagado el ordenata por error o por proximidad.

roman 30-03-2005 19:21:01

Cita:

Empezado por NPIdea
impedir que apaguen el ordenador con el mensaje de fin de sesión

:confused:

Que me he queda'o como tu nick

// Saludos

NPIdea 30-03-2005 19:29:08

El mensaje que lanza el SO para decir que se cierra (WM_QUERYENDSESSION).

No se si antes me he explicado bien, pero creo que te falla un poco la RAM, jeje (es broma).

http://www.clubdelphi.com/foros/show...UERYENDSESSION

La pena es que lo he probado en W2000 y no me entra en la rutina y me apaga el ordenador.

roman 30-03-2005 19:47:00

¡Caramba! Esto es usar mis propias palabras en mi contra :D

Más bien es que aún no despierto del todo y para que rían un rato te cuento que cuando leí tu mensaje anterior lo primero que me vino a la mente fue el letrero que aparecía en algunos ordenadores al cerrar Windows:



Cita:

Ahora puede apagar la máquina

:o

De ahí que me haya quedado de una pieza tratando de entender cómo dicho letrero podría impedir que apagaran la máquina.

:D

Una pregunta, si nos olvidamos por un momento de la aplicación, ¿qué pasa si aprietas la mentada tecla habiendo documentos abiertos?

Lo pregunto porque es posible que el botón lo que haga sea apagar el sistema sin mandar el mensaje WM_QUERYENDSESSION. Por ejemplo, de acuerdo a la documentación, la llamada

ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0);

cierra la sesión y apaga la máquina sin mandar los mensajes WM_QUERYENSESSION y WM_ENDSESSION

// Saludos

NPIdea 31-03-2005 16:06:44

Solucionadooooooooooo
 
Jejeje, pues he encontrado este componente, como no, en otra gran página sobre el fascinante mundo de Delphi, despues de probar montones de formas, con privilegiios, mensajes, capturas, etc, etc. Y lo peor es que cada vez que se pulsa el maldito botón hay que arrancar el sistema.

Sin más rollos ni dilaciones os presento a PowerButton (Lo publico tal como lo he encontrado):

Código Delphi [-]
unit PowerButton;
///////////////////////////////////////////////////////////////////////////////////////
//Dies ist eine Komponente um den Powerknopf anzusteuern.
//Eigenschaften:
//PowerOffEnable:boolean
//  >false lässt den Pc nicht mehr herunterfahren
//Ereignisse:
//  OnPowerbuttonpress
//  >Wird ausgeführt wenn der Powerbutton gedrückt wurde
//
//Programmed by CTV => www.ctvnet.ch
//
//Komponente darf frei für alles verwendet werden copyright darf nicht entfernt werden
///////////////////////////////////////////////////////////////////////////////////////

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Menus, ShellApi, ExtCtrls, Dialogs;
 
type
  TPowerButton = class(TComponent)
  private
    FHooked: Boolean;
    FOnPowerbuttonPress: TNotifyEvent;
    PPowerOffEnable: Boolean;
    function MessageHook(var Msg: TMessage): Boolean;
  protected
    procedure DoPowerbuttonPress; dynamic;
  public
    Version, Hersteller: string;
    IResultHi, IResultLo, ILParamHi, ILParamLo, IWParamHi, ILParam,
    IWParamLo, IWparam, Imsg, IResult: Integer;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    {events}
    property OnPowerbuttonPress: TNotifyEvent
      read FOnPowerbuttonPress write FOnPowerbuttonPress;
    {properties}
    property PowerOffEnable: Boolean read PPowerOffEnable write PPowerOffEnable;
  end;
procedure Register;
implementation
const
  PBT_APMQUERYSUSPEND = 536; {Request for permission to suspend.}
procedure Register;
begin
  RegisterComponents('Zusätzlich', [TPowerButton]);
end;
constructor TPowerButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Version    := '1.0.0.0';
  Hersteller := 'CTVNet.ch';
  FHooked    := False;
  if not (csDesigning in ComponentState) then
  begin
    Application.HookMainWindow(MessageHook);
    FHooked := True;
  end;
end;
procedure TPowerButton.DoPowerbuttonPress;
begin
  if Assigned(FOnPowerbuttonPress) then FOnPowerbuttonPress(Self);
end;
function TPowerButton.MessageHook(var Msg: TMessage): Boolean;
begin
  IResultHi := Msg.ResultHi;
  IResultLo := Msg.ResultLo;
  ILParamHi := Msg.LParamHi;
  ILParamLo := Msg.LParamLo;
  IWParamHi := Msg.WParamHi;
  ILParam   := Msg.lParam;
  IWParamLo := Msg.WParamLo;
  Imsg      := Msg.Msg;
  IResult   := Msg.Result;
  IWparam   := Msg.wParam;
  if (Msg.Msg = PBT_APMQUERYSUSPEND) and (Msg.wParam = 0) then //win95/98
  begin
    if PPowerOffEnable = False then
    begin
      Msg.Result := PWR_FAIL;
    end;
  end;
  if (Msg.Msg = PBT_APMQUERYSUSPEND) and (Msg.wParam = 0) then //winNT,2k,XP
  begin
    if PPowerOffEnable = False then
    begin
      Msg.Result := BROADCAST_QUERY_DENY;
    end;
  end;
  if (Msg.Msg = PBT_APMQUERYSUSPEND) and (Msg.wParam = 0) then //excute Event
  begin
    DoPowerbuttonPress;
  end;
end;
destructor TPowerButton.Destroy;
begin
  if FHooked then Application.UnhookMainWindow(MessageHook);
  inherited Destroy;
end;
end.

roman 31-03-2005 20:01:41

Hola NPIdea,

Me tomé la libertad de editar tu mensaje para agregar las etiquetas [delphi] para que fuera más legible el código.

Muy interesante, ahora sabemos algo más y agradezco que hayas publicado la solución que encontraste.

// Saludos

NPIdea 31-03-2005 20:29:26

Cita:

Empezado por roman
Hola NPIdea,

Me tomé la libertad de editar tu mensaje para agregar las etiquetas [delphi] para que fuera más legible el código.

Muy interesante, ahora sabemos algo más y agradezco que hayas publicado la solución que encontraste.

// Saludos

Tranquilo, muy bien hecho, hasta yo me entero y todo,jeje.

Saludicos y a otra cosa.:p :p :p

GUILLERMOMEJIA 11-10-2017 01:26:55

La solución más fácil era...
 
Jejeje... hola a todos. Me he encontrado este hilo tantos años después y recordé lo fácil que solucioné el tema del miserable botón de apagado en el teclado, siempre cerca de una tecla de uso contínuo: para mí bastó un destornillador y arrancar la teclita de todos mis teclados!!!... jaaaaaajajajaja... lástima que no lo leí entonces... abrazo para todos.


La franja horaria es GMT +2. Ahora son las 09:36:05.

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