امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
مدیریت برنامه ی از قبل باز شده
نویسنده پیام
atige آفلاین
تازه وارد

ارسال‌ها: 24
موضوع‌ها: 1
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 2
( 15 تشکر در 10 ارسال )
ارسال: #12
RE: مدیریت برنامه ی از قبل باز شده
نمیشه شما به جای اینکه فرم 1 رو ببندی اونو هاید کنی؟
۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #13
RE: مدیریت برنامه ی از قبل باز شده
(۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹)atige نوشته است: نمیشه شما به جای اینکه فرم 1 رو ببندی اونو هاید کنی؟
نه لازمش دارم، گاهی لازم میشه از این ویژگی استفاده کرد
۲۹-دى-۱۳۹۰, ۱۵:۲۹:۴۱
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #14
RE: مدیریت برنامه ی از قبل باز شده
payman62 ی عزیز جواب داد
واقعا ممنون از راهنمایی های خوبت، معلوم بود سوالمو خوب خوندی و متوجه منظورم شدی،
اما من نمیدونستم تولید یه کپشن خاص به صورت GUID که یونیک باشه یعنی چی،
به خاطر همین توی فرم2 یه text box گذاشتم
و توی رویداد changeش نوشتم:
کد:
If Form2.txtMessage = "RunMe" Then
Form1.Show
Else
Exit Sub
End If

و هنگام خروج نوشتم:
کد:
Form2.txtMessage.Text = "I Go"
Dim CloseIt As Long

CloseIt = FindWindow(vbNullString, "Form1")
PostMessage CloseIt, WM_CLOSE, CLng(0), CLng(0)

وتوی frm_load بررسی کردم
اگر برنامه run بود ولی form1 ، ران نبود، پیغام RunMe رو به تکست فرم2 ارسال کنه
کد:
Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")

If (App.PrevInstance = True) Then
    If ProgramIsRun = 0 Then
        .
        .
        .
        ThWnd = FindWindow(vbNullString, "Form2")
        a$ = "RunMe"
        
        CopyMemory buf(1), ByVal a$, Len(a$)
        cds.dwData = 3
        cds.cbData = Len(a$) + 1
        cds.lpData = VarPtr(buf(1))
        i = SendMessage(ThWnd, WM_COPYDATA, Me.hWnd, cds)
        End
        Exit Sub
    Else
        End
        Exit Sub
    End If
    ElseIf (App.PrevInstance = False) Then
    Form1.Show
    Form2.Show
    Frm_Load.Hide
End If

که رویداد change تکست فرم2 ،که برنامش بالا هست، اگر عبارت RunMe رو دریافت کنه فرم 1 رو اجرا میکنه درغیر اینصورت کاری نمیکنه.

جواب دادنش توی همه ی حالات جواب میده اما میخوام ببینم روشم مشکل نداره؟ روش مطمئنی هست؟
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۲:۳۱:۴۰، توسط Payman62.)
۰۲-بهمن-۱۳۹۰, ۰۰:۳۶:۴۱
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #15
RE: مدیریت برنامه ی از قبل باز شده
(۲۸-دى-۱۳۹۰, ۱۲:۲۰:۴۱)Di Di نوشته است: http://www.iranled.com/forum/thread-1902...9%81%D8%A7

di di جان به این لینک رفتم و چیزی پیدا نکردم، خود کامپوننت ورژن13 نبود فقط کرک ش بود
۰۲-بهمن-۱۳۹۰, ۱۱:۴۶:۵۱
ارسال‌ها
پاسخ
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #16
RE: مدیریت برنامه ی از قبل باز شده
سلام.
GUID یه استرینگ هست که به صورت یونیک تولید میشه.
به مسیر C:\Program Files\Microsoft Visual Studio\Common\Tools برو و برنامه GUIDGEN.EXE رو اجرا کن. رو NewGUID کلیک کن و در Result نتیجه رو ببین.
یه رشته مثل {6F428B38-7592-40a0-BF03-384FE96372E7} تولید میکنه که مطمن هستی یونیک هست و به هیچ عنوان تکراری نخواهد بود.

من عرض کردم کپشن فرمت رو برابر یه GUID قرار بدی تا مطمن بشی هندل فرم برنامه خودتو به دست میگیری.
عنوان Form1 برای کپشن فرمی که داخل پروژه از Findwindow برای پیدا کردن فرم استفاده میکنه خیلی ناشیانه هست و احتمال خطا رو بالا میبره. ممکنه برنامه دیگه ای با این کپشن موجود باشه و هندل اون برنامه رو به دست بگیری.
این از GUID.


اما در مورد تکس باکسی هم که گذاشتی اصلا نفهمیدم برای چی این کار رو کردی.
هنگامی که برنامه اجرا میشه چک میکنه اولین باره اجرا شده یا نه. اگه اولین بار بود که برنامه به صورت عادی اجرا میشه.
اما اگه اولین بار نبود هندل فرم2 که یه GUID هست رو سرچ میکنه. وقتی هندل رو پیدا کرد چون مربوط به یه پروسه دیگست یه پیغام خاص براش میفرسته. در اون سمت هم در اون پروسه وقتی فرم2 اون پیغام رو دریافت کرد فرم1 رو نمایش میده.

تابع مربوطه هنگام دریافت پیغام به صورت یه event کار میکنه و فراخوانی میشه. دیگه نیازی به ایونت textchange تکس باکس نیست.


ضمنا از این کدت هم اصلا سر در نیوردم.

کد:
Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")

If (App.PrevInstance = True) Then
    If ProgramIsRun = 0 Then
        .
        .
        .
        ThWnd = FindWindow(vbNullString, "Form2")
        a$ = "RunMe"
        
        CopyMemory buf(1), ByVal a$, Len(a$)
        cds.dwData = 3
        cds.cbData = Len(a$) + 1
        cds.lpData = VarPtr(buf(1))
        i = SendMessage(ThWnd, WM_COPYDATA, Me.hWnd, cds)
        End
        Exit Sub
    Else
        End
        Exit Sub
    End If
    ElseIf (App.PrevInstance = False) Then
    Form1.Show
    Form2.Show
    Frm_Load.Hide
End If

شما 2 بار اومدی بعد end دستور exit sub رو گذاشتی که هیچ وقت اجرا نمیشه.
بعد end if قرار دادی و بعدش elseif گذاشتی. این elseif به کدوم if مربوط میشه ؟


از کد زیر استفاده کن.

کد:
Private Sub Form_Load()
Dim blnForm1IsOpen As Boolean
    If (App.PrevInstance) Then
        blnForm1IsOpen = CBool(FindWindow(vbNullString, "Form1:{8522A1F2-2F0B-4a29-BB25-E52F2E096C08}"))
        If blnForm1IsOpen = False Then
            ThWnd = FindWindow(vbNullString, "Form2:{0226AEB4-8B3A-4a5a-A252-2037EB39AE08}")
            MySendMessage "Open Form1", ThWnd
        End If
    Else
        Form1.Show
        Form2.Show
        Frm_Load.Hide
    End If
End Sub

Private Sub MySendMessage(Message As String, Handle As Long)
    Dim cds As COPYDATASTRUCT
    Dim buf(1 To 255) As Byte

    CopyMemory buf(1), ByVal Message, Len(Message)
    cds.dwData = 3
    cds.cbData = Len(Message) + 1
    cds.lpData = VarPtr(buf(1))
    i = SendMessage(Handle, WM_COPYDATA, Me.hWnd, cds)
End Sub

اینم تغییرات تابع MySub

کد:
Private Sub MySub(lParam As Long)
    Dim cds As COPYDATASTRUCT
    Dim buf(1 To 255) As Byte

    Call CopyMemory(cds, ByVal lParam, Len(cds))

    If cds.dwData = 3 Then
        CopyMemory buf(1), ByVal cds.lpData, cds.cbData
        a$ = StrConv(buf, vbUnicode)
        a$ = Left$(a$, InStr(1, a$, Chr$(0)) - 1)
        If a$ = "Open Form1" Then Form1.Show
    End If
End Sub
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۳:۰۸:۵۴، توسط Payman62.)
۰۲-بهمن-۱۳۹۰, ۱۳:۰۶:۵۲
ارسال‌ها
پاسخ
تشکر شده توسط : RAMA2009
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #17
RE: مدیریت برنامه ی از قبل باز شده
دوتا if تو در تو گذاشتم
اون elseif ی که شما میگید مربوط به if اول میشه
exit sub هم محض احتیاط گذاشتم، با اینکه میدونستم بعد از دستور end دیگه کدی خونده نمیشه،
payman62 جان من با گذاشتن Textbox و بررسی $a توی رویداد changeش برای show کردن form1 ،مثه این بود که لقمه رو دور دهنم میچرخوندم، اما حالا متوجه اشتباهم شدم
***هرکاری کردم نتونستم if هارو و کدهارو چیدمانش رو درست کنم، لطفا رسیدگی کنید، متن انگلیسی رو خیلی قاتی پاتی مینویسه***
این کد هم واسه اینه که بالا گفتی سر در نیوردی، کاملترش کردم، تا متوجه ش بشی( اگرچه این کد مشکل داره و الان دیگه از این کد استفاده نمیکنم)
کد:
Private Sub Form_Load()

Dim ProgramIsRun As Long
ProgramIsRun = FindWindow(vbNullString, "Form1")

If (App.PrevInstance = True) Then 'agar barname Run bud  
If ProgramIsRun = 0 Then 'agar Form1 Run Nabud
'ersale message baraye run kardane form >>
Dim cds As COPYDATASTRUCT
Dim ThWnd As Long
Dim buf(1 To 255) As Byte

ThWnd = FindWindow(vbNullString, "Form2")
a$ = "RunMe"

CopyMemory buf(1), ByVal a$, Len(a$)
cds.dwData = 3
cds.cbData = Len(a$) + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(ThWnd, WM_COPYDATA, Me.hwnd, cds)
'ersale message baraye run kardane form <<
End
Else 'agar Form1 Run bud
End
End If
ElseIf (App.PrevInstance = False) Then             'agar barname run nabud    
Form1.Show
Form2.Show
Frm_Load.Hide
End If
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۴:۱۱:۲۸، توسط RAMA2009.)
۰۲-بهمن-۱۳۹۰, ۱۳:۲۰:۱۲
ارسال‌ها
پاسخ
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #18
RE: مدیریت برنامه ی از قبل باز شده
سلام.
پست قبلی کد اصلاح شده رو براتون قرار داده بودم. ظاهرا پست من رو کامل نخوندید.
۰۲-بهمن-۱۳۹۰, ۱۳:۴۷:۰۷
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #19
RE: مدیریت برنامه ی از قبل باز شده
(۲۸-دى-۱۳۹۰, ۲۰:۴۱:۴۹)atige نوشته است: نمیشه شما به جای اینکه فرم 1 رو ببندی اونو هاید کنی؟
اگه مایل بودی میتونم بیشتر توضیح بدم
***چون توضیحش یکم مفصله.
اگه برنامه رو دانلود کنی شاید بفهمی منظورم چیه
فقط وقتی دانلودش کردی توی فرم frm_load توی رویداد form_Load خط اول قبل از ...=Form1.Label5.Caption یه Rem بنویس یا یه ' بزار تا جواب بده.
(۰۲-بهمن-۱۳۹۰, ۱۳:۴۷:۰۷)Payman62 نوشته است: سلام.
پست قبلی کد اصلاح شده رو براتون قرار داده بودم. ظاهرا پست من رو کامل نخوندید.

payman 62 جان چرا خوب خوندمWink، و از کد شما استفاده کردم Clap، و کاملا متوجه اشتباهم شدمRolleyes ، وازتون هم خیلی خیلی مچکرم WinkHeart ، این کد رو هم گذاشتم تا کدی که قبلا گذاشته بودم و شما متوجه ش نشده بودین رو کامل ترش کنم تا متوجه منظورم بشین.
ممنون
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۳:۵۵:۳۰، توسط RAMA2009.)
۰۲-بهمن-۱۳۹۰, ۱۳:۴۹:۰۸
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #20
RE: مدیریت برنامه ی از قبل باز شده
payman62 سلام، با این مطلب قصدم رفع اشکال و کمک به کسایی هست که دارن موضوع رو میخونن، و من قصد بدی ندارم. کد شما کاملا درست میباشد اما چند تا نکته باید بهش اضافه کنم:
در کدی که شما دادی
1- Dim ThWnd As Long کم داره و باید اضافه بشه
2- بعد از دستور MySendMessage "Open Form1", ThWnd در رویداد load فرم frm_load باید دستور End رو اضافه کنیم چون وقتی پیغام رو میفرسته دیگه دوباره نباید خودش اجرا بشه، بنابراین پیغام رو میفرسته و End میشه
3- در همان رویداد Load در فرم frm_load بعد از دستورات مربوط به if دوم باید عبارات زیر اضافه شوند:
Else
End
این else زمانی اتفاق می افتد که فرم 1 درحال اجرا باشد، بنابراین نیازی به ارسال message و اجرای دوباره ی برنامه نیست.
تابع MySendMessage مشکلی نداره،
تابع mySub هم مشکلی نداره و به همون شکلی که شما گفتید میباشد
در کل کد رویداد Load در frm_load به شکل زیر است:
کد:
Private Sub Form_Load()
'For Hide program from windows task manager >>
  Set Reg = CreateObject("wscript.shell")
'Reg.RegWrite HKEY_LOCAL_MACHINE \ SOFTWARE \ MICROSOFT \ WINDOWS \ CURRENTVERSION \ RUN \ "&" \ App.EXEName, App.Path & "\" & App.EXEName & ".exe"
  App.TaskVisible = False
'For Hide program from windows task manager <<

  Dim ThWnd As Long
  Dim blnForm1IsOpen As Boolean
     If (App.PrevInstance) Then
         blnForm1IsOpen = CBool(FindWindow(vbNullString, "Form1:{8522A1F2-2F0B-4a29-BB25-E52F2E096C08}"))
         If blnForm1IsOpen = False Then 'agar form1 run nabud
             ThWnd = FindWindow(vbNullString, "Form2:{0226AEB4-8B3A-4a5a-A252-2037EB39AE08}")
             MySendMessage "Open Form1", ThWnd
             End
         Else 'agar form1 run bud
             End
         End If
     Else
         Form1.Show
         Form2.Show
         Frm_Load.Hide
     End If
End Sub
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۵:۵۳:۳۷، توسط RAMA2009.)
۰۲-بهمن-۱۳۹۰, ۱۵:۴۳:۲۵
ارسال‌ها
پاسخ
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #21
RE: مدیریت برنامه ی از قبل باز شده
سلام.
چرا

کد:
If Condition1 Then
    'Code
    If Condition2 Then
        'Code
        End
    Else
        End
    End If
Else
    'Code
End If

وقتی دستوری هم در if هست و هم در else بهتره یه بار بیرون if نوشته بشه.
به این صورت:

کد:
If Condition1 Then
    'Code
    If Condition2 Then
        'Code
    End If
    End
Else
    'Code
End If

در آخر هم بهتره پروژت با تابع Main بیاد بالا. در اون صورت به اون end یا مخفی کردن اون فرم یا اصلا به اون فرم اضافی نیازی نیست.
منم طبق عادتی که نسبت به تابع main دارم end رو قرار ندادم.
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۹:۰۰:۵۳، توسط Payman62.)
۰۲-بهمن-۱۳۹۰, ۱۸:۵۵:۲۲
ارسال‌ها
پاسخ
RAMA2009 آفلاین
Banned

ارسال‌ها: 131
موضوع‌ها: 38
تاریخ عضویت: اسفند ۱۳۸۹

تشکرها : 43
( 59 تشکر در 51 ارسال )
ارسال: #22
RE: مدیریت برنامه ی از قبل باز شده
Ok حرف شما درسته،
باز هم ممنون به خاطر تمام راهنمایی ها ی خوبت، خیلی خوب بود ممنون ;-)
(آخرین ویرایش در این ارسال: ۰۲-بهمن-۱۳۹۰, ۱۹:۵۴:۵۴، توسط RAMA2009.)
۰۲-بهمن-۱۳۹۰, ۱۹:۴۷:۱۵
ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  مدیریت و نمایش پیغام مناسب برای خطاهای احتمالی sepahbod 3 3,674 ۱۴-فروردین-۱۳۹۳, ۲۲:۰۶:۴۹
آخرین ارسال: Di Di
  مدیریت فایل های از قبل ایجاد شده در کادر محاوره ای save RAMA2009 1 2,989 ۱۱-بهمن-۱۳۹۰, ۱۹:۴۵:۱۲
آخرین ارسال: Ghoghnus
  مدیریت پورت usb EstaPC 7 8,905 ۰۲-تير-۱۳۸۸, ۱۶:۴۹:۲۹
آخرین ارسال: mahdi2292
  ساخت برنامه مدیریت کلوپ Eris 4 4,158 ۲۶-اسفند-۱۳۸۶, ۰۹:۳۷:۵۱
آخرین ارسال: godvb
  مدیریت چهارراه hamed_Arfaee 1 1,575 ۱۳-آبان-۱۳۸۶, ۲۱:۵۶:۲۹
آخرین ارسال: hamed_Arfaee

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS