Avatar billede TRoXa Novice
06. maj 2004 - 10:09 Der er 3 kommentarer og
1 løsning

Application hook ting ?

Jeg ved ikke helt hvad jeg skulle kalde emnet, så derfor det navn.

Det jeg søger er på en eller anden måde at fange programmer der kører lige nu delt op på følgende måde : Start Bjælken og Tray.

Jeg skal på en eller anden måde have en liste over de ting, så jeg i teorien kunne lave min egen start bjælke med programmer der kører samt mit eget tray system.

Ved ikke om jeg har forklaret mig godt nok. Ellers spørg.

Har brug for et eksempel på det eller sider med information om det, så jeg selv kan lave det. Det skal helst være uden brug af komponenter, men hvis der skal bruges komponenter til det skal det være freeware, da jeg ikke er millionær hehe.

Håber der er nogen derude der kan hjælpe.
Avatar billede hrc Mester
14. maj 2004 - 23:54 #1
Jeg fandt engang et eksempel, skrevet i C++, som jeg efterfølgende Defphificerede. Programmet kunne sortere programmerne i startlinien (på en ret bøvet måde - det virkede) - hoveddelen i programmet var at hente alle kørende processer ind i en liste.

Vedlægger det meste af koden:

const
  StLgd = 255;

type
  TWindowClass = class
  private
    fHandle : HWND;
    fName : string;
  public
    constructor Create(aHandle : HWND);
    destructor Destroy; override;
    procedure Draw(aCanvas : TCanvas; aRect : TRect);
    property Handle : HWND read fHandle;
    property Name : string read fName;
    function IsVisible : boolean;
    function HasParent : boolean;
    function IsToolWindow : boolean;
    function IsMe(const aThisForm : HWND) : boolean;
    function IsValid(const aThisForm : HWND) : boolean;
  end;

{ TWindowClass }

constructor TWindowClass.Create(aHandle: HWND);
var
  szWinText : pchar;
begin
  inherited Create;
  fHandle := aHandle;

  getmem(szWinText,StLgd+1);
  try
    GetWindowText(fHandle, szWinText,StLgd);
    fName := string(szWinText);
  finally
    freemem(szWinText,StLgd+1);
  end; // try
end;

destructor TWindowClass.Destroy;
begin
  try
  finally
    inherited;
  end; // try
end;

procedure TWindowClass.Draw(aCanvas: TCanvas; aRect : TRect);
begin
  aCanvas.TextRect(aRect,aRect.Left+32,aRect.Top+2,fName);
end;

function TWindowClass.HasParent: boolean;
begin
  result := (GetParent(fHandle) <> 0);
end;

function TWindowClass.IsMe(const aThisForm: HWND): boolean;
begin
  result := fHandle = aThisForm;
end;

function TWindowClass.IsToolWindow: boolean;
begin
  result := ((GetWindowLong(fHandle, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) <> 0);
end;

function TWindowClass.IsValid(const aThisForm : HWND) : boolean;
begin
  result := not (HasParent or IsToolWindow or IsMe(aThisForm)) and IsVisible;
end;

function TWindowClass.IsVisible: boolean;
begin
  result := IsWindowVisible(fHandle);
end;

// -----------------------------------------------------------------------------
// FORM EVENTS FORM EVENTS FORM EVENTS FORM EVENTS FORM EVENTS FORM EVENTS FORM
// -----------------------------------------------------------------------------

procedure TfrmMain.FormDestroy(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to lbWindows.Count - 1 do
    lbWindows.Items.Objects[i].Free;
end;

// -----------------------------------------------------------------------------
// BUTTONS BUTTONS BUTTONS BUTTONS BUTTONS BUTTONS BUTTONS BUTTONS BUTTONS BUTTO
// -----------------------------------------------------------------------------

procedure TfrmMain.btnFetchClick(Sender: TObject);
var
  hWndCurWin, hWndDesk: HWnd;
  ThisHandle : TWindowClass;
begin
  hWndDesk:= GetDesktopWindow; // This ist the parent of alle top-level windows
  if hWndDesk = 0 then
    exit;

  hWndCurWin := GetWindow(hWndDesk,GW_CHILD);

  lbWindows.Items.BeginUpdate; // Fill ListBox
  try
    lbWindows.Clear;
    ValidateButtons(-1, 0); // Disable buttons

    while (hWndCurWin <> 0) do begin
      ThisHandle := TWindowClass.Create(hWndCurWin);
      if ThisHandle.IsValid(self.Handle) then
        lbWindows.Items.AddObject(ThisHandle.Name,ThisHandle)
      else
        ThisHandle.Free; // Was a dud - erase again

      hWndCurWin := GetWindow(hWndCurWin,GW_HWNDNEXT); // MSDN advise use of EnumChildWindows
    end;
  finally
    lbWindows.Items.EndUpdate;
  end; // try
end;
Avatar billede TRoXa Novice
18. maj 2004 - 09:19 #2
hrc > Det du skal forestille dig er, at startmenu bjælken slet ikke er til stede, da jeg har mit eget program kørende som shell...
Avatar billede hrc Mester
18. maj 2004 - 10:20 #3
Det tror jeg nok at jeg forstod (kan ikke huske det - alderen trykker). En af delopgaverne er, i alt fald, at finde de kørende programmer.

Jeg prøvede at søge lidt efter "replace taskbar" og fandt følgende link, der sammenfatter de forskellige programmer der allerede findes:

http://shellcity.net/cgi-bin/DB_Search/db_search.cgi?setup_file=topicpage.setup.cgi&submit_search=yes&topic=A.

Siden: shellcity.net er i øvrigt vist ret interessant og har masser af information om hvor man kan fortsætte sin søgen, f.eks. her:

Måske kan du kontakte nogle af de fyre som arbejder på "Reveal" (http://reveal.unpaved.com/reveal_index.html)
Avatar billede TRoXa Novice
21. maj 2004 - 10:58 #4
Jeg takker for dit svar hrc :) Det gør ihvertfald, at jeg kan komme lidt videre :)
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