Avatar billede j-johansen Nybegynder
21. oktober 2003 - 23:11 Der er 5 kommentarer og
2 løsninger

Anden metode end FindWindow

Findes der ikke en anden metode end "FindWindow" hvis man skal have det "nummer" et program har før man fx kan "traine" det? Hvis man fx har windowsxp kan man under processer se procesnavnet... kan man ikke "søge" efter det så man kan sætte sit program til at lede efter "notepad.exe" i stedet for "Unavngivet - Notesblok" ???
Avatar billede Slettet bruger
21. oktober 2003 - 23:16 #1
Prøv det her:

Uses TlHelp32;

Type
  TEnumData = Record
    hW: HWND;
    pID: DWORD;
  End;

Function EnumProc( hw: HWND; Var data: TEnumData ): Bool; stdcall;
  Var
    pID: DWORD;
  Begin
    Result := True;
    If (GetWindowLong(hw, GWL_HWNDPARENT) = 0) and
      (IsWindowVisible( hw ) or IsIconic(hw))
    Then Begin
      GetWindowThreadProcessID( hw, @pID );
      If pID = data.pID Then Begin
        data.hW := hW;
        Result := False;
      End; { If }
    End; { If }
  End; { EnumProc }

Function WindowFromProcessID( pID: DWORD ): HWND;
  Var
    data: TEnumData;
  Begin
    data.pID := pID;
    data.hW := 0;
    EnumWindows( @EnumProc, longint(@data) );
    Result := data.hW;
  End; { WindowFromProcessID }

Function WindowFromAppname32( appname: String ): HWND;
  { Take only the application filename, not full path!
    Need to pass the extension as well. }
  Var
    snapshot: THandle;
    processEntry : TProcessEntry32;
  Begin
    Result := 0;
    snapshot := CreateToolhelp32Snapshot(
                  TH32CS_SNAPPROCESS,
                  0 );
    If snapshot <> 0 Then
    try
      processEntry.dwSize := Sizeof( processEntry );
      If Process32First( snapshot, processEntry ) Then
      Repeat
        If AnsiCompareText(
            appname,
            ExtractFilename( StrPas(processEntry.szExeFile))
            ) = 0
        Then Begin
          Result:= WindowFromProcessID( processEntry.th32ProcessID);
          Break;
        End; { If }
      Until not Process32Next( snapshot, processEntry );
    finally
      CloseHandle( snapshot );
    End; { try }
  End; { WindowFromAppname32 }
Avatar billede Slettet bruger
21. oktober 2003 - 23:19 #2
Så får du nummeret sådan:

procedure TForm1.Button1Click(Sender: TObject);
var
Nummeret: HWND;
begin
Nummeret := WindowFromAppname32('notepad.exe');
end;
Avatar billede squashguy Nybegynder
21. oktober 2003 - 23:31 #3
en anden måde:

WindowName er valgfri i FindWindow() (sæt den til null)
Du kan nøjes med at angive ClassName "notepad"

Du kan så finde process id med GetWindowThreadProcessId()
Avatar billede squashguy Nybegynder
21. oktober 2003 - 23:38 #4
alt efter hvad du skal lave, kan du jo også bruge CreateProcess()
Avatar billede j-johansen Nybegynder
21. oktober 2003 - 23:42 #5
kan man ændre i "
    If (GetWindowLong(hw, GWL_HWNDPARENT) = 0) and
      (IsWindowVisible( hw ) or IsIconic(hw))
"
så man også kan få "nummeret" på skjulte programmer?

squashguy -> ????
Avatar billede j-johansen Nybegynder
21. oktober 2003 - 23:44 #6
Jeg fjernede and (IsWindowVisible( hw ) or IsIconic(hw)) og nu virker det... men vil stadig godt lige høre hvad squashguy mener...
Avatar billede j-johansen Nybegynder
21. oktober 2003 - 23:56 #7
Okay fandt ud af det... Skulle vel læses nogle gange :D
Giver 30 point til hver da begge ting virker :)
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