PDA

View Full Version : بدست آوردن مسیر جاری پنجره ها



Mask
یک شنبه 29 فروردین 1389, 03:21 صبح
با سلام
با عرض خسته نباشید به دوستان عزیزم.
بنده با استفاده از چند سورس کد این کار رو انجام میدهم که هرکدام مشکل خاص خود را دارند.
مثلا با بدست آوردن کپشن فرم های ویندوز
یا بدست آوردن آدرسبار فرمهای ویندوز.
این کدها مشکلات خاص خود رو دارند.
حالا می خاستم از دوستان سوال کنم آیا راه بهتری وجود دارد که مسیری که کاربر در آن قرار دارد را بتوان در یک استرینگ ریخت.
با تشکر.

lord_viper
یک شنبه 29 فروردین 1389, 09:13 صبح
شاید این بتونه کمک کنه

توابع undocument ویندوز در مورد shell name spacing extention

http://www.shellplus.com/examples/namespace-extension-example.html

vcldeveloper
یک شنبه 29 فروردین 1389, 09:49 صبح
بدست آوردن مسیر جاری پنجره ها
پنجره ها مسیر جاری ندارند. سیستم عامل ویندوز یک مسیر جاری داره. سوال را درست و دقیق بپرسید. اگر میخواید آدرس فایل EXE یک برنامه را به دست بیارید، این اسمش آدرس پنجره ها نیست، بلکه اسمش آدرس Image یک Process هست که با استفاده از توابع API قابل استخراج هست. در سورس ProcessInfo هم چگونگی استخراج آن را نمایش دادم.

Felony
یک شنبه 29 فروردین 1389, 10:28 صبح
فکر میکنم ایشون میخوان آدرسی رو که الان کاربر داره تو Windows Explorer کنکاش میکنه به دست بیارند ، مثلا اگر کاربر در درایو D هست و داره تو شاخه ای کار میکنه به صورت زیر آدرس رو پیدا کنن :


D:\Project\Sample

مهران رسا
یک شنبه 29 فروردین 1389, 11:01 صبح
پنجره ها عضوی از برنامه هستند دیگه . این عمل رو من قبلاً در نرم افزار Process Explorer دیدم . که با انتخاب پنجره ی خاص هندل اون رو میگیره و ضمن دسترسی به اسم پروسه ، مسیر فایل اجرایی رو هم استخراج میکنه .

Felony
یک شنبه 29 فروردین 1389, 11:48 صبح
پنجره ها عضوی از برنامه هستند دیگه . این عمل رو من قبلاً در نرم افزار Process Explorer دیدم . که با انتخاب پنجره ی خاص هندل اون رو میگیره و ضمن دسترسی به اسم پروسه ، مسیر فایل اجرایی رو هم استخراج میکنه .

خوب این جا هم بحث گرفتن آدرس جاری هست که در Windows Explorer هست ، وگرنه هر کسی میدونه Windows Explorer تو کدوم شاخه از درایو ویندوز قرار داره و نیازی به بهدست آوردنش نیست !
منظور آدرس فایل اجرایی پروسه نیست ، منظور آدرسی هست که الان ما توش قرار داریم ( متنی که تو Address Bar هست ) ، که ایشون میخوان از روشی به جز گرفتن این متن استفاده کنن ...

Mask
یک شنبه 29 فروردین 1389, 13:41 عصر
خوب این جا هم بحث گرفتن آدرس جاری هست که در Windows Explorer هست ، وگرنه هر کسی میدونه Windows Explorer تو کدوم شاخه از درایو ویندوز قرار داره و نیازی به بهدست آوردنش نیست !
منظور آدرس فایل اجرایی پروسه نیست ، منظور آدرسی هست که الان ما توش قرار داریم ( متنی که تو Address Bar هست ) ، که ایشون میخوان از روشی به جز گرفتن این متن استفاده کنن ...
ممنون.
سوال بنده هم همینه.

Mask
یک شنبه 29 فروردین 1389, 14:13 عصر
شاید این بتونه کمک کنه

توابع undocument ویندوز در مورد shell name spacing extention

http://www.shellplus.com/examples/namespace-extension-example.html
ممنون دوست من.
اما این لینکی که قرار دادید .محتوی نداره.
با تشکر.

AliReza Vafakhah
یک شنبه 29 فروردین 1389, 20:52 عصر
ممنون دوست من.
اما این لینکی که قرار دادید .محتوی نداره.
با تشکر.

این سورس مشکل شما رو حل میکنه

البته من با Win Xp تست زدم و درست بود

Mask
یک شنبه 29 فروردین 1389, 21:13 عصر
این سورس مشکل شما رو حل میکنه

البته من با Win Xp تست زدم و درست بود
ممنون دوست من.
این کد و کد بدست آوردن کپشن رو دارم.
اما نمیخام با استفاده از این گزینه ها مسیر رو بدست بیارم چون کافیه تو قسمت Folder Option تغییری اعمال بشه که دیگه مسیر در آدرسبار به طور کامل نشون داده نمیشه.
بازم ممنونم.

مهران رسا
یک شنبه 29 فروردین 1389, 21:18 عصر
چون کافیه تو قسمت Folder Option تغییری اعمال بشه...
خوب شما هم تغییر ایجاد کنید در این قسمت :متفکر:

Mask
یک شنبه 29 فروردین 1389, 21:22 عصر
خوب شما هم تغییر ایجاد کنید در این قسمت :متفکر:
آهان.
این است که آنتی ویروس عزیز اونوقت برنامه ویروس اعلام میفرمایند.

AliReza Vafakhah
یک شنبه 29 فروردین 1389, 23:11 عصر
ممنون دوست من.
این کد و کد بدست آوردن کپشن رو دارم.
اما نمیخام با استفاده از این گزینه ها مسیر رو بدست بیارم چون کافیه تو قسمت Folder Option تغییری اعمال بشه که دیگه مسیر در آدرسبار به طور کامل نشون داده نمیشه.
بازم ممنونم.

دوست عزیز اتفاقا این کد هیچ کاری با فعال بودن .... Display the full path در کادر Folder Option نداره.

امتحان کنید .!

Felony
یک شنبه 29 فروردین 1389, 23:47 عصر
دوست عزیز اتفاقا این کد هیچ کاری با فعال بودن .... Display the full path در کادر Folder Option نداره.

امتحان کنید .!

سورس رو مطالعه کنید ، داره متن داخل Edit قسمت Address Bar رو میخونه ، این کار اصلا اصولی نیست .

AliReza Vafakhah
دوشنبه 30 فروردین 1389, 01:04 صبح
سورس رو مطالعه کنید ، داره متن داخل Edit قسمت Address Bar رو میخونه ، این کار اثلا اصولی نیست .

خوب دوست عزیز پیشنهاد شما چیست ؟

من که با این کد مشکلم رو در یکی از پروژه هام حل کردم .

MFiRE
دوشنبه 30 فروردین 1389, 02:25 صبح
اين برنامه متن باز هم هست كه ميتونه براتون كد بدست آوردن همچين متنهايي رو توليد كنه:
http://barnamenevis.org/forum/showthread.php?t=80389

در صورتي كه Display the full path غير فعال باشه،‌هيچ سورسي با اين توابع Api نميتونه به شما كمك كنه.
شما راهي براي بدست اوردن آدرس از طريقه روشي كه برنامه Process Explorer استفاده كرده، نداريد!


دوست عزیز اتفاقا این کد هیچ کاری با فعال بودن .... Display the full path در کادر Folder Option نداره.
وقتي آدرس به صورت كامل در AddressBar نمايش داده نشه، ايشون چطور آدرسه كامل رو از ويندوز اكسپلورر بگيرن؟


سورس رو مطالعه کنید ، داره متن داخل Edit قسمت Address Bar رو میخونه ، این کار اثلا اصولی نیست .
براي خواندن آدرس بايد از اون قسمت استفاده كنند.
راهه حلي براي اين كار سراغ داريد ؟

Anyway، راه حلي كه وجود داره، اينه كه اگه در كامپيوتر كاربري Display the full path... غيرفعال بود، از ريجستري فعالش كنيد و برنامه تون رو اجرا كنيد.

موفق و پيروز باشيد

مهران رسا
دوشنبه 30 فروردین 1389, 12:02 عصر
آهان.
این است که آنتی ویروس عزیز اونوقت برنامه ویروس اعلام میفرمایند.
به خاطر استفاده از توابع Registry ؟ خوب شما کاری کنید که آنتی ویروس نتواند اعلام بفرماید . مثلاً کد کردن رشته ها ..

lord_viper
دوشنبه 30 فروردین 1389, 15:16 عصر
حرفهای جناب MFIRE درسته
این ادرس کلید مربوط به تنظیم display full path هست

HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\CabinetState

process explorer فقط ادرس محل فایل Exe وابسته به برنامه رو میده
که این کارو با تابع GetModulefileNameEX در یونیت PSApi انجام میده
(شما با داشتن کپشن برنامه میتونین با تابع GetWindowThreadProcessId مقدار PID پروسه رو بدست بیارین با تابع OpenProcess هم هندل پرپسه رو بدست میارین و با پاس داده هندل پروسه بهGetModulefileNameEX ادرس فایل فایل exe رو میده )

در پروسس اکسپلورر قسمت lower pane هم اگه نگاه کنین لیست دایرکتوریها و فایلهای مورد استفاده برنامه رو مینویسه ادرسی جاری که کاربر در حال مشاهده اون با Windows explorer هست رو نمی نویسه

البته برنامه QTTabBar به راحتی بدون ادرس بار ادرس روبدست میاره

Mask
دوشنبه 30 فروردین 1389, 19:17 عصر
با تشکر از دوستان
اما حتما راهی هست . چون برنامه های آنتی ویروس بدون استفاده از کپشن فرم یا متن آدرس بار به راحتی در مسیر جاری کاربر عملیات اسکن رو انجام میدهند.

Felony
دوشنبه 30 فروردین 1389, 19:51 عصر
راهه حلي براي اين كار سراغ داريد ؟


ما حتما راهی هست . چون برنامه های آنتی ویروس بدون استفاده از کپشن فرم یا متن آدرس بار به راحتی در مسیر جاری کاربر عملیات اسکن رو انجام میدهند.
حتما با هوک کردن پیغام های های ویندوز میشه ، بحث این هست که پیدا کنید کدوم پیغام باید هوک بشه .

مهران رسا
دوشنبه 30 فروردین 1389, 20:46 عصر
اگر دقت کرده باشید حتی در زمان استفاده از توابع API جستجوگر فایل ، با اینکه اینجا Windows Explorer هیچ نقشی ایفا نمی کنه اما آنتی ویروس هایی با قابلیت Real-time protection میتونند فایل های جستجو شده رو مورد بررسی قرار بدن. پس میشه نتیجه گرفت هوک در سطح پایین تری انجام میشه .

lord_viper
دوشنبه 30 فروردین 1389, 21:57 عصر
ممکنه انتی ها توابع FindfirstFile و FindNextfile رو هوک میکنن(البته در سطح کرنل نه یوزر مثل NtQueryDirectoryFile) در این حالت در هر برنامه ای که از این توابع استفاده بشه انتی به راحتی ادرس پوشه رو پیدا میکنه
شما هم وقتی وارد یک پوشه میشید Explorer با استفاده از همین توابع پوشه ها و فایلهای داخل اون پوشه رو لیست میکنه

Felony
سه شنبه 31 فروردین 1389, 10:04 صبح
در مورد Shell Monitoring تحقیق کنید ، در سایت Delphi.About در بارش توضیح داده شده و کامپوننت هایی هم برای این کار عرضه شده ، این هم یک نمونه لینک در همین مورد (http://delphi.about.com/od/kbwinshell/l/aa030403a.htm).

Mahmood_M
سه شنبه 31 فروردین 1389, 15:43 عصر
در اینجا (http://barnamenevis.org/forum/showthread.php?t=215847) راه حلی ارائه شده ...

Mask
سه شنبه 31 فروردین 1389, 16:02 عصر
در مورد Shell Monitoring تحقیق کنید ، در سایت Delphi.About در بارش توضیح داده شده و کامپوننت هایی هم برای این کار عرضه شده ، این هم یک نمونه لینک در همین مورد (http://delphi.about.com/od/kbwinshell/l/aa030403a.htm).
ممنون
برنامه و کامپوننت زیر رو گرفتم.
فکر کنم برای کار دیگیه.

Mahmood_M
سه شنبه 31 فروردین 1389, 16:11 عصر
ممنون
برنامه و کامپوننت زیر رو گرفتم.
فکر کنم برای کار دیگیه.
این کامپوننت تغییرات Shell رو نمایش میده ، مثلا تغییر در کلیدهای رجیستری و ...

Mask
سه شنبه 31 فروردین 1389, 17:43 عصر
این کامپوننت تغییرات Shell رو نمایش میده ، مثلا تغییر در کلیدهای رجیستری و ...
یادت رفت کامپوننتو بزاری:لبخند:

Mahmood_M
سه شنبه 31 فروردین 1389, 17:53 عصر
یادت رفت کامپوننتو بزاری
منظورم همون کامپوننتی بود که شما ضمیمه کردی ! :چشمک: ( شرمنده ، باید می گفتم )

Mask
سه شنبه 31 فروردین 1389, 19:58 عصر
منظورم همون کامپوننتی بود که شما ضمیمه کردی ! :چشمک: ( شرمنده ، باید می گفتم )
اما اصلا با این برنامه روسیستم من مانیتورینگی صورت نمیگیره!!

Felony
سه شنبه 31 فروردین 1389, 22:38 عصر
اما اصلا با این برنامه روسیستم من مانیتورینگی صورت نمیگیره!!\
شما اون لینکی رو که دادم بخون و با توجه به گفته هاش پیاده سازیش کن ، من خودم با کمی تغییر ازش جواب گرفتم .

Mask
چهارشنبه 01 اردیبهشت 1389, 11:07 صبح
\
شما اون لینکی رو که دادم بخون و با توجه به گفته هاش پیاده سازیش کن ، من خودم با کمی تغییر ازش جواب گرفتم .
ممنون
کلی بهش ور رفتم و بازم چیزی رو مانیتور نکرد.
خواهشا میشه یه نمونه برنامه بزارید.؟

lord_viper
چهارشنبه 01 اردیبهشت 1389, 19:06 عصر
shellchangeNotify فقط چیزهایی رو که تو Notify Filterش هست مانیتور میکنه اون هم در ادرس پوشه ای که در قسمت root میدن

http://z.about.com/d/delphi/1/0/O/7/shellmonitor1.gif