سلام دوستان
سورس تشخیص change شدن زبان صفحه کلید، هنگامی که فوکوس روی فرم نیست.
در کل چیکار کنیم وقتی فوکوس روی فرم نیست، یه رویدادی تشخیص داده بشه.
مثلا سورس change شدن صفحه کلید رو بلدم ولی وقتی فوکوس روی فرم نیست کار نمیکنه، حالا چیکار کنم؟
چی شد پس؟! لطفا.... لازمش دارم
سلام.
از تایمر استفاده کن.
سلام از تایمر استفاده کردم ولی زمانی که فوکوس روی فرم نیست جواب نمیده،
اما به محض اینکه فرم فوکوس میشه جواب میده
من میخوام زمانی که فوکوس رو فرم نیست، تشخیص بده که زبان صفحه کلید change شده
فوکوس کجاست؟
روی برنامه هم نیست؟ اگه روی برنامه هست همون جا می توین بفرستی روی فروم
تایمر تا اونجا که من می دونم ایونت هاش همیشه اجرا می شه کاری به فوکوس نداره درست داری چک می کنی
روش دیگه ای که هست هوک کردن ایونت های سیستم که کار راحتی نیست
سلام
برنامه ی زیر رو ببینید، وقتی فوکوس روی فرم نیست(مثلا فرض کنید ویزیبل فرم فالسه)، زبان صفحه کلید رو change کنید، میبینید که
برنامه نشخیص نمیده - که مشکل اینجاست
حالا وقتی فوکوس رو فرمه اینکارو انجام بدید میبینید که برنامه کار میکنه
نقل قول: برنامه ی زیر رو ببینید
من لینوکس دارم نمی تونم ببینم
نقل قول: وقتی فوکوس روی فرم نیست(مثلا فرض کنید ویزیبل فرم فالسه)
این ۲ تا خیلی فرق دارن باهم، فوکوس روی فرم نیست. یعنی پنجره دیگه ای رو هست و این پنجره فعال ولی زیر پنجره های دیگه قرار گرفته
ویزیبل رو که فالس می کنی فکر کنم کل پنجره رو ازکار می ندازه و دیگه تایمر ها کار نمی کنه
شما تایمر رو بزار توی فرم بالایی (اصلی) و اونجا چک کن
سلام.
مشکل شما اینه که هندل به API ندادی و فرم جاری به صورت دیفالت بررسی میشه.
شما باید هندل پنجره فعال رو به برنامت بدی تا زبانش رو چک کنه.
تغییری در کدت دادم تا ابتدا هندل پنجره فعال به دست بیاد و بعد زبان اون پنجره بررسی بشه.
کد:
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
Private Const LOCALE_SISO639LANGNAME As Long = &H59
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Dim strChangeLanguage, strCurrentLanguage As String
Private Sub Form_Load()
strCurrentLanguage = GetKeyName
End Sub
Private Sub Timer1_Timer()
strChangeLanguage = GetKeyName
If strChangeLanguage <> strCurrentLanguage Then
MsgBox "Keyboard language change to '" & GetKeyName & "'", vbInformation + vbOKOnly, "Keyboard"
strCurrentLanguage = GetKeyName
End If
End Sub
Private Function GetKeyName() As String
GetKeyName = pvGetUserLocaleInfo(GetKeyboardLayout(GetActiveWindow) And &HFFFF&, LOCALE_SISO639LANGNAME)
End Function
Private Function GetActiveWindow()
Dim lngCurrent_HKL As Long
Dim lngActiveWindowHandle As Long
Dim lngActiveWindowThreadId As Long
lngActiveWindowHandle = Val(GetForegroundWindow)
Dim lngTemp As Long
lngActiveWindowThreadId = GetWindowThreadProcessId(lngActiveWindowHandle, lngTemp)
GetActiveWindow = lngActiveWindowThreadId
End Function
Private Function pvGetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String
Dim sReturn As String
Dim nSize As Long
nSize = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
If nSize > 0 Then
sReturn = Space$(nSize)
nSize = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
If nSize > 0 Then
pvGetUserLocaleInfo = Left$(sReturn, nSize - 1)
End If
End If
End Function