PDA

View Full Version : کنترل سایر برنامه ها



HadiDelphi
پنج شنبه 26 مرداد 1385, 12:35 عصر
با سلام
من می خواهم یک برنامه بنویسم که مثلا IE اجرا کنه بعد هر وقت خواست مینیمایزش کنه یا ببنده یا ماکسیمایزش کنه :متفکر:
باتشکر

vcldeveloper
جمعه 27 مرداد 1385, 08:57 صبح
اگر فقط قصد مینیمایز و ماکسیمایز کردن پنجره یک برنامه را داری، می تونی با استفاده از توابعی مثل EnumWindows یا FindWindow هندل اون پنجره را بدست بیاری و سپس با استفاده از تابع ShowWindow وضعیت نمایش اون پنجره را کنترل کنی.
اما اگه می خوای کنترل کاملی روی IE داشته باشی، می تونی از COM استفاده کنی که بک بحث جدا و طولانی هست.

HadiDelphi
جمعه 27 مرداد 1385, 10:26 صبح
دست درد نکه ولی من حالا چطوری میتونم اون برنامه رو ببندم

vcldeveloper
شنبه 28 مرداد 1385, 09:45 صبح
دست درد نکه ولی من حالا چطوری میتونم اون برنامه رو ببندم

با استفاده از تابع SendMessage و ارسال پیغام WM_Close به پنجره اصلی برنامه.

HadiDelphi
شنبه 28 مرداد 1385, 18:54 عصر
خوب حالا من با این روش میتونم مثلا Explorer.exe رو هم ببندم منظورم همون desktop ویندوز

vcldeveloper
یک شنبه 29 مرداد 1385, 09:10 صبح
خوب حالا من با این روش میتونم مثلا Explorer.exe رو هم ببندم منظورم همون desktop ویندوز

برای بستن یک Process می تونید ابتدا پیغام WM_Close را به پنجره اصلی process یا به Thread اصلی اون process ارسال کنید:
برای این منظور باید ابتدا ProcessID پروسه مربوطه را بدست بیارید. برای بدست آوردن ProcessID راههای مختلفی وجود داره، یکی از راههاش اینه که با استفاده از "Tool Help Functions" لیستی از ProcessID و نام تمامی پروسه های باز را بدست بیارید (با استفاده از توابع CreateToolhelp32SnapShot و Process32First و Process32Next).
بعد از بدست آوردن ProcessID مربوطه، می تونید از تابع EnumWindows برای بدست آوردن لیستی از پنجره های باز استفاده کنید و با مقایسه ProcessID اونها با ProcessID پروسه مورد نظر مشخص کنید که آیا آن پنجره مربوط به پروسه مورد نظر شما هست یا نه. اگر بود، می تونید به اون پنجره پیغام WM_Close ارسال کنید.
اگر ThreadID سرنخ اصلی آن process را داشته باشید، می تونید از تابع PostThreadMessage برای ارسال WM_CLOSE به سرنخ اصلی پروسه استفاده کنید - برای ارسال پیام به Thread اصلی یک process باید اون Thread یک صف پیام ایجاد کرده باشه.
بعد از ارسال WM_CLOSE باید مدتی صبر کنید تا مشخص شود که Process بسته شده است یا نه (برای این منظور می تونید از WaitForSingleObject استفاده کنید).

آخرین راه برای بستن یک پروسه تابع TerminateProcess است:
برای استفاده از این تابع ابتدا با استفاده از OpenProcess و ProcessID ایی که در مرحله قبل بدست آورید، هندل پروسه مروبطه را پیدا کنید و سپس TerminateProcess را فراخوانی کنید.
TerminateProcess را فقط زمانی استفاده کنید که از ارسال WM_CLOSE نتیجه ایی نگرفتید.

HadiDelphi
یک شنبه 29 مرداد 1385, 16:01 عصر
دستت درد نکنه آقا علی خیلی ممنون

HadiDelphi
یک شنبه 29 مرداد 1385, 17:30 عصر
می بخشیدها ولی توابع CreateToolhelp32SnapShot و Process32First و Process32Next
تو کدوم یونیت هستند.

vcldeveloper
دوشنبه 30 مرداد 1385, 06:49 صبح
توابع CreateToolhelp32SnapShot و Process32First و Process32Next
تو کدوم یونیت هستند.

TlHelp32
---------------------------------------