Avatar billede atlanta Nybegynder
16. januar 2003 - 00:33 Der er 14 kommentarer og
1 løsning

replacement af alt+tab tingen

som del af et Shell Replacement ville jeg gerne ændre hvordan  den box der kommer frem når trykker man alt+tab, ser ud.

nu har jeg den sidste uges tid sidet og ledt diverse nyhedgrupper igennem for at finde frem til en løsning, der var massere der spurte men ikke nogen som var kommet med et ordenligt svar. jeg har samtidig kikket windows SDK hjælpen igennem for alt hvad jeg kunne finde nytting for at finde handles på winduet og diverse søgerutiner for at finde formen  men intet held. Jeg har også kikket efter den med WinSight men som jeg regnede med fra starten fik jeg heller ikke noget ud af det :/.

jeg fik af vide af en jeg ikke har kunne få fat på sidenhen at dets handle skulle være #32771 hvilket jeg også har brugt i mine funktioner og funktioner som GetClassName, FinWindow (de eneste jeg lige kunne huske i hovet)

hjæææælp :D
Avatar billede dkn Nybegynder
16. januar 2003 - 01:03 #1
ved ikke om det er muligt at overskrive den hotkey med registerhotkey() men det er et forsøg hver.
Desuden kan du ikke søge efter classen "#32771" da alle dialoger hedder det.
Men det kan ihvertefald lade sig gøre på en måde...
Avatar billede hermandsen Juniormester
16. januar 2003 - 01:32 #2
Ved ikke om dette kan hjælpe dig fra start:
http://www.infojet.cz/program/delphi/tips/tip0004.html
Avatar billede atlanta Nybegynder
16. januar 2003 - 07:46 #3
dkn: ok jeg fik bare af vide den hed det så :) men hvis alle hedder det så kan jeg da meget godt forstå at det ikke funker så godt :D

hermandsen: jeg har prøvet niget med den der SystemParametersInfo men det virker kun til win95 og kan ikke huske med 98 men jeg kan lige prøvet efter. jeg mener det var dne der kode som jeg også prøvede med for den poppede konstant op på nyhedsgrupper :/
Avatar billede athlon-pascal Juniormester
16. januar 2003 - 12:48 #4
Den virker også i Win98.
Desværre virker den ikke i WinNT / Win2000 / WinXP (er dog ikke helt sikker med XP)
Avatar billede borrisholt Novice
17. januar 2003 - 08:29 #5
Det er i gang med hedder en Shell Extention. Microsoft brskriver ganske godt i MSDN hvad man kan pille ved ...
Kig her :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_intro.asp

DET ER IKKE et konkret link, men et link til Microsofts dokumentation af Shell API'et

Jens B
Avatar billede siz23 Nybegynder
23. januar 2003 - 17:53 #6
kunne man ikke bare lave en Windows Hook på keyboarded, også sætter den til at ingore alt+tab, og derefter lave sin egen visning af dialogen.
Avatar billede borrisholt Novice
24. januar 2003 - 08:17 #7
For det første så kan et Hook ikke dæmme op for ALT + TAB.

For det andet er det slet ikke det manden vil. Læs spørgsmålet :-)

Jens B
Avatar billede atlanta Nybegynder
25. januar 2003 - 14:32 #8
det var faktisk det jeg ville borris.. jeg  ville customize dialogen så den passede ind i det design som shellet havde.. men noget andet er så bare.. at jeg har været lidt skæv og ikke kommenterer tilbage at jeg faktisk fandt noget der kunne bruges.. jeg fiflede rundt inde på det link du gav mig og kom vidt omkring og endelig fandt jeg et program der kunne.. det er nemlig pga at alt+tab og ctrl+esc og alt+ctrl+del ryger ind under en speciel ketegori som gør at man lan hooke dem men hvis det program der hooker ikke laver noget fx går død så vil windows stoppe den hook så du altid vil kunne bruge disse knapper. og derfor er det først blevet muligt i sp3 til win2k og xp problemet er bare at det er c/c++ kode det eksempel de har lavet.. jeg skal lige se om jeg får tid her en af dagene til at oversætte det, er bare ikke helt stiv i det så :D
Avatar billede borrisholt Novice
25. januar 2003 - 14:34 #9
Send lige programmer til Jens@Borrisholt.com C++ programmet altså.

Jens B
Avatar billede atlanta Nybegynder
30. januar 2003 - 22:23 #10
mange tak borris.. :D du lavede godt nok en fejl :P

    Result := CallNextHookEx(Null, nCode, wParam, lParam);
skulle være
    Result := CallNextHookEx(hhkLowLevelKybd, nCode, wParam, lParam);

:D men tak igen
Avatar billede borrisholt Novice
31. januar 2003 - 09:36 #11
?
Avatar billede borrisholt Novice
31. januar 2003 - 09:37 #12
Lavede jeg ikke programmet for idg ?
Avatar billede athlon-pascal Juniormester
31. januar 2003 - 10:18 #13
JB -> Fejl! Dine to sidste indlæg er tomme (mon ikke de kommer igen)...

atlanta -> Burde borrisholt ikke have fået nogle points?
Avatar billede borrisholt Novice
31. januar 2003 - 13:24 #14
her er løsningen :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
const
  WH_KEYBOARD_LL = 13;
  WH_MOUSE_LL = 14;

(*
* Low level hook flags
*)
  LLKHF_EXTENDED =  $01;
  LLKHF_INJECTED =  $10;
  LLKHF_ALTDOWN  =  $20;
  LLKHF_UP      =  $80;



(*
  FROM MSDN :

typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*)

type
  ULONG_PTR = ^DWORD;
  KBDLLHOOKSTRUCT = packed record
    vkCode,
      scanCodem,
      flags,
      time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  pKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

function LowLevelKeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  fEatKeystroke: BOOL;
  p: pKBDLLHOOKSTRUCT;
begin
  fEatKeystroke := False;

  if nCode = HC_ACTION then
  begin
    case wParam of
      WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP:
        begin
          p := pKBDLLHOOKSTRUCT(lParam);
          fEatKeystroke :=
            ((p^.vkCode = VK_TAB)    and ((p^.flags and LLKHF_ALTDOWN) <> 0)) or
            ((p^.vkCode = VK_ESCAPE) and  ((p^.flags and LLKHF_ALTDOWN) <>  0))  or
            ((p^.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000)<> 0));
        end;
    end;
  end;

  if fEatKeystroke then
    Result := 1
  else
    Result := CallNextHookEx(hhkLowLevelKybd, nCode, wParam, lParam);
end;

var
  hhkLowLevelKybd: HHOOK;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Tag := 1 - Button1.Tag;

  if Button1.Tag = 1 then
  begin
    hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
    ShowMessage('Enabled');
  end
  else
  begin
    UnhookWindowsHookEx(hhkLowLevelKybd);
    ShowMessage('Disabled');
  end;
end;

end.


Jens B
Avatar billede atlanta Nybegynder
01. februar 2003 - 18:04 #15
jeg har da ikke sagt at du ikke lavede det for mig ? jeg sagde bare du havde lavet en fejl og jeg fik dne rettet.. du havde skrevet Null som første parameter til CallNextHookEx hvilket bare burde have været hhkLowLevelKybd

og jeg ville da gerne have givet borris points.. men jeg gik ud fra han ikke ville have dem da ingen af hans kommentarer var givet som svar..

men giv da lige lyd hvis du gerne vil have pointsne
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester