PDA

View Full Version : تشخیص بدهید برناه تان در حال اجرا است یا نه



Keramatifar
پنج شنبه 15 اسفند 1381, 18:29 عصر
برنامه نویسان محترم بروسیله این کد می توانید تشخیص بدهیدک ه برنامه تاان در حاتل اجرا ی باشد یا نه:
Uses
Windows;

var
HMutext: THandle;

begin
HMutex :=CreateMutex (nil, 'OneCopyMutex');
if WaitForSingleObject (HMutex, 0) <> Wait-TimeOut then
Begin
Application.Initialize;

Inprise
یک شنبه 18 اسفند 1381, 12:53 عصر
دوست عزیز

روش بهتر به عقیده من استفاده از تابع FindWindow است .

fire.angle
دوشنبه 11 بهمن 1389, 12:59 عصر
با سلام من این برنامه رو نوشتم ولی یه مشکل کوچیک داره لطف کنید و اصلاحش کنید

میخوام بهد از اینکه به کاربر پیغام میده که برنامه در حال اجراست برنامه قبلی رو Restor کنه
منظورم همون تابعه
SetForeGroundWindow هست ولی نمیدونم چجوری
لطفآ اصلاح کنید

65765

BORHAN TEC
دوشنبه 11 بهمن 1389, 14:19 عصر
یکی از کامپوننت های مجموعه JVCL این امکان رو داره. اسمش دقیقاً یادم نیست ولی در اسمش کلمه Instance وجود داره.

حمید محمودی
دوشنبه 11 بهمن 1389, 15:33 عصر
من این برنامه رو نوشتم ولی یه مشکل کوچیک داره لطف کنید و اصلاحش کنید


سلام،

ابتدا توی فرم1 کد های نوشته شده رو پاک کنید.

در فایل DPR (ا project1 رو از قسمت Project manager انتخاب کرده، و بعدش CTRL+V رو بزنید ) کد های زیر رو Copy کنید :



program Project1;

uses
Windows, Messages, Forms, Dialogs,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
Mutex:THandle;
begin
Mutex:=CreateMutex(nil,true,'OneCopyMutex');
if (Mutex=0) or (GetLastError=ERROR_ALREADY_EXISTS) then
begin
ShowMessage('Application is runing');
halt;
end
else
begin
Application.Initialize;
Application.CreateForm(Tform1,form1);
Application.Run;
if (Mutex <> 0) then
CloseHandle(Mutex);
end;
end.

fire.angle
دوشنبه 11 بهمن 1389, 17:40 عصر
خوب دوست عزیر این که همون برنامه ای که من نوشتم

لطف کنید بگید چطوری باید برنامه ی قبلی رو که در حال اجراست رو Restor کنم

AliReza Vafakhah
دوشنبه 11 بهمن 1389, 19:11 عصر
خوب دوست عزیر این که همون برنامه ای که من نوشتم

لطف کنید بگید چطوری باید برنامه ی قبلی رو که در حال اجراست رو Restor کنم

با استفاده از Message .

یک نمونه نوشتم می تونید استفاده کنید

fire.angle
دوشنبه 11 بهمن 1389, 20:43 عصر
سلام

داداش شما توی این برنامه چی کار کردی ؟؟؟؟
جواب میدی ولی اصولی نیست

باید کاری کرد که که دستگیره برنامه قبلی که در حال اجراست فعال بشه نه اینکه اون قبلیرو مخفی کرد
به این لینک نگاه کنید جواب اینجا هست ولی من ازش زیاد سر در نمیارم

http://delphi.about.com/od/windowsshellapi/l/aa100703b.htm

AliReza Vafakhah
دوشنبه 11 بهمن 1389, 21:59 عصر
سلام

داداش شما توی این برنامه چی کار کردی ؟؟؟؟
جواب میدی ولی اصولی نیست

باید کاری کرد که که دستگیره برنامه قبلی که در حال اجراست فعال بشه نه اینکه اون قبلیرو مخفی کرد
به این لینک نگاه کنید جواب اینجا هست ولی من ازش زیاد سر در نمیارم

http://delphi.about.com/od/windowsshellapi/l/aa100703b.htm

به کد فایل پروژه دقت کنید :



program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
hMutex: THandle;
hApp: THandle;
begin
hMutex:= CreateMutex(nil ,False, 'Project1');
if (WaitForSingleObject(hMutex, 0) <> wait_TimeOut) then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.MainFormOnTaskBar := True;
Application.ShowMainForm := True;
Application.Run;
end
else
begin
hApp :=FindWindow(nil,'Form1');
if (hApp > 0) then
SendMessage(hApp, UMESSAGE_RESTOREAPP, 0,0);
end;
end.

در خط مشخص شده هندل پنجره قبلی پیدا میشه و همون نمایش داده میشه و سپس فایل دوم بسته میشه (نه قبلی)

حمید محمودی
دوشنبه 11 بهمن 1389, 22:18 عصر
خوب دوست عزیر این که همون برنامه ای که من نوشتم شما توی سوالتون دوتا مشکل رو مطرح کردید و بنده راه حل مشکل اول رو بهتون گفتم. (جای اون کدها در فرم1 نیست!! )
درمورد مشکل بعدی تون (Restore شدن) همونطور که گفته شد با SendMessage میتونید اینکار رو انجام بدید.

fire.angle
دوشنبه 11 بهمن 1389, 22:56 عصر
Application.MainFormOnTaskBar := True;
SendMessage(hApp, UMESSAGE_RESTOREAPP, 0,0);

روی این دو تا خط ایراد میگیره
یعنی UMESSAGE RESTOREAPP و MainFormOnTaskBar رو نمیشناسه
چیکار کنم ؟؟؟؟؟؟

در ضمن شما از چه Tray Icon ای استفاده کردید
این هایی که من دارم رو قبول نمی کنه
لطفآ لینک Tray Icon استفاده شده در برنامتون رو هم بزارید

حمید محمودی
سه شنبه 12 بهمن 1389, 00:11 صبح
دوست عزیز برنامه ای که شما دارید درموردش صحبت میکنید با دلفی 2010 نوشته شده و بدون مشکل در نسخه های 2010 و XE اجرا میشه.
احتمالا چون شما دلفی ورژن دیگه ای دارید اینطوری میشه.


Application.MainFormOnTaskBar فکر کنم بخاطر ورژن دلفی شماست. اون رو با // (دو اسلش ) کامنت کنید مشکل حل میشه.

و برای SendMessage یا یونیت Messages رو به قسمت Uses اضافه نکردید و یا مشکل از جای دیگه ای هست. متن پیام خطا چیست؟


این هایی که من دارم رو قبول نمی کنه خب کاری نداره کدهای مربوط به TrayIcon رو بردارید.

fire.angle
سه شنبه 12 بهمن 1389, 00:23 صبح
با تشکر به خاطر راهنمایی تون

یونیت message رو که اضافه می کنم پیغام Find Not Found Message.Dcu میده و در ضمن مشکل از UMESSAGE RESTOREAPP بود نه یونیت Message

حالا بگید چیکار کنم

حمید محمودی
سه شنبه 12 بهمن 1389, 00:42 صبح
یونیت message رو که اضافه می کنم
اصلاح میکنم، منظورم یونیت Messages بود.


در ضمن مشکل از UMESSAGE RESTOREAPP بود نه یونیت Message خب ما از کجا بدانیم پیغام Errorی که در سیستم شما برای برنامه تان رخ میدهد چیست؟!

اصلا اون چیزهایی که گفتم رو خودم روی نمونه ساخته شده، تغییر دادم. فکر نکنم دیگه مشکلی باشه، بفرمایید : (البته من دلفی 7 ندارم تست کنم، جواب میده یا نه)

fire.angle
سه شنبه 12 بهمن 1389, 01:10 صبح
با تشکر از شما که کمک می کنید

خوب از اول اینو می گفتید که UMESSAGE RESTOREAPP یه ثابت در برنامه است راستی چرا WM_user + 1353

برنامتون اجرا نشد اگه ممکنه محتواش رو توی یه فایل متنی قرار بدید تا از کدهاش استفاده کنم

و یه چیز دیگه اونم اینکه متغیر hApp هیچ مقداری رو برنمیگردنه نمیدونم چرا خودم قبلا با Findwindow کار کردم ولی نمیدونم چرا چیزی بر نمیگردونه

به هر لطف کنید و محتوای فایل رو در یه فایل متنی قرار بدبد
ممنونم

حمید محمودی
سه شنبه 12 بهمن 1389, 02:06 صبح
خوب از اول اینو می گفتید که UMESSAGE RESTOREAPP یه ثابت در برنامه است

خب من از کجا میدونستم که شما نمیدونید یک ثابت هست :)


برنامتون اجرا نشد اگه ممکنه محتواش رو توی یه فایل متنی قرار بدید تا از کدهاش استفاده کنم

محتوای چی رو؟ WM_USER رو میگید؟ اگه آره خب مقدارش داخل یونیت Messages هست. مقدارشم فکر کنم 1024 باشه.



و یه چیز دیگه اونم اینکه متغیر hApp هیچ مقداری رو برنمیگردنه نمیدونم چرا خودم قبلا با Findwindow کار کردم ولی نمیدونم چرا چیزی بر نمیگردونه

یعنی الان این برنامه ای که من ضمیمه کردم کار نمیکنه؟ (من تست کردم کار میکرد که)

fire.angle
سه شنبه 12 بهمن 1389, 10:06 صبح
فایل پروژه رو بزار
کل فایل پروژه رو توی یه فایل متنی TXT کپی کنید

به خدا اجرا نشد . شابد دلفی شما 2010 باشه . مال من 7 است

حمید محمودی
سه شنبه 12 بهمن 1389, 13:42 عصر
کل فایل پروژه رو توی یه فایل متنی TXT کپی کنید

در پست شماره 14 بنده کل پروژه رو قرار دادم. فایل های .pas و فایل .dpr خودشون متنی هستن و کدهاشونو میتونید با notepad باز کنید ببنید. نرم افزار خاصی لازم نیست.

اگه همچنان مشکل پابرجاست صبر کنید سرچ کنم دلفی7 رو کجا گذاشته بودم تا تست کنم مشکلتون چیه :)

حمید محمودی
چهارشنبه 13 بهمن 1389, 07:26 صبح
میبخشید دسترسی به اینترنت نداشتم. تست کردم نمونه زیر در حالتی که برنامه مینیماز نشده باشه جواب میده (با دلفی 7)

از منوی Project->view source رو انتخاب کنید و بعد کل سورس رو بصورت زیر تغییر بدید :



program Project1;

uses
Forms,
Windows,Messages,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
hMutex: THandle;
hApp: THandle;
begin
hMutex:= CreateMutex(nil ,False, 'Project1');
if (WaitForSingleObject(hMutex, 0) <> wait_TimeOut) then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.ShowMainForm := True;
Application.Run;
end
else
begin
hApp:=FindWindow('TForm1',nil);
if (hApp > 0) then
//SendMessage(hApp, WM_USER + 1653 , 0,0);
//hApp:=GetWindow(hApp, GW_HWNDPREV);
SetFocus(hApp);
SetForegroundWindow(hApp);
end;
end.


ضمنا اگه دلیل خاصی نداره که از ورژن 7 دلفی دارید استفاد میکنید، پیشنهاد میکنم از نسخه های به روز تر زبان دلفی (مثل نسخه 2010 یا نسخه XE ) استفاده کنید چون برنامه نویسی در آن بسیار راحتره و به علاوه مشکلات زبون دلفی 7 رو هم نداره (مثل عدم پشتیبانی از یونیکد و... )

موفق باشید.

fire.angle
چهارشنبه 13 بهمن 1389, 10:36 صبح
سلام

دمت گرم حالا جواب داد

اما اگه برنامه Minimize شده بود چی ؟؟؟؟؟؟؟
تونوقت Restore اش نمیکنه
حالا چی کار کنم ؟؟؟؟؟؟؟
در مورد توصیتون هم در مورد دلفی 2010 هم چشم حتما همین کارو خواهم کرد

fire.angle
پنج شنبه 14 بهمن 1389, 12:37 عصر
سلام

کسی نمیخواد جوابه منو بده ؟؟؟؟؟؟

اگه برنامه Minimize شده باشه اونوقت Restor نمیشه ..... حالا باید چی کار کنم

البته با این تکه کد میشه Restor اش کرد ولی اونوقت دیگه Minimize نمیشه

ShowWindow(hApp,SW_RESTORE);
یکی راهنمایی کنه لطفا

Mask
پنج شنبه 14 بهمن 1389, 13:30 عصر
شما باید به برنامه اول پیغام Restor شدن رو بفرستید.

fire.angle
پنج شنبه 14 بهمن 1389, 13:46 عصر
آقای دلفی 7 سلام

لطف کن جوابو بهم بگو دیگه مغزم کار نمیکه

میتونی قطعه کد کامل رو در صفحه قبل ببینی . همش درسته بجز وقتی که میخوام وقتی پنجره Minimize هستش اگه دوباره بر روی برنامه دوبار کلیک شد اون پنجره Minimize شده فعال بشه . اگر برنامه Minimize نشده باشه که برنامه به درستی کار میکنه اما اگه Minimize شده باشه اون پنجره رو Restor نمیکنه

لطفا حلش کن منو این و اونور پاس نده . دیگه نمیکشم. ممنون

Mask
پنج شنبه 14 بهمن 1389, 17:08 عصر
از کد زیر استفاده کنید.

program Project1;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
function I:boolean;
var
H,HH:Thandle;
begin
H:=CreateMutex(nil,False,'OneCopyMutex');
result:=false;
If not(WaitForSingleObject(H,0)<>Wait_TimeOut) then
result:=true;

end;
var hh:Thandle;
begin if not i then begin

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;

end
else
begin
messageDlg('Another Copy Of Application Is Already Running', mtinformation,[mbOk], 0);
HH:= FindWindow(nil, 'Form1');
SendMessage(HH, wm_SysCommand, SC_RESTORE, 0) ;
end;

end.

fire.angle
پنج شنبه 14 بهمن 1389, 18:04 عصر
خیلی ممنون برادر

ولی بازم همون مشکل قبلی که گفتم پا برجاست یعنی اگه Minimize بشه با دوبار کلیک رو برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه

راستی بالاخره فهمیدی اون برنامه Fast Shutdown چطوری کار میکنه ؟؟؟؟؟؟ منم هر چی به هش ور رفتم مثل اون برنامه ShutDown نمیکنه و تاخیر داره
اگه جوابشو فهمیدی حتما یه پست بزار ما هم بفمیم

Mask
پنج شنبه 14 بهمن 1389, 18:33 عصر
خیلی ممنون برادر
لطفا برای تشکر از دکمه تشکر استفاده کنید.

ولی بازم همون مشکل قبلی که گفتم پا برجاست یعنی اگه Minimize بشه با دوبار کلیک رو برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه
تا شب اگه وقت بشه درستش میکنم براتون.

راستی بالاخره فهمیدی اون برنامه Fast Shutdown چطوری کار میکنه ؟؟؟؟؟؟ منم هر چی به هش ور رفتم مثل اون برنامه ShutDown نمیکنه و تاخیر داره
اگه جوابشو فهمیدی حتما یه پست بزار ما هم بفمیم
با توضیحات دوستان و پستهای زده شده . فکر کنم هنوز هیچکی نفهمیده.
و در ضمن برای نظم سایت بهتره هر سوال رو تو پست خودش بپرسید.

fire.angle
پنج شنبه 14 بهمن 1389, 22:33 عصر
بازم سلام

این قطعه کد منه . لطفا ببینش و اصلاحش کن

متشکرم

Felony
جمعه 15 بهمن 1389, 12:53 عصر
فایل dpr پروژتون باید به صورت زیر تغییر پیدا کنه :


program Project1;

uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
Mutex, H: THandle;

begin
Mutex := CreateMutex(nil, True, 'Mojtaba');
if (Mutex <> 0) and (GetLastError = 0) then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
if Mutex <> 0 then
CloseHandle(Mutex);
end
else
begin
H:= FindWindow('TForm1', 'Form1');
if H<> 0 then
ShowWindow(H, SW_RESTORE);
SetForegroundWindow(H);
end;
end.

fire.angle
جمعه 15 بهمن 1389, 13:18 عصر
سلام

آقای تاجیک عزیز

این مورد قبلا گفته شده و من هم مشکلش رو گفتم
مشکلش اینه که دیگه پنجره برنامه Minimize نمیشه

یعنی اگه پنجره برنامه Minimize بشه با دوبار کلیک روی برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه

میتونید امتحان کنید ..... لطفا بگید این مشکل رو چطور حل کنم.

Felony
جمعه 15 بهمن 1389, 14:22 عصر
سلام

آقای تاجیک عزیز

این مورد قبلا گفته شده و من هم مشکلش رو گفتم
مشکلش اینه که دیگه پنجره برنامه Minimize نمیشه

یعنی اگه پنجره برنامه Minimize بشه با دوبار کلیک روی برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه

میتونید امتحان کنید ..... لطفا بگید این مشکل رو چطور حل کنم.
میتونید یک پیغام جدید برای ویندوز Register کنید و بعد Message Handler فرم برنامتون رو Override کنید ، به جای ShowWindow بیاین و پیغامی که برای ویندوز ثبت کردید رو به فرم برنامه بفرستید و تو Message Handler ی که نوشتید چک کنید اگر پیغام رسیده همون بود فرم برنامه رو Restore کنید .

براتون یک نمونه نوشتم که میتونید از ضمیمه دریافت کنید .

Mask
یک شنبه 17 بهمن 1389, 12:12 عصر
با سلام
منم این کامپوننت رو از سایت delphi.about.com براتون نوشتم.:خجالت:

loo30fer
شنبه 21 خرداد 1390, 12:18 عصر
با سلام خدمت تمامی دوستان
جناب تاجیک من اومدم کدی رو که تو سورس گذاشتین رو تو سورس خودم پیاده کردم ولی باز وقتی که چندبار فایل رو اجرا میکنم باز یکی دیگه باز میکنه نمیدونم چرا کار نمیکنه ممنون میشم یک نگاهی به سورس من بندازین و مشکل کارم رو بگین . با تشکر.

Felony
شنبه 21 خرداد 1390, 12:38 عصر
با سلام خدمت تمامی دوستان
جناب تاجیک من اومدم کدی رو که تو سورس گذاشتین رو تو سورس خودم پیاده کردم ولی باز وقتی که چندبار فایل رو اجرا میکنم باز یکی دیگه باز میکنه نمیدونم چرا کار نمیکنه ممنون میشم یک نگاهی به سورس من بندازین و مشکل کارم رو بگین . با تشکر.
من هر چی خوندم هیچ چیزی شبیه کد من تو پروژه شما نبود ، در ضمن اون کدهایی هم که من نوشته بودم در قسمت Project برنامه بود نه سورس فرم برنامه ؛ برنامتون رو اصلاح کردم .