Sunday, November 1, 2009

WINDOWS API 5 - Xử lý của API khi làm việc với phần cứng và hệ thống

Để thuận lợi cũng như để mọi người cùng học tập và tham gia xây dựng đề án "Xây dựng bộ gõ tiếng Việt tăng tốc" chúng ta hãy làm quen với các hàm API liên quan đến vấn đề này. Mong rằng đây sẽ là cơ sở cơ bản để chúng ta cùng tiếp cận tìm hiểu cơ chế xây dựng một bộ gõ tiếng Việt đơn giản tại Website Lê Hoàn. Bạn có thể xem các hàm liên quan đến UNICODE hoặc các bài học cơ bản ban đầu Visual Basic tại trang http://www.bangden.com/soncuoc. Chi tiết và ví dụ các hàm bạn có thể tìm ở trang này.

1. Các hàm với chuột, con trỏ

Visual Basic cung cấp sự yểm trợ cho chuột và trỏ chuột (Trỏ chịu sự tác động của chuột thường để điều khiển) cũng như trỏ thanh (Trỏ chịu tác động của bàn phím thường để nhập liệu), tại một thời điểm chỉ có duy nhất một trỏ chuột và một trỏ thanh. Theo ngầm định, vị trí của trỏ chuột và trỏ thanh tính theo toạ độ của màn hình.

Windows cung cấp khả năng hạn chế con chuột vào một vùng khai báo trên màn hình gọi là clipping. Có hai hàm cơ bản là:

1. Declare Function ClipCursor Lib "user32" Alias "ClipCursor" (lpRect As Any) As Long

Công dụng: Giới hạn trỏ chuột đối với vùng chỉ định.

Tham số kèm:

LpREct - Vùng trỏ chuột định vị.

2. Declare Function GetClipCursor Lib "user32" Alias "GetClipCursor" (lprc As RECT) As Long

Công dụng: Nhận hình chữ nhật làm vùng làm việc cho trỏ chuột.

Tham số kèm:

Lprc - Hình chữ nhật nhận vùng làm việc.

Để nhận vị trí trỏ chuột, hay đặt trỏ chuột vào một vị trí ta sử dụng hai hàm:

3. Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

Công dụng: Xác định vị trí hiện tại của con trỏ chuột.

Tham số kèm:

LpPoint - Cấu trúc tiếp nhận toạ độ con trỏ trên màn hình.

4. Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long

Công dụng: Đặt con trỏ chuột vào một vị trí.

Tham số kèm:

X, Y Toạ độ màn hình cần đặt vị trí.

Các con trỏ theo ý muốn có thể được tạo từ cặp bitmap đơn sắc, kích thước có thể tới 32x32 pixel, nó có một cán 16 bit quản lý.

Khi ở một vị trí nào đó, ta thao tác chuột như click, d-click, hoặc drag. Các thao tác này sẽ ảnh hưởng đến một cửa sổ X nào đó. Ngay sau đó cửa sổ X này sẽ được nhận focus ngay cả khi trước đó nó đã mất focus. Vì vậy, cửa sổ này còn được gọi là capture (Hay cửa sổ đón chặn hay cửa sổ chộp).

Các hàm liên quan đến trỏ chuột cơ bản gồm:

5. Declare Function CopyCursor Lib "user32" Alias "CopyCursor" (ByVal hcur As Long) As Long

Công dụng: Copy thêm một trỏ chuột.

Tham số kèm:

hCur Cán của trỏ chuột cần sao chép.

6. Declare Function GetCapture Lib "user32" Alias "GetCapture" () As Long

Công dụng: Xác định cửa sổ đón chặn các tình huống chuột.

Trị trả về: Integer - Cán cửa sổ chặn tình huống chuột. Zero nếu không có cửa sổ nào.

7. Declare Function GetCursor Lib "user32" Alias "GetCursor" () As Long

Công dụng: Nhận cán của trỏ chuột hiện tại.

Trị trả về: Integer cán của trỏ chuột hiện tại. Zero nếu không có trỏ chuột hiện tại.

8. Declare Function GetDoubleClickTime Lib "user32" Alias "GetDoubleClickTime" () As Long

Công dụng: Xác định thời gian 2 lần nháy của thủ tục Dclick.

Trị trả về: Thời gian tính theo mili giây.

9. Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As String) As Long

Công dụng: Tải một trỏ chuột.

Tham số kèm:

HInstance Cán của chương trình mô tả trỏ chuột

LpCursorName - Chỉ số ID nguồn. Căn cứ vào chỉ số này mà trỏ sẽ có hình dáng khác nhau. Đây là những hình dáng ngầm định của hệ thống.

IDC_APPSTARTING - Trỏ khi một ứng dụng khởi động

IDC_NO - Trỏ khi không thực hiện việc nào.

IDC_SIZE - Trỏ khi thay đổi cỡ một đối tượng.

IDC_SIZEALL - Trỏ khi thay đổi tất cả cỡ của các đối tượng

IDC_SIZENESW - Trỏ là hình mũi tên 2 chiều chéo góc xuống dốc

IDC_SIZENS - Trỏ là hình mũi tên 2 chiều dọc.

IDC_SIZENWSE - Trỏ là hình mũi tên 2 chiều chéo lên dốc

IDC_SIZEWE - Trỏ là hình mũi tên 2 chiều ngang

IDC_UPARROW - Trỏ là hình mũi tên lên

IDC_WAIT - Trỏ là đồng hồ cát

IDC_ARROW: Trỏ hình mũi tên.

IDC_CROSS: Trỏ hình dấu thập.

IDC_IBEAM: Trỏ hình thanh chữ I

IDC_ICON: Biểu tượng rỗng.

10. Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long

Công dụng: Tải một hình dáng trỏ chuột từ tệp bên ngoài được khai báo

Trị trả về: Integer - Zero nếu thành công.

Tham số kèm:

LpFileName - Cán của tệp mô tả hình dáng trỏ.

11. Declare Function ReleaseCapture Lib "user32" Alias "ReleaseCapture" () As Long

Công dụng: Tải bỏ việc chặn đối với chuột.

12. Declare Function SetCapture Lib "user32" Alias "SetCapture" (ByVal hwnd As Long) As Long

Công dụng: Thiết lập việc chặn con chuột đối với cửa sổ.

Trị trả về: Integer là cán của cửa sổ trước đó đang chặn chuột. Zero nếu không có cửa sổ nào chặn trước đó.

Tham số kèm:

hwnd - Cán của cửa sổ cần thiết lập để chặn.

13. Declare Function SetCursor Lib "user32" Alias "SetCursor" (ByVal hCursor As Long) As Long

Công dụng: Đặt con trỏ hiện tại.

Trị trả về: Integer - Trị số mô tả trỏ trước đó.

Tham số kèm:

HCursor - Cán của con trỏ cần đặt làm hiện tại.

14. Declare Function SetDoubleClickTime Lib "user32" Alias "SetDoubleClickTime" (ByVal wCount As Long) As Long

Công dụng: Đặt thời gian giữa hai lần bấm của thao tác Dclick.

Tham số kèm:

WCount - Thời gian cần đặt, tính theo miligiây.

15. Declare Function ShowCursor Lib "user32" Alias "ShowCursor" (ByVal bShow As Long) As Long

Công dụng: Hiện hay giấu con trỏ trên màn hình.

Trị trả về: Số nguyên DP báo số lần hiển thị. Mỗi lần sử dụng hàm này để hiện trỏ DP sẽ được cộng 1. Mỗi lần giấu đi DP sẽ trừ 1. Nếu DP âm trỏ không được hiện.

Tham số kèm:

BShow - Trị số điều khiển. Nếu dương, để hiện. Số 0 để dấu.

16. Declare Function SwapMouseButton Lib "user32" Alias "SwapMouseButton" (ByVal bSwap As Long) As Long

Công dụng: Kiểm tra sự tráo đổi chức năng 2 phím chuột.

Trị trả về: Integer - True nếu đã bị hoán đổi. False nếu vẫn chưa bị đổi.

Tham số kèm:

BSwap - Đặt là True để đổi. Đặt là False để không đổi.

2. Các mã quét và phím ảo:

Các phím trên bàn phím tạo ra các mã quét (scan code) tuỳ thuộc vào vị trí của chúng. Khi ta tác động vào phím, bàn phím sẽ gửi mã quét của phím đó cho máy tính. Do có nhiều loại bàn phím khác nhau nên Windows đưa ra khái niệm phím ảo (virtual key) là phím không phụ thuộc vào vị trí của từng loại bàn phím, giúp cho việc thống nhất xử lý. Ví như bạn nhấn phím Enter, ở bất cứ bàn phím nào, ở vị trí nào vẫn là phím đó, chứ không liên quan đến vị trí như mã quét.

Do đó ta có thể hiểu vấn đề này như sau:

Khi một phím được nhấn, Windows sẽ nhận được tín hiệu và chuyển đổi thông tin mã quét của bàn phím thành một mã phím ảo. Phần xử lý phím ảo sẽ chịu trách nhiệm chuyển tiếp hình ảnh của ký tự được nhấn, sau khi đã căn cứ vào trạng thái của phím Shift.

Các hàm xử lý bàn phím bao gồm:

17. Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer

Công dụng: Nhận tình trạng của phím ảo được khai báo.

Trị trả về: Integer - Bit 0 là 1 nếu phím đã được nhấn kể từ lần gọi hàm này gần đây nhất. Ngược lại là Zero. Bit 15 là 1 nếu phím đang nhấn xuống, hay zero nếu thả ra.

Tham số kèm:

VKey Mã của phím cần kiểm tra (Xem bảng mã key code các phím)

18. Declare Function GetKBCodePage Lib "user32" Alias "GetKBCodePage" () As Long

Công dụng: Nhận trang mã Windows cần chuyển đổi giữa các bộ ký tự.

Trị trả về: Integer - Là các trị số chỉ trang mã.

19. Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long

Công dụng: Nhận trạng thái phím ảo của bàn phím.

Trị trả về: Đọc trạng thái ghi vào biến cần lưu.

Tham số kèm:

PbKeyState - Biến dạng byte (Là chuỗi có chiều dài có thể lưu trữ 256 ký tự) nhằm lưu giá trị để nhận tình trạng các phím. Giá trị này phải được hiểu là nhị phân, căn cứ vào bit 0 của các đoạn tương ứng với các phím Caplock, NumLock, Scroll Lock, nếu là 1 sẽ là đang bật, còn bit 7 các phím thường, nếu nhấn xuống là 1, giá trị 0 là thả ra.

20. Declare Function GetKeyboardType Lib "user32" Alias "GetKeyboardType" (ByVal nTypeFlag As Long) As Long

Công dụng: Nhận kiểu bàn phím đang dùng.

Trị trả về: Integer - Zero nếu có lỗi. Các số khác chỉ loại bàn phím đăng ký.

Nếu cờ bằng 0, trị trả về:

1 - Tương ứng bàn phím 83 phím

2 - Tương ứng 102 phím

3 - Tương ứng 84 phím

4 - Tương ứng 101 -102 phím (IBM)

5 - Tương ứng Nokia 1050

6 - Tương ứng Nokia 9140

7 - Tương ứng tiếng Nhật.

Nếu cờ bằng 1, trị trả về tuỳ thuộc hãng sản xuất.

Nếu cờ bằng 2, trị trả về:

1, 3, 5 - Tương ứng bàn phím 10 phím chức năng.

2 - Tương ứng bàn phím 12 hoặc 18 phím chức năng.

4 - Tương ứng bàn phím 12 phím chức năng.

6 - Tương ứng bàn phím 24 phím chức năng.

7 - Do hãng sản xuất quy định.

Tham số kèm:

NTypeFlag - Cờ xác định kiểu dữ liệu cần lấy.

21. Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Công dụng: Nhận tên của phím.

Trị trả về: Chiều dài của tên phím nhận được trong lpBuffer

Tham số kèm:

LParam Là một số mà bit từ 0 - 5 đặt là 0. Bít 16 - 23 đặt mã quét của phím cần xác định tên, bít 24 - Bít mở rộng trên những bàn phím nâng cao. Bit 25 - Khi gán bằng 1, bỏ qua sự khác biệt giữa các phím trái, phải.

LpBuffer Chuỗi được gán trước để nhận tên phím. Nên có nSize + 1 bytes.

NSize Chiều dài tối đa của chuỗi.

22. Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer

Công dụng: Nhận trạng thái phím ảo.

Trị trả về: Bit 0 là 1 khi các phím như Caplock, NumLock, ScrollLock là bật, nếu bit 0 là 0, các phím này tắt.

Bit 15 là 1, nếu phím đang bị nhấn, bit 15 là 0 nếu vừa nhả.

Tham số kèm:

NVirtKey - Mã phím ảo để kiểm tra

23. Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Công dụng: Thực hiện những sự chuyển đổi mã quét và ký tự tuỳ thuộc vào kiểu ánh xạ cung cấp.

Trị trả về: Tuỳ thuộc vào kiểu ánh xạ yêu cầu, trị trả về theo bảng sau

WCode là

Giá trị của VMapType

0

1

2

Mã phím ảo

Mã quét tương ứng



Mã quét


Mã phím ảo tương ứng


Mã phím ảo



Trị ASCII tương ứng.

Tham số kèm:

WCode - Giá trị nguồn cần chuyển đổi.

WMapType - Điều khiển kiểu chuyển đổi.

24. Declare Function MapVirtualKeyEx Lib "user32" Alias "MapVirtualKeyExA" (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long

Công dụng Hàm dịch mã phím ảo thành một mã quét hoặc giá trị ký tự, hoặc dịch một mã quét thành mã phím ảo. Chức năng dịch các mã dùng cho ngôn ngữ nhập và định dạng vị trí.

Tham số kèm:

Parameters

uCode

Mã phím ảo hoặc mã quét của một phím. Giá trị này phải tương ứng với uMapType.

uMapType

[in] Kiểu dữ liệu cần dịch. Giá trị này phải phù hợp với tham số uCode trên.

Các giá trị 0, 1, 2 như bảng trên.

Riêng giá trị bằng 3 chỉ sử dụng cho Windows NT/2000 trở lên: uCode là một mã quét và được dịch thành mã phím ảo để phân biệt giữa những phím bên tay trái và những phím bên tay phải. Nếu điều này không dịch, hàm trả về 0

dwhkl

[in] Định vị vị trí nhập để sử dụng cho việc dịch các mã đặc biệt. Tham số này có thể là bất kỳ giá trị định vị vị trí trước đó mà đã nhận được từ hàm LoadKeyboardLayout

Trị trả về

Hoặc là một ã quét, môt mã phím ảo hoặc một giá trị ký tự tuỳ thuộc vào uCode uMapType. Nếu điều này không được dịch, hàm trả về zero.

Một ứng dụng có thể dùng MapVirtualKeyEx để dịch các mã quét thành các hằng mã phím ảo như VK_SHIFT, VK_CONTROL, và VK_MENU, và ngược lại. Quá trình dịch không do not phân biệt giữa các phím trá hay phải của các phím SHIFT, CTRL, hoặc ALT. Còn Windows NT/2000 trở lên thì phân biệt, nó sẽ chuyển được thành các hằng mã phím ảo như:

VK_LSHIFT
VK_RSHIFT
VK_LCONTROL
VK_RCONTROL
VK_LMENU
VK_RMENU

Sự phân biệt này ảnh hưởng tới các hàm GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, MapVirtualKey, và chính MapVirtualKeyEx . Xin xem bảng mã phím ảo Virtual-Key Codes.

25. Declare Function OemKeyScan Lib "user32" Alias "OemKeyScan" (ByVal wOemChar As Long) As Long

Công dụng: Nhận mã quét và trạng thái Shift đối với một ký tự ASCII trong bộ ký tự OEM.

Trị trả về: Từ thấp chứa mã quét. Từ cao đưa ra các cờ hiệu thông qua các bit. Bit 0 nếu bằng 1, phím Shift bị nhấn. Bit 1 là 1 cho biết Ctrl bị nhấn.

Tham số kèm:

WOemChar - Giá trị ASCII của ký tự cần chuyển đổi.

26. Declare Function SetKeyboardState Lib "user32" Alias "SetKeyboardState" (lppbKeyState As Byte) As Long

Công dụng: Đặt trạng thái phím ảo. Thường sử dụng để đặt trạng thái phím CaspLock, NumLock, ScrollLock.

Tham số kèm:

lppbKeyState - Biến con trỏ 256 byte chứa trạng thái bàn phím.

27. Declare Function ToAscii Lib "user32" Alias "ToAscii" (ByVal uVirtKey As Long, ByVal uScanCode As Long, lpbKeyState As Byte, lpwTransKey As Long, ByVal fuState As Long) As Long

Công dụng: Xác định trị ASCII của một phím ảo dựa trên các trạng thái phím Shift và phím điều khiển.

Trị trả về:

Nếu phím cần kiểm tra là phím chết, giá trị trả về là số âm. Trường hợp khác là một trong các giá trị sau:

0 - Phím ảo cần kiểm tra không được dịch trong trạng thái hiện hành của bàn phím.

1 - Một ký tự được copy vào buffer

2 - Hai ký tự được copy vào bufer, trường hợp này xảy ra khi một phím nhấn chết, và gõ một phím khác.

Tham số kèm:

UVirtKey - Phím ảo cần chuyển đổi.

UScanCode - Mã quét của phím hoặc phím cần chuyển đổi. Bit cao của giá trị được thiết lập nếu phím nhả.

LpbKeyState - Biến trỏ tới mảng 256 byte chỉ trạng thái bàn phím hiện tại. Mỗi byte trong mảng chứa trạng thái của một phím. Nếu bit cao của một byte được thiết lập là phím được nhấn xuống. Với bit thấp được thiết lập, tín hiệu được đảo là ON. Trường hợp này chỉ dùng cho CAPSLOCK. Còn SCROLLOCK và NUMLOCK bị bỏ qua.

LpwTransKey - Biến con trỏ chỉ tới buffer mà nhận giá trị kết quả sau khi dịch.

FuState - Cờ hiệu, trạng thái thực đơn được kích hoạt. Nếu là 1 là được kích hoạt, ngược lại 0.

28. Declare Function ToAsciiEx Lib "user32" Alias "ToAsciiEx" (ByVal uVirtKey As Long, ByVal uScanCode As Long, lpKeyState As Byte, lpChar As Integer, ByVal uFlags As Long, ByVal dwhkl As Long) As Long

Như trên riêng dwhkl dùng để định vị trí nhập, dùng cho chuyển mã.Tham số này nhận được bất cứ vị trí định vị nào trước đó đã được trả về từ hàm LoadKeyboardLayout

29. Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar As Byte) As Integer

Công dụng: Dịch ký tự phím ảo tùy thuộc trạng thái phím shift hiện tại.

Trị trả về: Nếu hàm thành công, byte thấp của giá trị trả về chứa mã phím ảo, và byte cao chứa trạng thái Shift, căn cứ vào bảng sau

Bit

Nghĩa là

1

Bất cứ SHIFT key bị nhấn

2

Bất cứ CTRL key bị nhấn.

4

Bất cứ ALT key bị nhấn.

8

The Hankaku key bị nhấn

16

Dành riêng (Được định nghĩa bởi driver).

32

Dành riêng (Được định nghĩa bởi driver).

Nếu hàm không tìm thấy phím nào để dịch thì bỏ qua mã ký tựcả hai byte thấp và cao đều chứa –1.

30. Declare Function VkKeyScanEx Lib "user32" Alias "VkKeyScanExA" (ByVal ch As Byte, ByVal dwhkl As Long) As Integer

Như trên riêng dwhkl dùng để định vị trí nhập, dùng cho chuyển mã.Tham số này nhận được bất cứ vị trí định vị nào trước đó đã được trả về từ hàm LoadKeyboardLayout

3. Tiếp theo là các hàm điều khiển nhập liệu:

31. Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long

Công dụng: Nhận trạng thái nhập liệu, kiểm tra xem có tình huống chuột hoặc bàn phím đang chờ xử lý không.

Trị trả về: True - Nếu có trường hợp cần xử lý đang chờ.

32. Declare Function GetQueueStatus Lib "user32" Alias "GetQueueStatus" (ByVal fuFlags As Long) As Long

Công dụng: Nhận loại chỉ lệnh cần xử lý trong hàng đợi đợi ứng dụng.

Trị trả về: Từ cao là tập cờ 16 bit, khai báo các chỉ lệnh ở hàng đợi. Từ thấp cho biết các loại chỉ lệnh được thêm vào.

Tham số kèm:

FUFlags - Tập cờ yêu cầu cần kiểm tra chỉ lệnh là một từ thông qua các bit. Là một trong các hằng số sau:

QS_ALLEVENTS = Tất cả các mức (QS_INPUT hoặc QS_POSTMESSAGE hoặc QS_TIMER hoặc QS_PAINT hoặc QS_HOTKEY)

QS_ALLINPUT = Tấ cả phần nhập liệu (QS_SENDMESSAGE hoặc QS_PAINT hoặc QS_TIMER hoặc QS_POSTMESSAGE Hoặc QS_MOUSEBUTTON Hoặc QS_MOUSEMOVE Hoặc QS_HOTKEY Hoặc QS_KEY)

QS_HOTKEY - Phím nóng.

QS_INPUT - Phần nhập (QS_MOUSE Hoặc QS_KEY)

QS_KEY - Các chỉ lệnh phím.

QS_MOUSE = Các chỉ lệnh chuột (QS_MOUSEMOVE Hoặc QS_MOUSEBUTTON)

QS_MOUSEBUTTON - Chỉ lệnh liên quan đến nút chuột.

QS_MOUSEMOVE - Di chuyển bằng chuột

QS_PAINT - Chỉ lệnh vẽ.

QS_POSTMESSAGE - Chỉ lệnh được phát đi.

QS_SENDMESSAGE - Chỉ lệnh được chuyển từ ứng dụng khác.

QS_TIMER - Timer.

33. Declare Function GetQueuedCompletionStatus Lib "kernel32" Alias "GetQueuedCompletionStatus" (ByVal CompletionPort As Long, lpNumberOfBytesTransferred As Long, lpCompletionKey As Long, lpOverlapped As Long, ByVal dwMilliseconds As Long) As Long

Công dụng: Nhận trạng thái chỉ lệnh đã hoàn thành xếp hàng trong hàng đợi hệ thống

Trị trả về: @

Tham số kèm:

CompletionPort - Cán cổng hoàn thành. Để tạo một cổng hoàn thành sử dụng hàm CreateIoCompletionPort

LpNumberOfBytesTransferred - Biến con trỏ chỉ vào một biến nhận về số byte trao đổi trong tác vụ vào ra đã hoàn thành.

LpCompletionKey - Biến con trỏ chỉ vào biến nhận về phím đã hoàn thành tác vụ vào ra. Một phím hoàn thành là một giá trị nhận từ hàm CreateIoCompletionPort

LpOverlapped - Biến con trỏ chỉ tới biến ghi lại vị trí của địa chỉ cấu trúc OVERLAPPED được thiết lapaj khi tác vụ hoàn thành được bắt đầu.

DwMilliseconds - Số mili giây gọi để chờ cho tác vụ hoàn thành.

34. Declare Function IsDBCSLeadByte Lib "kernel32" Alias "IsDBCSLeadByte" (ByVal bTestChar As Byte) As LongDeclare

35. Function IsDBCSLeadByte Lib "kernel32" Alias "IsDBCSLeadByte" (ByVal TestChar As Byte) As Long

Công dụng: Kiểm tra xem có phải là ký tự đầu tiên trong bộ ký tự 2 byte.

Trị trả về: True nếu là byte đầu của ký tự thuộc bộ ký tự 2 byte.

Tham số kèm:

BTestChar - Ký tự cần kiểm tra.

No comments:

Post a Comment