-
تشخیص بدهید برناه تان در حال اجرا است یا نه
برنامه نویسان محترم بروسیله این کد می توانید تشخیص بدهیدک ه برنامه تاان در حاتل اجرا ی باشد یا نه:
Uses
Windows;
var
HMutext: THandle;
begin
HMutex :=CreateMutex (nil, 'OneCopyMutex');
if WaitForSingleObject (HMutex, 0) <> Wait-TimeOut then
Begin
Application.Initialize;
-
دوست عزیز
روش بهتر به عقیده من استفاده از تابع FindWindow است .
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
با سلام من این برنامه رو نوشتم ولی یه مشکل کوچیک داره لطف کنید و اصلاحش کنید
میخوام بهد از اینکه به کاربر پیغام میده که برنامه در حال اجراست برنامه قبلی رو Restor کنه
منظورم همون تابعه
SetForeGroundWindow هست ولی نمیدونم چجوری
لطفآ اصلاح کنید
ضمیمه 65765
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
یکی از کامپوننت های مجموعه JVCL این امکان رو داره. اسمش دقیقاً یادم نیست ولی در اسمش کلمه Instance وجود داره.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
من این برنامه رو نوشتم ولی یه مشکل کوچیک داره لطف کنید و اصلاحش کنید
سلام،
ابتدا توی فرم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.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
خوب دوست عزیر این که همون برنامه ای که من نوشتم
لطف کنید بگید چطوری باید برنامه ی قبلی رو که در حال اجراست رو Restor کنم
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
نوشته شده توسط
fire.angle
خوب دوست عزیر این که همون برنامه ای که من نوشتم
لطف کنید بگید چطوری باید برنامه ی قبلی رو که در حال اجراست رو Restor کنم
با استفاده از Message .
یک نمونه نوشتم می تونید استفاده کنید
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
سلام
داداش شما توی این برنامه چی کار کردی ؟؟؟؟
جواب میدی ولی اصولی نیست
باید کاری کرد که که دستگیره برنامه قبلی که در حال اجراست فعال بشه نه اینکه اون قبلیرو مخفی کرد
به این لینک نگاه کنید جواب اینجا هست ولی من ازش زیاد سر در نمیارم
http://delphi.about.com/od/windowssh.../aa100703b.htm
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
نوشته شده توسط
fire.angle
سلام
داداش شما توی این برنامه چی کار کردی ؟؟؟؟
جواب میدی ولی اصولی نیست
باید کاری کرد که که دستگیره برنامه قبلی که در حال اجراست فعال بشه نه اینکه اون قبلیرو مخفی کرد
به این لینک نگاه کنید جواب اینجا هست ولی من ازش زیاد سر در نمیارم
http://delphi.about.com/od/windowssh.../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.
در خط مشخص شده هندل پنجره قبلی پیدا میشه و همون نمایش داده میشه و سپس فایل دوم بسته میشه (نه قبلی)
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
خوب دوست عزیر این که همون برنامه ای که من نوشتم
شما توی سوالتون دوتا مشکل رو مطرح کردید و بنده راه حل مشکل اول رو بهتون گفتم. (جای اون کدها در فرم1 نیست!! )
درمورد مشکل بعدی تون (Restore شدن) همونطور که گفته شد با SendMessage میتونید اینکار رو انجام بدید.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
Application.MainFormOnTaskBar := True;
SendMessage(hApp, UMESSAGE_RESTOREAPP, 0,0);
روی این دو تا خط ایراد میگیره
یعنی UMESSAGE RESTOREAPP و MainFormOnTaskBar رو نمیشناسه
چیکار کنم ؟؟؟؟؟؟
در ضمن شما از چه Tray Icon ای استفاده کردید
این هایی که من دارم رو قبول نمی کنه
لطفآ لینک Tray Icon استفاده شده در برنامتون رو هم بزارید
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
دوست عزیز برنامه ای که شما دارید درموردش صحبت میکنید با دلفی 2010 نوشته شده و بدون مشکل در نسخه های 2010 و XE اجرا میشه.
احتمالا چون شما دلفی ورژن دیگه ای دارید اینطوری میشه.
Application.MainFormOnTaskBar فکر کنم بخاطر ورژن دلفی شماست. اون رو با // (دو اسلش ) کامنت کنید مشکل حل میشه.
و برای SendMessage یا یونیت Messages رو به قسمت Uses اضافه نکردید و یا مشکل از جای دیگه ای هست. متن پیام خطا چیست؟
نقل قول:
این هایی که من دارم رو قبول نمی کنه
خب کاری نداره کدهای مربوط به TrayIcon رو بردارید.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
با تشکر به خاطر راهنمایی تون
یونیت message رو که اضافه می کنم پیغام Find Not Found Message.Dcu میده و در ضمن مشکل از UMESSAGE RESTOREAPP بود نه یونیت Message
حالا بگید چیکار کنم
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
یونیت message رو که اضافه می کنم
اصلاح میکنم، منظورم یونیت Messages بود.
نقل قول:
در ضمن مشکل از UMESSAGE RESTOREAPP بود نه یونیت Message
خب ما از کجا بدانیم پیغام Errorی که در سیستم شما برای برنامه تان رخ میدهد چیست؟!
اصلا اون چیزهایی که گفتم رو خودم روی نمونه ساخته شده، تغییر دادم. فکر نکنم دیگه مشکلی باشه، بفرمایید : (البته من دلفی 7 ندارم تست کنم، جواب میده یا نه)
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
با تشکر از شما که کمک می کنید
خوب از اول اینو می گفتید که UMESSAGE RESTOREAPP یه ثابت در برنامه است راستی چرا WM_user + 1353
برنامتون اجرا نشد اگه ممکنه محتواش رو توی یه فایل متنی قرار بدید تا از کدهاش استفاده کنم
و یه چیز دیگه اونم اینکه متغیر hApp هیچ مقداری رو برنمیگردنه نمیدونم چرا خودم قبلا با Findwindow کار کردم ولی نمیدونم چرا چیزی بر نمیگردونه
به هر لطف کنید و محتوای فایل رو در یه فایل متنی قرار بدبد
ممنونم
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
خوب از اول اینو می گفتید که UMESSAGE RESTOREAPP یه ثابت در برنامه است
خب من از کجا میدونستم که شما نمیدونید یک ثابت هست :)
نقل قول:
برنامتون اجرا نشد اگه ممکنه محتواش رو توی یه فایل متنی قرار بدید تا از کدهاش استفاده کنم
محتوای چی رو؟ WM_USER رو میگید؟ اگه آره خب مقدارش داخل یونیت Messages هست. مقدارشم فکر کنم 1024 باشه.
نقل قول:
و یه چیز دیگه اونم اینکه متغیر hApp هیچ مقداری رو برنمیگردنه نمیدونم چرا خودم قبلا با Findwindow کار کردم ولی نمیدونم چرا چیزی بر نمیگردونه
یعنی الان این برنامه ای که من ضمیمه کردم کار نمیکنه؟ (من تست کردم کار میکرد که)
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
فایل پروژه رو بزار
کل فایل پروژه رو توی یه فایل متنی TXT کپی کنید
به خدا اجرا نشد . شابد دلفی شما 2010 باشه . مال من 7 است
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
کل فایل پروژه رو توی یه فایل متنی TXT کپی کنید
در پست شماره 14 بنده کل پروژه رو قرار دادم. فایل های .pas و فایل .dpr خودشون متنی هستن و کدهاشونو میتونید با notepad باز کنید ببنید. نرم افزار خاصی لازم نیست.
اگه همچنان مشکل پابرجاست صبر کنید سرچ کنم دلفی7 رو کجا گذاشته بودم تا تست کنم مشکلتون چیه :)
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
میبخشید دسترسی به اینترنت نداشتم. تست کردم نمونه زیر در حالتی که برنامه مینیماز نشده باشه جواب میده (با دلفی 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 رو هم نداره (مثل عدم پشتیبانی از یونیکد و... )
موفق باشید.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
سلام
دمت گرم حالا جواب داد
اما اگه برنامه Minimize شده بود چی ؟؟؟؟؟؟؟
تونوقت Restore اش نمیکنه
حالا چی کار کنم ؟؟؟؟؟؟؟
در مورد توصیتون هم در مورد دلفی 2010 هم چشم حتما همین کارو خواهم کرد
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
سلام
کسی نمیخواد جوابه منو بده ؟؟؟؟؟؟
اگه برنامه Minimize شده باشه اونوقت Restor نمیشه ..... حالا باید چی کار کنم
البته با این تکه کد میشه Restor اش کرد ولی اونوقت دیگه Minimize نمیشه
ShowWindow(hApp,SW_RESTORE);
یکی راهنمایی کنه لطفا
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
شما باید به برنامه اول پیغام Restor شدن رو بفرستید.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
آقای دلفی 7 سلام
لطف کن جوابو بهم بگو دیگه مغزم کار نمیکه
میتونی قطعه کد کامل رو در صفحه قبل ببینی . همش درسته بجز وقتی که میخوام وقتی پنجره Minimize هستش اگه دوباره بر روی برنامه دوبار کلیک شد اون پنجره Minimize شده فعال بشه . اگر برنامه Minimize نشده باشه که برنامه به درستی کار میکنه اما اگه Minimize شده باشه اون پنجره رو Restor نمیکنه
لطفا حلش کن منو این و اونور پاس نده . دیگه نمیکشم. ممنون
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
از کد زیر استفاده کنید.
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.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
خیلی ممنون برادر
ولی بازم همون مشکل قبلی که گفتم پا برجاست یعنی اگه Minimize بشه با دوبار کلیک رو برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه
راستی بالاخره فهمیدی اون برنامه Fast Shutdown چطوری کار میکنه ؟؟؟؟؟؟ منم هر چی به هش ور رفتم مثل اون برنامه ShutDown نمیکنه و تاخیر داره
اگه جوابشو فهمیدی حتما یه پست بزار ما هم بفمیم
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
خیلی ممنون برادر
لطفا برای تشکر از دکمه تشکر استفاده کنید.
نقل قول:
ولی بازم همون مشکل قبلی که گفتم پا برجاست یعنی اگه Minimize بشه با دوبار کلیک رو برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه
تا شب اگه وقت بشه درستش میکنم براتون.
نقل قول:
راستی بالاخره فهمیدی اون برنامه Fast Shutdown چطوری کار میکنه ؟؟؟؟؟؟ منم هر چی به هش ور رفتم مثل اون برنامه ShutDown نمیکنه و تاخیر داره
اگه جوابشو فهمیدی حتما یه پست بزار ما هم بفمیم
با توضیحات دوستان و پستهای زده شده . فکر کنم هنوز هیچکی نفهمیده.
و در ضمن برای نظم سایت بهتره هر سوال رو تو پست خودش بپرسید.
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
بازم سلام
این قطعه کد منه . لطفا ببینش و اصلاحش کن
متشکرم
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
فایل 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.
-
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
سلام
آقای تاجیک عزیز
این مورد قبلا گفته شده و من هم مشکلش رو گفتم
مشکلش اینه که دیگه پنجره برنامه Minimize نمیشه
یعنی اگه پنجره برنامه Minimize بشه با دوبار کلیک روی برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه
میتونید امتحان کنید ..... لطفا بگید این مشکل رو چطور حل کنم.
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
نوشته شده توسط
fire.angle
سلام
آقای تاجیک عزیز
این مورد قبلا گفته شده و من هم مشکلش رو گفتم
مشکلش اینه که دیگه پنجره برنامه Minimize نمیشه
یعنی اگه پنجره برنامه Minimize بشه با دوبار کلیک روی برنامه اونی که Minimize شده Restor میشه ولی دیگه Minimize نمیشه
میتونید امتحان کنید ..... لطفا بگید این مشکل رو چطور حل کنم.
میتونید یک پیغام جدید برای ویندوز Register کنید و بعد Message Handler فرم برنامتون رو Override کنید ، به جای ShowWindow بیاین و پیغامی که برای ویندوز ثبت کردید رو به فرم برنامه بفرستید و تو Message Handler ی که نوشتید چک کنید اگر پیغام رسیده همون بود فرم برنامه رو Restore کنید .
براتون یک نمونه نوشتم که میتونید از ضمیمه دریافت کنید .
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
با سلام
منم این کامپوننت رو از سایت delphi.about.com براتون نوشتم.:خجالت:
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
با سلام خدمت تمامی دوستان
جناب تاجیک من اومدم کدی رو که تو سورس گذاشتین رو تو سورس خودم پیاده کردم ولی باز وقتی که چندبار فایل رو اجرا میکنم باز یکی دیگه باز میکنه نمیدونم چرا کار نمیکنه ممنون میشم یک نگاهی به سورس من بندازین و مشکل کارم رو بگین . با تشکر.
-
1 ضمیمه
نقل قول: تشخیص بدهید برناه تان در حال اجرا است یا نه
نقل قول:
نوشته شده توسط
loo30fer
با سلام خدمت تمامی دوستان
جناب تاجیک من اومدم کدی رو که تو سورس گذاشتین رو تو سورس خودم پیاده کردم ولی باز وقتی که چندبار فایل رو اجرا میکنم باز یکی دیگه باز میکنه نمیدونم چرا کار نمیکنه ممنون میشم یک نگاهی به سورس من بندازین و مشکل کارم رو بگین . با تشکر.
من هر چی خوندم هیچ چیزی شبیه کد من تو پروژه شما نبود ، در ضمن اون کدهایی هم که من نوشته بودم در قسمت Project برنامه بود نه سورس فرم برنامه ؛ برنامتون رو اصلاح کردم .