Nhờ tư vấn - Xác định bảng mã của Unikey đang dùng | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Nhờ tư vấn Xác định bảng mã của Unikey đang dùng

bbkim

Mỗi người một câu chuyện
Các bạn giúp mình tìm xác định Bảng mã đang sử dụng của Unikey và thay đổi bảng mã đó bằng vb.net với
VD: Unikey đang dùng bảng mã Unicode. Mình chuyển nó qua Bảng mã TCVN3 (ABC)
1667639350140.png

Bạn nào biết thì giúp mình với hoặc share mình hướng đi để mình tìm hiểu.
p/s: Mình làm tool nhỏ để tự đổi bảng mã khi đang dùng cửa sổ này hoặc cửa sổ kia. Vì có một vài phần mềm cũ dùng TCVN3 mà phổ biến lại là Unicode.
Mỗi lần đổi thì phải bấm thủ công nên muốn làm tool cho lười.

Cảm ơn các bạn.

p/s: Mình có tool debug ở #15. Bạn nào muốn dùng thì tải về dùng và góp ý thêm cho mình nha.
p/s2: Mình up source lên cho bạn nào thích vọc hay sửa theo ý thích luôn.
 
Sửa lần cuối:

wikikip

Rìu Sắt
@bbkim bạn làm được thì up lên cho ai cũng lười như bạn (và lười hơn bạn) được hưởng lây với nhé {big_smile}
 

bbkim

Mỗi người một câu chuyện
bạn có thể sử dụng tổ hợp phím
@bbkim bạn làm được thì up lên cho ai cũng lười như bạn (và lười hơn bạn) được hưởng lây với nhé {big_smile}
hiện tại thì tool của mình đã làm được việc mình muốn nó làm nhưng nó đang hơi bị ngu nên mình đang muốn làm cho nó khôn hơn 1 xíu.
Mình cho nó dùng tổ hợp phím khi window active. Nhưng mà đang kẹt ở chỗ nếu mình đổi bảng mã thủ công thì nó không xác định được. Tại mình xác định bảng mã sau khi gửi tổ hợp phím nên nó không chính xác 100%. :-((
 

chipsteps

Rìu Vàng
em thì thường dùng Uconvert, gặp font nào lạ là chuyển toàn bộ về Time New Roman luôn cho nhanh bác ạ!
 

Trong Le

Rìu Vàng
mình dùng EVkey thì dùng tổ hợp phím nhanh để chuyển qua lại giữa Vni Window và Unicode.
 

wikikip

Rìu Sắt
Evkey có tính năng tự đổi bảng mã cho các phần mềm khác nhau đấy bác. Ngày trước mình chơi 1 vài game không dùng unicode được cứ phải đổi phiền vãi. Thằng Evkey có cái tính năng này sướng hẳn, khỏi phải chuyển mất thời gian.
Xem phần đính kèm 39419
mình thì vẫn phải dùng unikey vì có mấy autoslip cho autocad nó chỉ hoạt động với unikey. vẫn hóng bạn @bbkim hoàn thành để ăn ké. kk
 

lvt491

Rìu Vàng Đôi
Test thử code C# dưới thấy nó đổi được, bác chuyển sang VB xem thế nào

C#:
using System;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var unikey = FindWindow("UniKey MainWnd", "UniKey 4.2 RC5");

            if ((int)unikey == 0)
            {
                Console.WriteLine("No UniKey Open !");
            } 
            else
            {
                //Unicode: 0, TCVN3: 20, VNI: 40
                int wparam = 0;

                SendMessage((int)unikey, 1129, wparam, 0);
            }
        }

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
    }
}
 

bbkim

Mỗi người một câu chuyện
Test thử code C# dưới thấy nó đổi được, bác chuyển sang VB xem thế nào

C#:
using System;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var unikey = FindWindow("UniKey MainWnd", "UniKey 4.2 RC5");

            if ((int)unikey == 0)
            {
                Console.WriteLine("No UniKey Open !");
            }
            else
            {
                //Unicode: 0, TCVN3: 20, VNI: 40
                int wparam = 0;

                SendMessage((int)unikey, 1129, wparam, 0);
            }
        }

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
    }
}
C-like:
Imports System
Imports System.Runtime.InteropServices

Namespace ConsoleApp1
    Friend Class Program
        Private Shared Sub Main(ByVal args As String())
            Dim unikey = FindWindow("UniKey MainWnd", "UniKey 4.2 RC5")
            If CInt(unikey) = 0 Then
                Console.WriteLine("No UniKey Open !")
            Else
                'Unicode: 0, TCVN3: 20, VNI: 40
                Dim wparam = 0
                SendMessage(CInt(unikey), 1129, wparam, 0)
            End If
        End Sub

        <DllImport("user32.dll")>
        Public Shared Function FindWindow(ByVal strClassName As String, ByVal strWindowName As String) As IntPtr
        End Function

        <DllImport("user32.dll")>
        Public Shared Function SendMessage(ByVal hWnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        End Function
    End Class
End Namespace

Code dùng ổn bác ạ. Mình vẫn đang tìm cách đọc xem hiện tại Unikey đang dùng bảng mã nào mà vẫn chưa được.
 

lvt491

Rìu Vàng Đôi
Code dùng ổn bác ạ. Mình vẫn đang tìm cách đọc xem hiện tại Unikey đang dùng bảng mã nào mà vẫn chưa được.

Bác thử cái này xem, full code:

C#:
using System;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetCT());
            //ChangeCT(0x14);
            Console.ReadKey();
        }

        static IntPtr GetUnikey()
        {
            var unikey = FindWindow("UniKey MainWnd", "UniKey 4.2 RC5");
            if (unikey == IntPtr.Zero)
                Console.WriteLine("No UniKey Open !");
            return unikey;
        }

        //wparam: Unicode = 0, TCVN3 = 0x14, VNI = 0x28
        static void ChangeCT(int wparam)
        {
            var unikey = GetUnikey();
            if (unikey == IntPtr.Zero)
                return;
            SendMessage(unikey, 0x0469, wparam, 0);
        }

        //Only for Unikey 32bit
        static string GetCT()
        {
            var unikey = GetUnikey();
            if (unikey == IntPtr.Zero)
                return "";
            //Get PID
            GetWindowThreadProcessId(unikey, out int unikeyID);
            //PROCESS_WM_READ = 0x10
            unikey = OpenProcess(0x10, false, unikeyID);
            byte[] buffer = new byte[4];
            ReadProcessMemory(unikey, 0x4DB8E0, buffer, buffer.Length, out int bytesRead);
            string value = "";
            switch (BitConverter.ToInt32(buffer, 0))
            {
                case 40056:
                    value = "Unicode";
                    break;
                case 40057:
                    value = "TCVN3";
                    break;
                case 40058:
                    value = "VNI Windows";
                    break;
                default:
                    value = "Other";
                    break;
            }
            return value;
        }

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string strClassName, string strWindowName);

        [DllImport("user32.dll")]
        static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        [DllImport("kernel32.dll")]
        static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll")]
        static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead);
    }
}
 

bbkim

Mỗi người một câu chuyện
Bác thử cái này xem, full code:

C#:
using System;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetCT());
            //ChangeCT(0x14);
            Console.ReadKey();
        }

        static IntPtr GetUnikey()
        {
            var unikey = FindWindow("UniKey MainWnd", "UniKey 4.2 RC5");
            if (unikey == IntPtr.Zero)
                Console.WriteLine("No UniKey Open !");
            return unikey;
        }

        //wparam: Unicode = 0, TCVN3 = 0x14, VNI = 0x28
        static void ChangeCT(int wparam)
        {
            var unikey = GetUnikey();
            if (unikey == IntPtr.Zero)
                return;
            SendMessage(unikey, 0x0469, wparam, 0);
        }

        //Only for Unikey 32bit
        static string GetCT()
        {
            var unikey = GetUnikey();
            if (unikey == IntPtr.Zero)
                return "";
            //Get PID
            GetWindowThreadProcessId(unikey, out int unikeyID);
            //PROCESS_WM_READ = 0x10
            unikey = OpenProcess(0x10, false, unikeyID);
            byte[] buffer = new byte[4];
            ReadProcessMemory(unikey, 0x4DB8E0, buffer, buffer.Length, out int bytesRead);
            string value = "";
            switch (BitConverter.ToInt32(buffer, 0))
            {
                case 40056:
                    value = "Unicode";
                    break;
                case 40057:
                    value = "TCVN3";
                    break;
                case 40058:
                    value = "VNI Windows";
                    break;
                default:
                    value = "Other";
                    break;
            }
            return value;
        }

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string strClassName, string strWindowName);

        [DllImport("user32.dll")]
        static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        [DllImport("kernel32.dll")]
        static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll")]
        static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead);
    }
}
Cảm ơn bác. Bác demo có ra kết quả không? Mình chạy thì BitConverter.ToInt32(buffer, 0) ra kết quả bằng 0 chứ không ra kết quả khác. :-((
Bác dùng tool nào để lấy thông tin á? Bày mình với. Mình dùng spy++ với winspector spy mà không tìm được cái muốn tìm :-(( :-(( :-((
 

lvt491

Rìu Vàng Đôi
Cảm ơn bác. Bác demo có ra kết quả không? Mình chạy thì BitConverter.ToInt32(buffer, 0) ra kết quả bằng 0 chứ không ra kết quả khác. :-((
Bác dùng tool nào để lấy thông tin á? Bày mình với. Mình dùng spy++ với winspector spy mà không tìm được cái muốn tìm :-(( :-(( :-((
Mình test với bản Unikey này:

Mình dùng thêm ArtMoney để tìm và đọc địa chỉ bộ nhớ (VA) lưu bảng mã của Unikey. Có thể bác dùng bản khác nên cái VA kia nó khác bởi thế mới đọc ko ra.
 

Attachments

  • ConsoleApp1.zip.txt
    2.7 KB · Lượt xem: 11

bbkim

Mỗi người một câu chuyện
Cảm ơn bạn @lvt491 đã share code cho mình.
Mình gửi lên bản debug cho bạn nào có nhu cầu giống mình.
Hiện tại thì mình chỉ code để nó chuyển đổi giữa Unicode (mặc định) và TCVN3 (ABC) (theo phần mềm bạn muốn).

Hướng dẫn cách sử dụng:
Các bạn tạo file "ACCS.ini" (mở phần mềm lên nó cũng tự tạo) với nội dung:
Mã:
Đường dẫn Unikey (VD:"C:\Program Files\UniKey\UniKeyNT.exe")
Tên phần mềm 1 (VD: "cad")
Tên phần mềm 2 (VD: "DLCNBC")
... (muốn thêm bao nhiêu thì thêm tùy các bạn)
Mở phần mềm lên và để nó tự chuyển đổi theo cửa sổ active. Nó sẽ hiển thị ở góc dưới là bạn đang sử dụng bảng mã nào.

Mình test tool này trên Unikey 4.3 RC5 (32bit & 64bit) nên các bạn dùng bản thấp hơn nếu không hoạt động thì các bạn reply lại phiên bản để mình fix nha.

Khi nào mình rảnh mình sẽ thêm một số thứ nữa như tự động chuyển E/V theo cửa sổ, tự chuyển bảng mã theo font chữ cho word/excel/cad/... và thêm nhiều bảng mã hơn. Với điều kiện là mình rảnh. Chúc các bạn vui vẻ.
 

Attachments

  • ACCS.rar.txt
    12.8 KB · Lượt xem: 4
Sửa lần cuối:

baogia2010

Rìu Chiến Bạc
Cảm ơn bạn @lvt491 đã share code cho mình.
Mình gửi lên bản debug cho bạn nào có nhu cầu giống mình.
Hiện tại thì mình chỉ code để nó chuyển đổi giữa Unicode (mặc định) và TCVN3 (ABC) (theo phần mềm bạn muốn).

Hướng dẫn cách sử dụng:
Các bạn tạo file "ACCS.ini" (mở phần mềm lên nó cũng tự tạo) với nội dung:
Mã:
Đường dẫn Unikey (VD:"C:\Program Files\UniKey\UniKeyNT.exe")
Tên phần mềm 1 (VD: "cad")
Tên phần mềm 2 (VD: "DLCNBC")
... (muốn thêm bao nhiêu thì thêm tùy các bạn)
Mở phần mềm lên và để nó tự chuyển đổi theo cửa sổ active. Nó sẽ hiển thị ở góc dưới là bạn đang sử dụng bảng mã nào.

Mình test tool này trên Unikey 4.3 RC5 (32bit & 64bit) nên các bạn dùng bản thấp hơn nếu không hoạt động thì các bạn reply lại phiên bản để mình fix nha.

Khi nào mình rảnh mình sẽ thêm một số thứ nữa như tự động chuyển E/V theo cửa sổ, tự chuyển bảng mã theo font chữ cho word/excel/cad/... và thêm nhiều bảng mã hơn. Với điều kiện là mình rảnh. Chúc các bạn vui vẻ.
Đã thử sử dụng và chưa biết mình dùng đúng hay sai.
Gởi @bbkim vài tấm hình khi sử dụng ACCS
ACCS-1_compressed.jpg

ACCS-2_compressed.jpg

ACCS-3_compressed.jpg

ACCS-4_compressed.jpg
 

bbkim

Mỗi người một câu chuyện


Top