PDA

View Full Version : حرفه ای: بدست آوردن زبان نوشتار(input language) پنجره فعال ویندوز



arash020
چهارشنبه 28 تیر 1391, 00:54 صبح
سلام اساتید و مهندسین گرامی , چطور میشه فهمید پنجره فعال در لحظه چه زبانی برای نوشتن رو فعال داره؟ فرض کنید با کدی تونستیم عنوان و هندل پنجره رویین(فعال) ویندوز که کاربر داره باهاش کار میکنه رو پیداکنیم . حالا چطور میشه فهمید چه زبانی روی این پنجره فعال هستش؟؟؟ منظور زبان نوشتن کیبورد هست ش . ( how to get active window language) ممنون و متشکر

مهرداد صفا
چهارشنبه 28 تیر 1391, 03:08 صبح
با سلام
با استفاده از توابع GetKeyboardLayout و GetKeyboardLayoutNameA میتوان زبان حال حاضر سیستم را گرفت. هر دو در کتابخانه user32 میباشند و مقدار برگشتی آنها Int32 می باشد.

1- Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Integer) As Integer
مقدار برگشتی:
67699721 برای American English
69796905 رای فارسی

2- Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Integer
مقدار رشته ارسالی:
H409 american English
H429 persion

shahryari
پنج شنبه 29 تیر 1391, 09:45 صبح
با سلام
با این روش میتوانید زبان فعال ویندوز را بصورت کامل دریافت کنید


Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form1
<DllImport("user32")> _
Private Shared Function GetKeyboardLayoutName(ByVal sb As System.Text.StringBuilder) As Integer
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sb As New StringBuilder(" "c, 256)
Dim len As Integer
len = GetKeyboardLayoutName(sb)
MessageBox.Show(System.Globalization.CultureInfo.G etCultureInfo(Integer.Parse(sb.ToString, Globalization.NumberStyles.HexNumber)).EnglishName )
End Sub
End Class


http://ararz-soft.persiangig.com/document/pic/252.jpg
-----------------------------------
موفق باشید

arash020
جمعه 30 تیر 1391, 00:31 صبح
سلام
با تشکر از توجه شما :
دقیق تر سوالم رو مطرخ میکنم که زودتر به جواب درست برسیم
همه هم استفاده کرده باشن...

من با کد زیر در هر لحظه بدست میارم که چه پنجره ای توسط کاربر فعال است . بگید خب...
Public Class Form1

' Public Declare Function GetForegroundWindow Lib "user32" () As System.IntPtr
Public Declare Function GetActiveWindow Lib "user32" () As System.IntPtr
Public Declare Auto Function GetWindowText Lib "user32" (ByVal hWnd As System.IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
Declare Function GetForegroundWindow Lib "user32.dll" () As Int32
'Public Declare Function GetForegroundWindow Lib "user32" () As System.IntPtr
Public Declare Auto Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As System.IntPtr, ByVal ProcessId As UInteger) As UInteger

Declare Function GetWindowThreadProcessId Lib "user32.dll" ( _
ByVal hwnd As Int32, _
ByRef lpdwProcessId As Int32) As Int32


Function GetCaption() As String
' Create a buffer of 256 characters
Dim Caption As New System.Text.StringBuilder(256)

Dim hWnd As IntPtr = GetActiveWindow()

GetWindowText(hWnd, Caption, Caption.Capacity)

Return Caption.ToString()

End Function
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim Caption As New System.Text.StringBuilder(256)

Dim hWnd As IntPtr = GetForegroundWindow()

TextBox1.Text = GetWindowText(hWnd, Caption, Caption.Capacity)

TextBox2.Text = hWnd
Me.Text = RetCurTitle()
End Sub

Public Function RetCurTitle() As String
Dim processID As Int32
GetWindowThreadProcessId(GetForegroundWindow(), processID)
Return Process.GetProcessById(processID).MainWindowTitle
End Function
'Public Function RetCurTitle() As String
' Dim processID As UInteger
' 'Dim p As Process
' Dim hWnd As IntPtr = GetForegroundWindow()
' processID = GetWindowThreadProcessId(hWnd, processID)
' layerNumCur.Text = processID
' Debug.WriteLine("Process ID = " & processID)
' 'p = Process.GetProcessById(processID)
' 'Caption = p.ProcessName
' 'GetWindowText(hWnd, Caption, Caption.Capacity)
' Return processID
'End Function
End Class
خب!
حالا میخوام با توجه به این موضوع زبان کیبورد همین پنجره فعال رو بدست بیارم.
نه زبان فرم فعلی برنامه!!!!!!!!
دوستان میشه کد پست شماره دو رو برای این کار استفاده کرد؟
لطفا کمک کنید ...ممنون میشم.