ورود

View Full Version : سوال: چطور فوکوس ویندوز رو به برنامه خاصی هدایت کنیم؟؟؟



Hadiir.net
سه شنبه 01 اردیبهشت 1388, 20:25 عصر
من برنامه نوشتم که نمیخوام برای چندین بار اجرا بشه مشکل اجرای مجدد برنامه را حل کردم اما نمیتونم بعد لغو اجرای مجدد چطور فوکوس رو به برنامه در حال اجرا انتقال بدم تا کاربر برنامه را که از قبل اجرا شده ببینه :متفکر:

xxxxx_xxxxx
سه شنبه 01 اردیبهشت 1388, 20:36 عصر
با استفاده از عنوان فرم قبلي:


h = FindWindowA(vbNullString, "FormTitle")
If h <> 0 Then SetForegroundWindow (h)

بجاي FormTitle عنوان فرمتون رو بنويسيد.
دو تابع استفاده شده:


Private Declare Function FindWindowA Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

موفق باشيد/

Hadiir.net
سه شنبه 01 اردیبهشت 1388, 21:07 عصر
تشکر ولی من موفق نشدم ممکنه یه نمونه ساده برام بزارین
باعث زحمت





Private Declare Function FindWindowA Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long


Private Sub Form_Load()
h = FindWindowA(vbNullString, "Test_App")
'Debug.Print h
If App.PrevInstance = True Then
MsgBox " App alreay runing ", vbExclamation, "Error"
If h <> 0 Then SetForegroundWindow (h)
End
End If

End Sub

xxxxx_xxxxx
چهارشنبه 02 اردیبهشت 1388, 12:06 عصر
من اين كارو تو برنامه هام انجام ميدادم و درست هم كار مي كرد. نمي دونم چرا حالا اينطوريه!
با توابع SetActiveWindow و PutFocus و SetWindowPos و هم امتحان كردم اما نشد!!!! شايد به خاطر تغييراتي باشه كه من تو كل Theme ويندوز و پنجره هاش به وجود آوردم. نمي دونم! ولي هندل پنجره رو بدست مياره!
جالب اينجاست كه بعد از SetForegroundWindow اگر با SendKeys كليد Enter رو به پنجره بفرستي اونوقت جواب ميده و پنجره رو بالا مياره. ولي قبلاً نيازي به اين كار نبود.
دوستان اگر راهي براي حل اين موضوع درنظر دارند ممنون ميشيم ارئه كنند.

vbhamed
چهارشنبه 02 اردیبهشت 1388, 18:30 عصر
سلام

از دستور زير استفاده كنيد


AppActivate "عنوان فرم برنامه قبلي"
DoEvents


البته بهتره اين رو تو حلقه For بزاريد و حداقل 5 بار اجراش كنيد
ضمنا برنامه بايد Exe باشه يا با F5 اجرا بشه نه F7 و F8، وگرنه پنجره ويژوال بيسيك دوباره فعال ميشه

اگر باز هم نتونستيد بگين تا يك راه پيچيده تر ولي مطمئن تر بزارم

Hadiir.net
پنج شنبه 03 اردیبهشت 1388, 20:26 عصر
این روش هم افاقه نکرد



Option Explicit

Private Sub Form_Load()
Dim i As Integer
If App.PrevInstance = True Then
MsgBox " App alreay runing ", vbExclamation, "Error"
For i = 0 To 5
AppActivate "ActiveApp"
DoEvents
Next
End
End If
End Sub

vbhamed
جمعه 04 اردیبهشت 1388, 03:07 صبح
سلام
عنوان فرم قبلي ActiveApp هست ؟
در حالت نرمال هست يا كوچك شده ؟

Hadiir.net
شنبه 05 اردیبهشت 1388, 12:53 عصر
سلام
عنوان فرم قبلي ActiveApp هست ؟
در حالت نرمال هست يا كوچك شده ؟

بله
ممنون میشم اگه شما یه نمونه ساده برام بزارین

vbhamed
یک شنبه 06 اردیبهشت 1388, 15:09 عصر
سلام
از روش زير استفاده كنيد

محتويات ماژول :

Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal Cx As Long, ByVal Cy As Long, ByVal wFlags As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Global Const SWP_SHOWWINDOW = &H40

Public Const Hwnd_TopMost = -1
Public Const Hwnd_NoTopMost = -2




محتويات فرم :



Private Sub Form_Load()

On Error Resume Next

Dim hw&, l&, t&, w&, h&

If App.PrevInstance Then

MsgBox "برنامه قبلا اجرا شده است"

Open App.Path & "\PrevInstance.txt" For Input As #1
Input #1, hw, l, t, w, h
Close #1

ShowWindow hw, 1
SetWindowPos hw, Hwnd_TopMost, l, t, w, h, SWP_SHOWWINDOW
SetWindowPos hw, Hwnd_NoTopMost, l, t, w, h, SWP_SHOWWINDOW
DoEvents

End

Else
Open App.Path & "\PrevInstance.txt" For Output As #1
Write #1, Me.hWnd, Me.Left \ 15, Me.Top \ 15, Me.Width \ 15, Me.Height \ 15
Close #1

End If

End Sub

Hadiir.net
دوشنبه 07 اردیبهشت 1388, 17:35 عصر
سلام
از روش زير استفاده كنيد

محتويات ماژول :

Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal Cx As Long, ByVal Cy As Long, ByVal wFlags As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Global Const SWP_SHOWWINDOW = &H40

Public Const Hwnd_TopMost = -1
Public Const Hwnd_NoTopMost = -2


محتويات فرم :



Private Sub Form_Load()

On Error Resume Next

Dim hw&, l&, t&, w&, h&

If App.PrevInstance Then

MsgBox "برنامه قبلا اجرا شده است"

Open App.Path & "\PrevInstance.txt" For Input As #1
Input #1, hw, l, t, w, h
Close #1

ShowWindow hw, 1
SetWindowPos hw, Hwnd_TopMost, l, t, w, h, SWP_SHOWWINDOW
SetWindowPos hw, Hwnd_NoTopMost, l, t, w, h, SWP_SHOWWINDOW
DoEvents

End

Else
Open App.Path & "\PrevInstance.txt" For Output As #1
Write #1, Me.hWnd, Me.Left \ 15, Me.Top \ 15, Me.Width \ 15, Me.Height \ 15
Close #1

End If

End Sub



بسیار عالی بود مشکلم حل شد.
با سپاس فراوان از شما