PDA

نسخه کامل مشاهده نسخه کامل : گرفتن عكس از برنامه هاي ديگر



romixery
26-03-2008, 13:30
با سلام خدمت دوستان عزيزم - سال نو مبارك اميدوارم سال خوبي در پيش رو داشته باشين.
مي خواستم برنامه اي بنويسم كه از برنامه هاي باز شده در حال اجرا عكس بگيره. درست مانند ويندوز Vista كه با گرفتن Alt+Tab پنجره ها رو هم نمايش ميده.
موفق باشين
باي:11:

NoneForce
26-03-2008, 16:40
سلام
كسي مانع نوشتن برنامه شده؟!
يا مشكلي وجود دارد؟

romixery
26-03-2008, 17:53
سلام
كسي مانع نوشتن برنامه شده؟!
يا مشكلي وجود دارد؟

سلام
خير كسي مانع نيست. شكر خدا فعلا هم سالمم . ولي مشكل هست. مشكل هم اينكه كه وقتي من توي يه Application ديگه هستم(برنامه خودم) ، چجوري مي تونم از يه Application در حال اجراي ديگه (فقط محيط كاربري اون) Screenshot بگيرم؟ اگه متوجه نشدين يه جور ديگه بگم. پله پله.
موفق باشين
باي

VDeveloper
27-03-2008, 02:42
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد بالا تصویر دسکتاپ رو در یک TBitmap برمیگردونه. لینک منبعش اینه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدحالا، کاری که شما باید بکنید اینه که بجای دادن عدد صفر به تابع GetDC، هندل پنجره مورد نظر خودتون رو بزارید، و بجای تنظیم طول و عرض Bitmap بر اساس اندازه Screen، طول و عرض پنجره مربوطه رو بزارید.
برای بدست آوردن هندل یک پنجره متناسب با اینکه چه پنجره ایی رو می خواید بگیرید، توابع مختلفی وجود داره، مثل EnumWindows, GetWindow, GetActiveWindow و...
بعد از اینکه هندل پنجره رو بدست آوردید، می تونید با توابعی مثل GetWindowRect یا GetClientRect طول و عرض پنجره مروبطه رو بدست بیارید و در داخل تابع استفاده کنید.
با این تفاسیر کد بالا باید به چیزی مثل این تبدیل بشه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

romixery
27-03-2008, 10:14
با سلام
خيلي ممنون. اتفاقاً من خودم ديروز در MSDN داشتم توابع مربوط به Window ها در Windows Managment رو مي خوندم كه همين توابعي كه شما گفته بودين نيز توش بود. فقط طرز استفادش رو نمي دونستم. براي بدست آوردن تعداد برنامه هاي باز و در حال اجرا هم مي شه از تابع GetALTTABINFO استفاده كرد كه مشخصات پنجره ALT+TAB رو در يك ساختمان قرار ميده.
امتحان مي كنم و نتيجه رو بهتون خبر مي دم.
موفق باشين
باي

romixery
27-03-2008, 17:06
سلام
من كد رو بصورت زير نوشتم و جواب ميده. البته مشكلش اينكه حتماً بايد برنامه در حالت Maximized باشه تا عكسش رو ذخيره كنه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا دوتا سوال ديگه:
1- چجوري ميشه يه پنجره خارجي را Maximize يا Minimize كرد.
2- چجوري تعداد برنامه هاي Switching- Window رو ميشه پيدا كرد. منظور اينكه كه پنجره هايي كه بشه از اونا عكس گرفت. براي مثال وقتي Jetaudio رو در حالت Try مي برين ديگه Switching-Window نيست. ولي وقتي Minimize مي كنيد Switching-Window هست و در ليست پنجره Alt+Tab مياد.
ممنون
باي

VDeveloper
28-03-2008, 01:35
چجوري تعداد برنامه هاي Switching- Window رو ميشه پيدا كرد. منظور اينكه كه پنجره هايي كه بشه از اونا عكس گرفت.
EnumWindows


من كد رو بصورت زير نوشتم و جواب ميده. البته مشكلش اينكه حتماً بايد برنامه در حالت Maximized باشه تا عكسش رو ذخيره كنه
کد بالا نباید وابستگی به حالت Maximized یا Minimized یک پنجره داشته باشه.

romixery
28-03-2008, 08:45
سلام
متأسفانه EnumWindows رو امتحان كردم. ارورر ميده كه. دو تا پارامتر از نوع Pointer و Integer داره. وقتي كه برنامه رو اجرا مي كني و تابع رو فراخواني مي كني ارورر دسترسي به حافظه مي ده.
در مورد Max و Min شدن هم بايد بگم كه اين كدي كه من نوشتم همون كد شماست كه يخورده تغيير كرده، و فقط در صورتي از پنجره ديگه عكس مي گيره كه اون پنجره در حالت Max يا Normal باشه، و اگه Min باشه عكسي نمي گيره. حالا اين مهم نيست. مهم Handle كردن پنجره هاي ديگه است كه نياز به تعداد و اسمشون داره. فكر كنم براي اسم پنجره ها بشه از تابع GetwindowText استفاده كرد. به هر حال Enumwindow كار نكرد.

NoneForce
28-03-2008, 09:56
سلام

براي Minimize يك پنجره خاص :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اينم مثال براي EnumWindows :
(يه ليست باكس روي فرم با اسم strlist قرار دهيد)


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

romixery
29-03-2008, 09:20
سلام
خيلي ممنون نانفورس جان.
مشكل عجيبيه من برنامه رو نوشتم. جوابم ميده. ولي با يه مشكلي جواب ميده. اونم اينكه برنامه ها حتما بايد Max يا Normal باشن. با استفاده از تابع Showwindow من اونا رو Max مي كنم ولي برنامه يهو قاطي مي كنه. البته اين كار كار اصولي و درستي هم نيست. كسي مي دونه من بايد چه تغييري در تابعم بدم تا از برنامه هاي Minmize شده هم عكس بگيره. ( تابع در پست 6 تعريف شده)؟ حتي وقتي برنامه ها Max يا Normal هم هستند وقي با تابع Setforegroundwindow اونو به جلو ميارم، بازم برنامه قاطي ميكنه. مي خواين كد كلي رو بزارم تا ببينيد.