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
بسیار عالی بود مشکلم حل شد.
با سپاس فراوان از شما
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.