Newsgroup: it.comp.lang.delphi
Titolo: Alt+Tab (II parte)

Salve a tutto il NG.
Riallaciandomi al mio precedente post, ho seguito il suggerimento dell'amico
ACSH per rendere insensibile la mia applicazione al triste ALT+TAB e
funziona benissimo su Win98.
Spulciando su msdn di winsozz ho trovato un casino di informazioni su come
relaizzare un hook a basso livello per la keyboard in modo da poter
oittenere lo stesso risultato anche per Win2000, NT 4.0 e spero XP
(maledetto).
Non funziona nulla.
Vi motro il codice non tanto per annoiarvi, ma nella speranza di avere un
aiutino perchč, muovendomi come maulae m$ suggerisce, non funziona
PS E' il mio primo hook. forse il problema č lě.....
Grazie a tutti
Andrea
const
  WH_KEYBOARD_LL = 13;
type
  KBDLLHOOK = record
    vkCode: Longword;
    scanCode: Longword;
    flags: Longword;
    time: Longword;
    dwEtraInfo: Longword;
    end;
  PKBDLLHOOK = ^KBDLLHOOK;
var
  CurrKBHook: hHook;
function LowLovelKeyboardProc(code: Integer; wParam: WPARAM; lParam:
LPARAM): LRESULT stdcall;
  var
    bControlKeyDown: integer;
    pkhbs: KBDLLHOOK;
  begin
  Result := 0;
  pkhbs := PKBDLLHOOK( lParam )^;
  if ( code = HC_ACTION ) then
    begin
    bControlKeyDown := GetAsyncKeyState( VK_CONTROL ) shr ( ( SizeOf(
short ) * 8 ) - 1 );
    if ( Result = 0 ) and ( pkhbs.vkCode = VK_ESCAPE ) and ( bControlKeyDown
<> 0 ) then
      Result := 1;
    if ( Result = 0 ) and ( pkhbs.vkCode = VK_TAB ) and ( ( pkhbs.flags and
$20 ) <> 0 ) then
      Result := 1;
    if ( Result = 0 ) and ( pkhbs.vkCode = VK_ESCAPE ) and ( ( pkhbs.flags
and $20 ) <> 0 ) then
      Result := 1;
    end;
  if ( Result = 0 ) then
    Result := CallNextHookEx( CurrKBHook, code, wParam, lParam );
  end;
procedure TForm1.Button1Click(Sender: TObject);
  begin
  Close;
  end;
procedure TForm1.FormCreate(Sender: TObject);
  begin
  CurrKBHook := SetWindowsHookEx( WH_KEYBOARD_LL, LowLovelKeyboardProc, 0,
GetWindowThreadProcessId( Handle ,nil ) )
  end;
procedure TForm1.FormDestroy(Sender: TObject);
  begin
  UnhookWindowsHookEx( CurrKBHook )
  end;

 LowLovelKeyboardProc, 0, GetWindowThreadProcessId( Handle ,nil ) )
Dunque, qui ci vedo almeno due errori.
Innanzitutto l' help specifica che vuole un puntatore alla funzione di
callback. Il terzo parametro deve indicare l' hinstance del modulo.
L' ultimo parametro potrebbe esser semplificato chiamando
GetCurrentThreadId(), se poi vorrai implementare l' hook a livello di
sistema quel parametro dovrà valere zero.
--
- Carlo -

Ciao Carlo
Adesso non posso provare.
Domani sicuramente.
Grazie dell'aiuto.
Al momento posso dirti che, in relazione ai due errori che mi hai segnalato,
il primo non credo sussista perchè ho già utilizzato altre API che
richiedevano puntatori a funzioni e così funzionava.
Sul secondo errore ... no so, provo come dici.
Sicuramente mi creo una DLL (come mi suggerisci) e sposto in essa l'hook.
Grazie.
Ti rispondo domani ......
Andrea
"Carlo Bertuccini" <cber...@DOHlibero.it> ha scritto nel messaggio
news:iO19a.176292$ZE.52...@twister2.libero.it...


 Sicuramente mi creo una DLL (come mi suggerisci) e sposto in essa l'hook.
Se non decentri il codice nella libreria non riuscirai mai a rendere il tuo
hook system-wide.
--
- Carlo -

Ciao Carlo
Hai ragione, ti chiedo scusa.
Ora provo e ti rispondo
Grazie del tempo che mi dedichi
Andrea
"Carlo Bertuccini" <cber...@DOHlibero.it> ha scritto nel messaggio
news:yq39a.176317$YG2.5...@twister1.libero.it...


 Grazie del tempo che mi dedichi
Figurati.
--
- Carlo -

 riportare tutto il testo del messaggio precedente al fondo del tuo.
Ok.
Non sono un gran navigatore di NG per cui tendo a dimenticare le buone
maniere.
Ciao
Andrea Foresti

Ciao Carlo e tutto il NG
Con un po' di ritardo ho fatto le prove suggerite, cioč ho fatto una piccola
DLL con la mia procedura e la richiamo dall'applicazione.
Funziona a singhiozzo, per cui penso di dover rifinire un po' il codice.
Domanda.
In Win9x ho usato
SystemParametersInfo( SPI_SCREENSAVERRUNNING, Word(True), @VecchioValore,
0 );
per rendere inattivo il maledettto Alt+TAB, perň mi intercetta TUTTI i tasti
compresi alcuni banaletti (ma utili a me !!!) tra i quali Stamp (Print).
Dunque, non č possibile utilizzare l'hook anche in Win9x ?
Grazie
Andrea