Fie că este posibil pe id metoda de a învăța o fereastră a acestui proces

Pot obține mânerul ferestrei acestui proces prin identificarea procesului?

De fapt, IMHO poate să știe cineva unele funcții apishnye
este mult mai recunoscător

Este posibil ca o fereastră să afle dacă aparține procesului







Funcția GetWindowThreadProcessId preia identificatorul firului care a fost creat fereastra specificată și, opțional, identificatorul procesului.

și anume puteți selecta toate ferestrele.

Poate că nu pot, nu știu.

> Este posibil ca în procesul de identificare să se învețe o fereastră a acestui proces?

Așa cum se spune în [1], este posibil să treceți prin toate ferestrele procesului. Dar pentru a selecta cele de care aveți nevoie, trebuie să știți despre această fereastră pentru altceva, cu excepția faptului că este relevant pentru proces.

Multe mulțumiri pentru direcție, dar încă
DWORD GetWindowThreadProcessId (

# xA0; # xA0; HWND hWnd, // mâner de fereastră
# xA0; # xA0; LPDWORD lpdwProcessId # xA0; // adresa variabilei pentru identificatorul procesului
# xA0; );

ce să suprascrieți în hWnd dacă nu am nicio fereastră nu trădez 0 zero și întoarce :(

Ei bine, dă-i întrebarea ok :)) Cu un semn de întrebare, cu o virgulă etc.
Nu mă bat, nu am înțeles întrebarea. Sincer. )

Funcția GetWindowThreadProcessId necesită mânerul ferestrei.
Ce să transferați acolo. dacă nu cunosc manipularea ferestrelor, trebuie să le iau.
Pentru test am trece acolo 0 pe ieșire am 0.
Ce ar trebui să fac?
# xA0; Vă mulțumim anticipat!

1. Știți id-ul procesului.
2. Pentru a găsi toate ferestrele care aparțin acestui proces, trebuie să treceți prin toate ferestrele din sistem. Ie obțineți mânerul succesiv al tuturor ferestrelor.
3. După primirea mânerului din fereastra următoare, folosind funcția specificată de mine, verificați dacă fereastra aparține procesului (rețineți că trebuie să treceți un pointer în id-ul procesului și să nu luați rezultatul funcției - este o eroare standard).

Acum despre modul de sortare prin ferestre. Răspunsul este că nu știu. niciodată nu a făcut asta. Dar sunt sigur că dacă începeți să săpătați, începând cu funcția de câștig api enumwindows, cu siguranță veți reuși.

Acum înțeleg. Multe mulțumiri pentru oprire

h: = FindWindowEx (0, 0, zero, zero);
în timp ce (h <> 0) nu
# xA0; începe
# xA0; # xA0; # xA0; GetWindowThreadProcesId (h, @pid);
# xA0; # xA0; # xA0; dacă (pid = pi.dwProcessId) atunci
# xA0; # xA0; # xA0; # xA0;
# xA0; # xA0; # xA0; h: = FindWindowEx (0, h, zero, zero); // Căutați următoarea fereastră
# xA0; se încheie;

IMHO găsi mai bine toate firele procesului și căutați o fereastră în fire cu EnumThreadWindows. Cu atât mai mult că procesul nu are întotdeauna mai mult de un fir și nu întotdeauna în fire secundare au ferestre - sarcina poate fi simplificată.

procedura de căutare SearchHandle (ProcessId: DWORD; CallbackFunction: TFNWndEnumProc;
# xA0; # xA0; UnicID: LPARAM);
var
# xA0; HSnapShot: Thandle;
# xA0; te: TThreadEntry32;
începe
# xA0; // avem nevoie de un instantaneu al firelor
# XA0; HSnapShot: = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
# xA0; încercați
# xA0; # xA0; // înainte de a utiliza TThreadEntry32 trebuie să completați câmpul dwSize
# xA0; # xA0; te.dwSize: = dimensiunea (TThreadEntry32);
# xA0; # xA0; // dacă primește prima înregistrare a fluxurilor - continuăm
# xA0; # xA0; dacă Thread32First (HSnapShot, te) atunci
# xA0; # xA0; # xA0; repetați
# xA0; # xA0; # xA0; # xA0; // dacă acest thread este legat de procesul de interes pentru noi, atunci
# xA0; # xA0; # xA0; # xA0; // enumerați toate ferestrele create de acest thread
# xA0; # xA0; # xA0; # xA0; dacă te.th32OwnerProcessID = ProcessId atunci
# xA0; # xA0; # xA0; # xA0; # xA0; EnumThreadWindows (te.th32ThreadID, CallbackFunction, UnicID);
// obțineți o înregistrare a firului următor, dacă nu, ieșim din bucla
# xA0; # xA0; # xA0; până când (nu Thread32Next (HSnapShot, te));
# xA0; în cele din urmă
# xA0; # xA0; closehandle (HSnapShot); // închideți mânerul imaginii
# xA0; sfârșitul;
se încheie;

Funcție EnumWnd (Mâner: hwnd; UnicID: LPARAM): boolean; stdcall;
începe
# xA0; Rezultat: = Adevărat;
# xA0; PostMessage (Mâner, WM_CLOSE, 0, 0);
se încheie;

procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; SearchHandle (GetCurrentProcessId, @EnumWnd, 0);
se încheie;

SearchHandle caută toate ferestrele pentru procesul specificat. Când se găsește următoarea fereastră, este apelată funcția CallbackFunction, care este în acest caz # xA0; EnumWnd. Acesta trimite WM_CLOSE la toate ferestrele.

După cum se numește:
CăutațiHandle (GetCurrentProcessId, @EnumWnd, 0);
atunci codul duce la trimiterea de mesaje WM_CLOSE la toate ferestrele acestui proces.

> funcția EnumWnd (Mâner: hwnd; UnicID: LPARAM): boolean;
> stdcall;

# xA0; CALLBACK BOOL EnumThreadWndProc
# xA0; Deși, în acest caz, nu poate fi o chestiune de principiu,
# xA0; dar, în general, este necesar să fii mai atent cu hidingerele.

--
Cu sinceritate, LVT.

PS # xA0; Apropo, Toolhelp32 lipsește din NT4.

Și ce sa întâmplat? Nu am înțeles.


> Și ce sa întâmplat? Nu am înțeles.

Mi-aș scrie în loc de


> funcția EnumWnd (Mâner: hwnd; UnicID: LPARAM): boolean;
> stdcall;

funcția EnumWnd (Mâner: hwnd; UnicID: LPARAM): BOOL; stdcall;

Oh, da, pentru exemplul meu [10] trebuie să conectați unitatea TLHelp32

Nu știu. Și, în general, mă îndoiesc că WinApi are conceptul de "fereastră principală".







Mai bine explicați sarcina - de ce aveți nevoie de fereastra principală? Se pare că nu înțelegi nimic.

Aceasta este de la sine. Dar, prin aceasta nu te vei întoarce;)
Formal, NT4 are încă dreptul la viață și acolo
concepte precum funcțiile ToolHelp, nr.
Ie include nota "exclusiv NT4".

Nu știu de ce, dar sub DELPHI 7 TollHelp32 nu funcționează. dar la 5 lucrări Delphi. și nici nu se știe de ce

Și în loc de abstract "nu funcționează" de ce nu spune exact unde este gagul?

P.S. Din moment ce am nivelul de telepatie are al doilea nivel, încerc să spun - doar ai pus în funcțiune EnumWnd Directiva stdcall;

Bineînțeles că îmi pare rău, dar unde se face EnumWnd.

începe
# xA0; H: = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
# xA0; Memo1.Clear;
# xA0; dacă Process32First (H, P) atunci
# xA0; # xA0; Memo1.Lines.Add (P.szExeFile)
# xA0; până când Process32Next (H, P) = False;
Acest cod de pe D5 funcționează.Acesta arată toate procesele, dar pe D7 nu funcționează.Acesta nu arată nici o înregistrare (WIN XP)
prin felul în care este valabilă directiva stdcall, dar este folosită într-un timp mai scurt, dar funcționează încă (sub D5)

Ei bine, care este punctul de joc în tăcere? De ce informațiile ar trebui să fie scoase, ca și când aș avea nevoie de ea. )

WHAT returnează CreateToolhelp32Snapshot? În cazul în care mânerul eronat - ce se întoarce GetLastError?

începe
H: = CreareToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
Dacă Process32First (H, P) atunci
# xA0; Memo1.Lines.Add (P.szExeFile)
până când Process32Next (H, P) = False;

NDA, plâng. Propun să găsesc eroarea însăși.

P.S. Și, de asemenea, ar fi frumos să știți - de unde ați obținut acest lucru, dacă [10] am dat codul de lucru? De la întrebările mele frecvente "și ce?

Sori, eu sunt deja lazhanulsya. Tocmai ați remodelat exemplul pentru a găsi procesele. Ok, atunci există întrebări:

WHAT returnează CreateToolhelp32Snapshot? În cazul în care mânerul eronat - ce se întoarce GetLastError?

Dacă prin „fereastra principală“ pentru a înțelege fereastra pentru care a crea un buton de pe bara de activități, puteți verifica (cu POM GetWindowLong) stil extins pentru prezența caracteristică cheie în bara de activități (WS_EX_APPWINDOW).

Ferestrele afișate pe bara de activități nu au neapărat un stil # xA0; WS_EX_APPWINDOW. Mai exact, majoritatea ferestrelor afișate pe bara de activități nu au acest stil :)

IMHO, prima fereastră creată de aplicație este "principala", adică este afișată pe bara de activități

Și apoi cum definesc fereastra din bara de activități?

WS_EX_APPWINDOW
Forțează o fereastră de nivel superior pe bara de activități atunci când fereastra este vizibilă.


> Și cum se va afișa atunci fereastra din bara de activități?

(Doar făcut un upgrade, fișierele diavolului știe unde, îmi pare rău, că trebuie să dai un link către site-ul)

Scleroza mea. Am văzut-o acum câteva zile.

Apropo, criteriul dvs. este, de asemenea, inexact :-)

Verificare de la EnumFunctions_60
dacă (WindowOwner = 0) ȘI
# xA0; # xA0; ((ExStyle și WS_EX_TOOLWINDOW) = 0) ȘI
# xA0; # xA0; ((WinStyle și WS_VISIBLE) <> 0) atunci

nu trece o astfel de fereastră

# xA0; CreateWindowEx (WS_EX_APPWINDOW sau WS_EX_TOOLWINDOW,
# xA0; # XA0; "BUTTON", "I" "m pe bara de activități", WS_VISIBLE, 0, 0, 0, 0, HWND_DESKTOP, 0, 0, 0);

Mulțumesc. Din păcate, practic nu actualizez site-ul.

Verificarea ar trebui să arate în mod evident (verificați):

dacă (WindowOwner = 0) și ((WinStyle și WS_VISIBLE) <> 0) și
# xA0; (((ExStyle și WS_EX_TOOLWINDOW) = 0) sau ((ExStyle și WS_EX_APPWINDOW) <> 0)) atunci

și ce spui:

> Verificarea, evident ar trebui să arate astfel (trebuie verificată):
>
> dacă (WindowOwner = 0) și ((WinStyle și WS_VISIBLE) <> 0)
> și
> # xA0; (((ExStyle și WS_EX_TOOLWINDOW) = 0) sau ((ExStyle și
> WS_EX_APPWINDOW) <> 0)) atunci

Verificarea ar trebui să arate astfel (puteți verifica):


funcția IsTaskbarBtnExist (h: HWND): Boolean;
var
# xA0; exstyle: Longint;
începe
# xA0; Rezultat: = IsWindowVisible (h);
# xA0; dacă rezultatul este atunci
# xA0; # xA0; începeți
# xA0; # xA0; # xA0; exstyle: = GetWindowLong (h, GWL_EXSTYLE);
# xA0; # xA0; # xA0; Rezultat: = exstyle și WS_EX_APPWINDOW <> 0;
# xA0; # xA0; # xA0; dacă nu rezultatul și
# xA0; # xA0; # xA0; # xA0; (exstyle și WS_EX_TOOLWINDOW = 0) atunci
# xA0; # xA0; # xA0; # xA0; Rezultat: = GetWindowLong (h, GWL_HWNDPARENT) = 0;
# xA0; # xA0; se încheie;
se încheie;

În absența definiției "ferestrei principale", orice declarație
pot fi reprezentate ca fiind adevărate.

--
Cu sinceritate, LVT.

PS Sobs - dar, este mai ușor să fii călăuzit de scopul: "de ce este nevoie
această fereastră ".

Ceea ce contează nu este ordinea, ci stilurile și proprietarul.
Într-o aplicație VCL, de obicei, nici o formă nu este vizibilă în TaskBar, pentru aceasta este folosită fereastra Application.Handle.

tip
# xA0; TForm1 = clasa (TForm)
# xA0; privat
# xA0; # xA0;
# xA0; protejate
# xA0; # xA0; procedura CreateParams (var Params: TCreateParams); suprascrie;
# xA0; public
# xA0; # xA0;
# xA0; sfârșitul;

var
# xA0; Form1: TForm1;

procedura TForm1.CreateParams (var Params: TCreateParams);
începe
# xA0; moștenit;
# xA0; // oricare dintre următoarele linii are ca rezultat o formă pe bara de activități
# xA0; Params.WndParent: = HWND_DESKTOP;
# xA0; Params.ExStyle: = Params.ExStyle sau WS_EX_APPWINDOW;
se încheie;

Un pic de experimentare a ajuns la concluzia că cecul ar trebui să arate astfel:
dacă (WindowOwner = 0) și ((WinStyle și WS_VISIBLE) <> 0) și ((WinStyle și WS_CHILD) = 0) și
# xA0; ((((ExStyle și WS_EX_TOOLWINDOW) = 0) sau ((ExStyle și WS_EX_APPWINDOW) <> 0)) atunci

Trebuie să faceți niște teste pe fiecare fereastră de către EnumWindows () la
să decidă ori să o arate sau nu. Testul a fost descris de Jeffrey Richter
"Nov 97" a MSJ Citat:

"Regulile pe care le utilizează bara de activități pentru a decide dacă trebuie afișat un buton
pentru o fereastră sunt într-adevăr destul de simple, dar nu sunt bine documentate.
Când creați o fereastră, bara de activități examinează fereastra extinsă
stil pentru a vedea dacă WS_EX_APPWINDOW (definit ca 0x00040000) sau
WS_EX_TOOLWINDOW (definit ca 0x00000080) este activat. dacă
WS_EX_APPWINDOW este activat, bara de activități afișează un buton pentru
fereastră, iar dacă WS_EX_ TOOLWINDOW este activat, bara de activități nu are
afișează un buton pentru fereastră. Nu ar trebui să creați niciodată o fereastră
are ambele stiluri extinse.

Puteți crea o fereastră care nu are nici unul dintre aceste stiluri.
fereastra nu are stil, bara de activități decide să creeze un buton dacă
fereastra nu este utilizată și nu creează un buton dacă fereastra este
Am deținut.

O notă finală: înainte de a efectua oricare dintre testele de mai sus, bara de activități
verificați mai întâi dacă o fereastră are fereastra standard WS_VISIBLE
stil pornit. Dacă acest stil este dezactivat, fereastra este ascunsă;
bara de activități nu afișează niciodată un buton pentru o fereastră ascunsă. Numai dacă
Stilul WS_VISIBLE este pe bara de activități, verificați WS_EX_APPWINDOW,
WS_ EX_TOOLWINDOW și informații despre proprietatea asupra ferestrelor. "

Care, BTW, David Lowndes a postat în acest grup de mai multe ori în trecut

Inexactitatea este că dacă fereastra este WS_CHILD, atunci nici una # xA0; WS_EX_APPWINDOW nu va ajuta - puteți verifica.

PS: o dispută interesantă despre orice.


>> IMHO, prima fereastră creată de aplicație este
> "principalul lucru",
>> aceasta este afișată pe bara de activități

> Inexactitatea este că dacă fereastra este WS_CHILD, atunci nici una # xA0; WS_EX_APPWINDOW
> nu te ajuta - poti verifica.

Și unde merge WS_CHILD?
Era vorba despre EnumWindows ferestre de nivel superior.


> PS: o dispută interesantă despre orice.

Aceasta se numește o discuție, IMHO.







Articole similare

Trimiteți-le prietenilor: