Lehetséges, hogy megtanulják az id prosessa kilincset az ablak prosessa

Lehetséges, hogy megtanulják azonosító prosessa kilincset az ablak prosessa?

Tulajdonképpen IMHO is valaki, hogy mi -, hogy apishnye funkció
előzetesen hálás

megtalálható a Handley ablak ha tartozik a folyamat

A GetWindowThreadProcessId funkció lekéri a azonosítója a menet, amely létrehozta a megadott ablakot, és, adott esetben, az azonosító az eljárás, hogy az ablakot létrehozta.

azaz mind prebrat ablakot.

Ellenkező esetben lehet, nem tudom.

> Lehetséges, hogy megtanulják azonosító prosessa kilincset az ablak prosessa?

Amint az [1], akkor járja körbe a folyamat ablakot. De ahhoz, hogy válassza ki a megfelelőt meg kell tudni ezt az ablakot valami mást, kivéve azt, hogy prinazhlezhit dannomk folyamatot.

Nagyon köszönöm, hogy küldött, de még mindig
DWORD GetWindowThreadProcessId (

# XA0; # XA0; HWND hwnd, // nyele ablak
# XA0; # XA0; LPDWORD lpdwProcessId # XA0; // változó címét az eljárás azonosítója
# XA0; );

hogy operedavat a HWND ha nincs windows elismerésemet 0 nulla és visszatér :(

Nos napragis, kérdés megfelelő :)) A kérdőjel, vessző, és így tovább.
Én nem gúnyos, én nem értem a kérdést. Őszintén. )

GetWindowThreadProcessId funkció megköveteli a kilincs.
Mi át. ha nem tudom, Handl-s ablakok Meg kell kérni őket.
Hogy a vizsgálaton, hogy 0 a kimenet 0.
Mit kell tenni?
# XA0; Köszönöm előre!

1. Tudod, hogy a folyamat id.
2. Annak érdekében, hogy megtalálják az összes ablakot tartozó e folyamat, meg kell rendezni az összes ablakot a rendszer. Ie kap következetesen kezelni az összes ablakot.
3. Miután megkapta kezelni a következő ablak használ a megadott nekem funkció ellenőrzi, hogy az ablak tartozik az eljárás (megjegyzendő, hogy át kell adni egy mutatót a folyamat azonosítóját, és nem veszi a függvény eredménye - ez standratnaya hiba).

Most, hogyan megy át az ablakon. Válasz - Nem tudom, mert Soha nem lett volna rá. De biztos vagyok benne, hogy ha elkezd ásni, mivel a funkció win api enumwindows, biztos dobeshsya siker.

Most rájöttem. Sok kösz a tippet

h: = FindWindowEx (0, 0, nulla, nulla);
míg a (h <> 0) do
# XA0; kezdődik
# XA0; # XA0; # XA0; GetWindowThreadProcessId (H, @pid);
# XA0; # XA0; # XA0; ha (pid = pi.dwProcessId), majd
# XA0; # XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; H: = FindWindowEx (0, h, nulla, nulla); // keressük meg a következő ablakban
# XA0; végén;

IMHO jobb találni minden szálat, és megtalálja azt az ablakot, patakok segítségével EnumThreadWindows. Minél több, hogy nem mindig van több mint egy folyamatáramban és nem mindig másodlagos szál van egy ablak - a feladat egyszerűsíthető.

eljárás SearchHandle (processID: DWORD; CallbackFunction: TFNWndEnumProc;
# XA0; # XA0; UnicID: lParam);
var
# XA0; HSnapShot: THandle;
# XA0; te: TThreadEntry32;
kezdődik
# XA0; // szükségünk van egy kép stream
# XA0; HSnapShot: = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
# XA0, próbálja
# XA0; # XA0; // használata előtt TThreadEntry32 kell kitölteni a mezőket dwSize
# XA0; # XA0; te.dwSize: = sizeof (TThreadEntry32);
# XA0; # XA0; // ha az első rekord az áramlások kapott - tovább
# XA0; # XA0; ha Thread32First (HSnapShot, TE), majd
# XA0; # XA0; # XA0; ismétlés
# XA0; # XA0; # XA0; # XA0; // ha az áramot arra a folyamatra utal érdekes számunkra,
# XA0; # XA0; # XA0; # XA0; // felsorolni az összes ablakot készítette ezt az áramot
# XA0; # XA0; # XA0; # XA0; ha te.th32OwnerProcessID = processID majd
# XA0; # XA0; # XA0; # XA0; # XA0; EnumThreadWindows (te.th32ThreadID, CallbackFunction, UnicID);
// kap a rekordot a következő menet, ha nem kap a - kijutni a ciklus
# XA0; # XA0; # XA0; addig, amíg (nem Thread32Next (HSnapShot, TE));
# XA0, végül
# XA0; # XA0; closehandle (HSnapShot); // bezárja a fogantyút a képet
# XA0; end;
végén;

funkció EnumWnd (fogantyú: hwnd; UnicID: lParam): logikai; stdcall;
kezdődik
# XA0; Eredmény: = true;
# XA0; PostMessage (Handle, WM_CLOSE, 0, 0);
végén;

eljárás TForm1.Button1Click (Sender: TObject);
kezdődik
# XA0; SearchHandle (GetCurrentProcessId, @EnumWnd, 0);
végén;

SearchHandle megkeresi az összes megadott eljárás ablakot. Ha megtaláljuk a következő ablak nevű CallbackFunction funkció, ami ebben az esetben # XA0; EnumWnd. Küld WM_CLOSE az összes ablakot.

Mivel a hívás:
SearchHandle (GetCurrentProcessId, @EnumWnd, 0);
A kód eredménye üzeneteket küldjenek WM_CLOSE az összes ablak a folyamatban.

> Funkció EnumWnd (Fogantyú: hwnd; UnicID: lParam): logikai;
> Stdcall;

# XA0; BOOL CALLBACK EnumThreadWndProc
# XA0, bár ebben az esetben előfordulhat, hogy nem számít,
# XA0, de valójában inkább azzal kellene óvatos a Hyder.

--
Tisztelettel LVT.

PS # XA0; Mellesleg, Toolhelp32 hiányzik NT4.

és mi a rossz? Nem értettem.


> Mi a baj? Nem értettem.

Írtam volna helyette


> Funkció EnumWnd (Fogantyú: hwnd; UnicID: lParam): logikai;
> Stdcall;

funkció EnumWnd (fogantyú: hwnd; UnicID: lParam): BOOL; stdcall;

Ja, az én például [10] kell csatlakoztatni a készüléket TLHelp32

Nem tudom. Általában, kétlem, hogy WinAPI van a „fő ablakban.”

Jobban magyarázza a problémát - miért akar a fő ablakban? Úgy látszik, akkor valamit rosszul tudod.

Ez önmagában. De ez nem fog kibújni;)
Formálisan, NT4 még joga van az élethez, és van egy ilyen
dolog, mint ToolHelp funkciókat, nem.
Ie kapcsolja be a megjegyzést: „kivéve NT4”.

Nem tudom, miért, de alá Delphi 7 TollHelp32 nem működik. de 5 Delphi működik. és nem is tudom, miért

És ahelyett, hogy az absztrakt „nem működik”, miért nem mondja, hogy pontosan hol dugulás?

Ui Mivel én is a szint telepátia a második szinten, azt próbálja mondani - csak hogy a funkció EnumWnd irányelv stdcall;

Én biztosan izvenyayus de hol van EnumWnd.

kezdődik
# XA0; H: = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
# XA0; Memo1.Clear;
# XA0; Ha Process32First (H, P), majd
# XA0; # XA0; Memo1.Lines.Add (P.szExeFile)
# XA0; amíg Process32Next (H, P) = false;
Ez a kód működik a D5 azaz megmutatja az összes folyamatot, és D7 nem működik, azaz nem mutat semmilyen rekordot (WIN XP)
stdcall irányelv mellesleg érdemes de használjuk pozhzhe, de még mindig működik (a D5)

Nos, mi az értelme játszani a csend? Miért van az összeállításához szükséges információk, mintha szükségem van rá. )

Ami miatt CreateToolhelp32Snapshot? Ha rossz Handle - amely visszaadja GetLastError?

kezdődik
H: = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
Ha Process32First (H, P), majd
# XA0; Memo1.Lines.Add (P.szExeFile)
amíg Process32Next (H, P) = false;

Igen, én plakal. Felajánlom, hogy megtalálják a hibát.

Ui És jó lenne tudni - hogyan valóban volt, amikor én vezettem egy működő kódot [10]? Az én FAQ „és mi is ez?

Sori, már lazhanulsya. Te csak remake-jét például keresési folyamatok. Ok, akkor a kérdés továbbra is az:

Ami miatt CreateToolhelp32Snapshot? Ha rossz Handle - amely visszaadja GetLastError?

Ha a „fő ablakban”, hogy megértsék az ablak, amely a létre egy gombot a tálcán, akkor megtekintéséhez (pom GetWindowLong) kiterjesztette stílus jelenlétére legfontosabb jellemzője a tálcán (WS_EX_APPWINDOW).

Az ablakok a tálcán nem feltétlenül kell a stílust # XA0; WS_EX_APPWINDOW. Pontosabban, a legtöbb ablak jelenik meg a tálcán, hogy a stílus nem :)

IMHO, az első ablak által létrehozott egy alkalmazást, és van egy „dolog”, ami megjelenik a tálcán

És mintha annak meghatározására, egy ablak jelenik meg a tálcán?

WS_EX_APPWINDOW
Kényszeríti a felső szintű ablak a tálcán, amikor az ablak látható.


> És akkor hogyan kell meghatározni az ablak jelenik meg a tálcán?

(Csak ezt a frissítést, az ördög tudja, hol a fájlok, sajnálom, hogy meg kell adni egy linket a honlapon)

Saját sclerosis. Néztem, hogy néhány nappal ezelőtt.

By the way, a teszt túl pontatlan :-)

Távozás EnumFunctions_60
ha (WindowOwner = 0) ÉS
# XA0; # XA0; ((ExStyle ÉS WS_EX_TOOLWINDOW) = 0) ÉS
# XA0; # XA0; ((WinStyle ÉS WS_VISIBLE) <> 0), akkor

Ez nem adja át ezt az ablakot

# XA0; CreateWindowEx (WS_EX_APPWINDOW vagy WS_EX_TOOLWINDOW,
# XA0; # XA0; "gomb", "I", "m tálcán", WS_VISIBLE, 0, 0, 0, 0, HWND_DESKTOP, 0, 0, 0);

Köszönöm. Sajnos, én szinte nem frissíti az oldalt.

Ellenőrizze nyilván kell kinéznie (ellenőrizni kell):

ha (WindowOwner = 0) és ((WinStyle és WS_VISIBLE) <> 0) és
# XA0; (((ExStyle és WS_EX_TOOLWINDOW) = 0) vagy ((ExStyle és WS_EX_APPWINDOW) <> 0)), majd

és mit mondasz:

> Ellenőrizze nyilván kell kinéznie (ellenőrizni kell):
>
> Ha (WindowOwner = 0) és ((WinStyle és WS_VISIBLE) <> 0)
> és
> # XA0; (((ExStyle és WS_EX_TOOLWINDOW) = 0) vagy ((ExStyle és
> WS_EX_APPWINDOW) <> 0)), majd

Nézz kell kinéznie (ellenőrizheti):


működnek IsTaskbarBtnExist (h: HWND): Boole;
var
# XA0; exstyle: Longint;
kezdődik
# XA0; Eredmény: = IsWindowVisible (h);
# XA0, ha Eredmény majd
# XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; exstyle: = GetWindowLong (h, GWL_EXSTYLE);
# XA0; # XA0; # XA0; Eredmény: = exstyle és WS_EX_APPWINDOW <> 0;
# XA0; # XA0; # XA0, ha nem Eredmény és
# XA0; # XA0; # XA0; # XA0; (Exstyle és WS_EX_TOOLWINDOW = 0), akkor
# XA0; # XA0; # XA0; # XA0; Eredmény: = GetWindowLong (h, GWL_HWNDPARENT) = 0;
# XA0; # XA0; végén;
végén;

A fogalom meghatározása hiányában a „fő ablak” minden olyan nyilatkozat
Ez lehet reprezentálni igaz.

--
Tisztelettel LVT.

PS-prop de könnyebben rukovodstvatsya célját: „amire szüksége van
ezt az ablakot. "

Ami számít, az nem a rend, és stílusok, és a tulajdonos a.
A VCL alkalmazások általában nincs formája nem látható a tálcán, erre isspolzuetsya Application.Handle ablakot.

típus
# XA0; TForm1 = osztály (TForm)
# XA0; magán-
# XA0; # XA0;
# XA0; védett
# XA0; # XA0; eljárással CreateParams (var Params: TCreateParams); felülbírálhatja;
# XA0, köz-
# XA0; # XA0;
# XA0; end;

var
# XA0; Form1: TForm1;

eljárás TForm1.CreateParams (var Params: TCreateParams);
kezdődik
# XA0; örökölt;
# XA0; // vagy nizhesleduyuchih vonalak vezet formában a tálcán
# XA0; Params.WndParent: = HWND_DESKTOP;
# XA0; Params.ExStyle: = Params.ExStyle vagy WS_EX_APPWINDOW;
végén;

Egy kis kísérletet arra a következtetésre jutott, hogy a vizsgált kell kinéznie:
ha (WindowOwner = 0) és ((WinStyle és WS_VISIBLE) <> 0) és ((WinStyle és WS_CHILD) = 0) és
# XA0; (((ExStyle és WS_EX_TOOLWINDOW) = 0) vagy ((ExStyle és WS_EX_APPWINDOW) <> 0)), majd

Meg kell csinálni néhány tesztet mind a windows által visszaadott EnumWindows a ()
dönt wheter megjeleníthető-e vagy sem. A vizsgálatot által leírt Jeffrey Richter
A november „97 kérdés a MSJ idézve .:

„A szabályok a tálcán használ annak eldöntésére, hogy egy gombot kell feltüntetni
Egy ablak tényleg nagyon egyszerű, de nem igazán jól dokumentált.
Amikor létrehoz egy ablak a tálcán vizsgálja az ablakon „s kiterjesztett
stílus, hogy ha akár a WS_EX_APPWINDOW (definíció szerint 0x00040000) vagy
WS_EX_TOOLWINDOW (definíció szerint 0x00000080) style van kapcsolva. ha
WS_EX_APPWINDOW be van kapcsolva, a tálcán mutatja egy gombot a
ablakot, és ha WS_EX_ TOOLWINDOW be van kapcsolva, a tálca nem
mutatni egy gombot az ablak. Soha ne hozzon létre egy ablak
van mindkét kiterjesztett stílus.

Létrehozhat egy ablak, amely Mindegy „t már vagy ilyen stílust. Ha egy
ablak sem stílusban, a tálcán úgy dönt, hogy hozzon létre egy gombot, ha
az ablak gazdátlan és nem hoz létre egy gombot, ha az ablakot
I tulajdonban van.

Egy utolsó megjegyzés: mielőtt bármilyen a fenti vizsgálatok, a tálcán
először ellenőrzi, hogy egy ablak van a standard WS_VISIBLE ablakban
stílus bekapcsolva. Ha ez a stílus kicsit ki van kapcsolva, akkor az ablak el van rejtve; az
tálcán soha nem mutatja meg egy gombot az elrejtett ablakot. Csak akkor, ha a
WS_VISIBLE stílus bit van akkor a tálcán ellenőrizze a WS_EX_APPWINDOW,
WS_ EX_TOOLWINDOW, és az ablak tulajdonosi információt. "

Mely, BTW, # XA0; David Lowndes tett közzé ebben a csoportban többször a múltban

Hibák, hogy ha WS_CHILD ablakban nincs # XA0; WS_EX_APPWINDOW nem segít - akkor megtekintéséhez.

PS: Érdekes beszélgetés bármiről.


>> IMHO, az első ablak által létrehozott kérelem és
> „Fontos”
>> hogy megjelenik a tálcán

> Hibák, hogy ha WS_CHILD ablakban nincs # XA0; WS_EX_APPWINDOW
> Nem segít - akkor megtekintéséhez.

És hol WS_CHILD?
Ez volt a EnumWindows felső szintű ablak.


> PS: Érdekes beszélgetés bármiről.

Ezt nevezik a vitát, IMHO.

Kapcsolódó cikkek