PDA

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



mina.net
دوشنبه 10 فروردین 1388, 17:43 عصر
سلام دوستان
من در کنترل DATETIMEOICKER فارسی که نوشتم احتیاج دارم اگر فرم یا برنامه ای دیگر باز شد فرم تقویم خود به خود بسته بشه چون دیده نمی شه اما باز هست و این صورت خوشی نداره. چطور می تونم این کار رو انجام بدم .

mithridates
دوشنبه 10 فروردین 1388, 18:21 عصر
شما توسط تابع GetForegroundWindow اگه اشتباه نکنم میتونی پنجره فعال رو بگیری

میتونی تعریف کنی اگه مختصات پنجره فعال رو پنجره شمابود برنامه بسته بشه

mina.net
دوشنبه 10 فروردین 1388, 20:22 عصر
اگه یک کم بیشتر توضیح بدی با مثال ممنون می شم.

mithridates
دوشنبه 10 فروردین 1388, 20:37 عصر
Private Sub Timer1_Timer()
Me.List1.Clear
Dim rc As Long, lpRect As RECT
Dim Pos As PointApi, hWnd As Long
Dim Temp As String

rc = GetCursorPos(Pos)
hWnd = WindowFromPoint(Pos.X, Pos.Y)

Call GetWindowRect(hWnd, lpRect)

Temp = String(256, Chr(0))
Call GetWindowText(hWnd, Temp, Len(Temp))
a = InStr(Temp, Chr(0))
If a > 1 Then
Temp = Mid(Temp, 1, a - 1)
Else
Temp = ""
End If
'•\Ž¦
With Me.List1
.AddItem Temp
.AddItem ""
.AddItem "¶ã‹÷‚ÌXÀ•W F" + Str(lpRect.Left)
.AddItem "“¯AYÀ•W F" + Str(lpRect.Top)
.AddItem "‰E‰º‹÷‚ÌXÀ•W F" + Str(lpRect.Right)
.AddItem "“¯AYÀ•W F" + Str(lpRect.Bottom)
End With
End Sub


جای WindowFromPoint از GetForegroundWindow استفاده کنید

کمی وقت بگذارید خیلی راحت هست

mithridates
دوشنبه 10 فروردین 1388, 20:40 عصر
راستی من کد رو با vb6 گذاشتم امیدوارم در استفاده مشکل نداشته باشید

mithridates
دوشنبه 10 فروردین 1388, 20:43 عصر
Structure RECT
Public left As Long
Public top As Long
Public right As Long
Public bottom As Long
End Structure

Declare Function GetWindowRect Lib "user32.dll" _
(ByVal hWnd As Long, ByVal lpRect As RECT) As Long
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strWindowClassName As String
Dim lngWindowHandle As Long
Dim udtWindowRect As RECT
Dim lngWin32apiResultCode As Long
strWindowClassName = "Notepad"
lngWindowHandle = FindWindow(strWindowClassName, vbNullString)
lngWin32apiResultCode = GetWindowRect(lngWindowHandle, udtWindowRect)
With udtWindowRect
Debug.WriteLine("(" & .left & "," & .top & ")-" & "(" & .right & "," & .bottom & ")")
End With

End Sub




این هم دات نت

mina.net
سه شنبه 11 فروردین 1388, 11:35 صبح
سلام دوست عزیز
مشکل حل نشد. وقتی به سطر


lngWindowHandle = FindWindow(strWindowClassName, vbNullString)


می رسه خطا زیر صادر می شه.

A call to PInvoke function 'WindowsApplication1!WindowsApplication1.Form1::Ge tWindowRect' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

در ضمن این کد رو در چه رویداد ی بنویسم که همزمان با باز شدن یک پنجره دیگه این پنجره بسته بشه.اگه تو فرم اکتیو بنویسم که هزاران بار اجرا می شه.
یک چیز دیگه مهم نیست که فرمی که باز شده حتما روی این فرم باشه هر وقت Focus از روی این فرم برداشته شد . فرم خود به خود بسته بشه.
باز هم از توجهی که دارید سپاسگذارم.

mina.net
سه شنبه 11 فروردین 1388, 12:03 عصر
سلام دوستان
دم مایکروسافت گرم خیلی از کار ها رو برای ما راحت کرده ولی ما اونو سخت می بینیم. مشکل در این بود که در چه رویدادی بنویسیم.در رویداد Form1_Deactivate فرم دستورات مورد نظر تون رو بنویسید.



Private Sub Form1_Deactivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate
Me.Close()
End Sub

mithridates
سه شنبه 11 فروردین 1388, 15:07 عصر
شما گفتید هر وقت یک برنامه روی برنامه ما لود میشه! اگه کامل توضیح میدادین میگفتم. این برنامه که شما نوشتید اگه طرف یه نوت پد وا کنه یا یه ماشین حساب یا حتی رو دسکتاپ کلیک کنی برنامه بسته میشه