PDA

View Full Version : có ai viết chương trình giống ViệtKey chưa cứu tui với



dragonduydat
28-04-2003, 23:11
Mình muốn viết chương trình mô phỏng Việt Key bằng VB nhưng không biết làm sao hết, có ai có kinh nghiệm thì chi cho mình vơi, đau đầu quá hu hu, mà nè, làm sao mà mình viết tiếng Việt trong trang này mà không cần ViêtKey hay vậy.?lol

binhbean
29-04-2003, 01:23
Hello you. Trước kia, em và một đồng chí bạn em đã viết một chương trình gõ tiếng Việt hay hơn cả BKED ngày xưa. Nó được chạy trên nền DOS. Nhưng ý tưởng thì vẫn như vậy thôi. Nếu bác cần có thể email cho em để em gửi cho bác thuật toán và source code.

nguyenky
29-04-2003, 09:54
Chào anh giai!
Không biết anh có hứng thú với UNIKEY không,
Đây là chương trình mã nguồn mở, được viết bằng C
(Tôi đã chạy thử trên VC++, rất tốt)
Tuy nhiên, khi sử dụng Source code này, bạn phải tuân thủ theo các điều kiện của GNU, mà tác giả đă đăng ký.

bạn liên hệ http://unikey.sourceforge.net, se rỏ hơn.
Thân.

dragonduydat
29-04-2003, 12:46
Ok gởi cho mình đi BinhBean.
Mà nguyenky nè mình muốn source code cua VB cơ, mình đang nghiên cứu VB mà hi hi, cam ơn đã gởi cho mình source code cua VC nhé

dtt_vn
29-04-2003, 17:10
VB = Never. VB không thể hook được các key của hệ thống đâu. Nhưng bạn cũng có thể viết một activex text box riêng support bộ gõ. dtt_vn đã từng thử và thành công rồi. hiện nay đang nâng cấp lên cho Unicode nữa

BlueStar
30-04-2003, 09:12
Tôi không biết dtt_vn kiếm cái thông tin ấy ở đâu nữa !
Xin khẳng định với các bạn là VB hoàn toàn có thể viết bộ gõ (như vietkey,abc), bằng chứng là tôi đã viết (!) . Tuy nhiên chương trình của tôi mới chỉ gõ được font VN*. Tôi đang làm tiếp để gõ các font Unicode ...
Khi nào làm xong tôi sẽ up lên cho mọi ng' thưởng thức !
Cũng không quá khó đâu

dtt_vn
30-04-2003, 13:34
Có lẽ là mình có sự lũng lỗ trong thông tin. SOrry nha. Nhưng cho dtt_vn hỏi cái naỳ. Bạn làm sao để thực hiện được việc đó? Chương trình của bạn phục vụ cho cả hệ thống ( mức system ) hay là chỉ ở mức Basic ( phục vụ trong chương trình của bạn )? Nhưng thôi kệ, mức nào cũng được. Bạn up thử code lên đây cho mọi người cùng học vậy. có lẽ dtt_vn cần phải đi học thêm của bạn. :)

White_Rose
30-04-2003, 13:57
Mình thì đảm bảo bạn chỉ có thể gõ được trong ứng dụng của bạn. Chỉ với VB bạn không thể tạo được một ứng dụng như VietKey hay ABC, cho dù là .Vn*, Unicode hay gì gì đi nữa.

dtt_vn
30-04-2003, 14:23
Tịnh tâm nào WR. Không thấy dtt_vn xuống nước sao

dragonduydat
30-04-2003, 23:35
hì hì, cứ từ từ việc đâu còn có đó, nếu làm cho cả hệ thống luôn thì còn gì bằng nửa chứ, còn nếu làm trên 1 ứng dụng thì cũng chả chết thằng Tây nào, cứ để BlueStar upload code lên rồi mình cùng nghiên cứu hỷ.

dragonduydat
30-04-2003, 23:40
Ah ! có điều mình thắc mắc bửa giờ mà quên hỏi, bên Visual C người ta dùng thư viện liên kết động .DLL và HOOK để tạo ra trình gỏ Việt Key, thế bên VB mình không thể làm tương tự sao ? nếu được thì giải thích cho mình hiểu với nhé hi hi

dtt_vn
01-05-2003, 08:27
vì VB chỉ có thể hook cục bộ. VB yếu về mặt này lắm :(

trungnt88
02-05-2003, 09:36
dùng c++ viết DLL hook
key board

BlueStar
06-05-2003, 09:31
OK, không ngờ các cậu cũng quan tâm đến nó đến vậy, nhưng rất tiếc là dạo này mình đang bận nên chưa hoàn thành được, mà hôm nay cũng quên không mang CT cũ đi.
Nhưng thôi mình cũng nói đại khái cho các bạn hiểu nha:
Tất nhiên là không phải chỉ để gõ trong ứng dụng của mình không đâu, chỉ có thế thôi thì nói làm gì, chương tình của mình không khác gì ABC cả :
+B1: nhận key tù bàn phím : có lẽ đây là điểm mấu trốt của vấn đề , cac bạn biết chương tình keylog rồi chứ (lên google mà tìm ), nó lấy được bất kì phím nào các bạn gõ (mình quên mất cái hàm API đấy rồi, hình như là ...getancikey.. gì gì đó ) .... tìm hiểu thêm đi nhá
+B2: Từ những gì bạn nhận được (tooi yeeu em) , hày biến đổi thành "tôi yêu em" theo đúng font chữ mà bạn muốn (cái này phụ thuộc vào trình độ của bạn)
+B3: dùng sendkeys xoá cái cũ và đưa cái mới ra (OK)
Tuy nhiên vẫn càn đôi chỗ trong cách này, mình cũng nghĩ là VietKey họ làm khác. (Mình không gõ được trong EXCEL) còn những App khác thì OK (VB,WORD, chat ....)

Vậy thôi, cứ làm đi, có vấn đề gì thì ta lại bàn tiếp (!)

dtt_vn
06-05-2003, 20:45
tất nhiên là mình cũng có nghĩ đến vấn đề đó. Nhưng bạn ơi. send keys chỉ ổn định khi máy chạy bình thường thôi. còn khi CPU bị quá tải th2i nó sẽ phát khùng cho coi. hoặc lúc người dùng gõ quá nhanh. khác với sendkeys, pp hook trong c làm cho ct khi nhận được một key thì liền bảo ct của mình xử lý ngay cái sự kiện đó và nó chờ mình làm việc. nhưng thôi, cứ upload lên thử xem nào

White_Rose
07-05-2003, 02:00
Dùng Sendkey mà gửi được cho nhiều ứng dụng khác nhau -> bái phục luôn.

dtt_vn
07-05-2003, 09:44
này, nếu không dùng sendkeys thì ta có thể dùng sendinput vậy. không biết có thể làm được không nữa. chưa thử qua. các bạn xem coi sao

' Hàm Sendinput đây
The SendInput function synthesizes keystrokes, mouse motions, and button clicks
Windows NT 4.0 SP3 or later; Windows 98

Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long

· nInputs
[in] Specifies the number of structures in the pInputs array.

· pInputs
[in] Pointer to an array of INPUT structures. Each structure represents an event to be inserted into the keyboard or mouse input stream.

· cbSize
[in] Specifies the size, in bytes, of an INPUT structure. If cbSize is not the size of an INPUT structure, the function will fail.

The function returns the number of events that it successfully inserted into the keyboard or mouse input stream. If the function returns zero, the input was already blocked by another thread.

To get extended error information, call GetLastError.


' Ví dụ
Const VK_H = 72
Const VK_E = 69
Const VK_L = 76
Const VK_O = 79
Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2
Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Form_KeyPress(KeyAscii As Integer)
'Print the key on the form
Me.Print Chr$(KeyAscii);
End Sub
Private Sub Form_Paint()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'Clear the form
Me.Cls
'call the SendKey-function
SendKey VK_H
SendKey VK_E
SendKey VK_L
SendKey VK_L
SendKey VK_O
End Sub
Private Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey 'the key we're going to press
KInput.dwFlags = 0 'press the key
'copy the structure into the input array's buffer.
GInput(0).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
'do the same as above, but for releasing the key
KInput.wVk = bKey ' the key we're going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ' release the key
GInput(1).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub


' Để bắt keyboard ta có thể dùng hàm GetKeyState
Requires Windows NT 3.1 or later; Requires Windows 95 or later


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

The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled (on, off - alternating each time the key is pressed).

· nVirtKey
Specifies a virtual key. If the desired virtual key is a letter or digit (A through Z, a through z, or 0 through 9), nVirtKey must be set to the ASCII value of that character. For other keys, it must be a virtual-key code.
If a non-English keyboard layout is used, virtual keys with values in the range ASCII A through Z and 0 through 9 are used to specify most of the character keys. For example, for the German keyboard layout, the virtual key of value ASCII O (0x4F) refers to the “o” key, whereas VK_OEM_1 refers to the “o with umlaut” key.

If the function succeeds, the return value specifies the status of the given virtual key. If the high-order bit is 1, the key is down; otherwise, it is up. If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key’s indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

Ví dụ
'In a module
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As Long
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'if idHook is less than zero, no further processing is required
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
Else
'check if SHIFT-S is pressed
If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
'show the result
Form1.Print "Shift-S pressed ..."
End If
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
End If
End Function

'In a form, called Form1
Private Sub Form_Load()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'set a keyboard hook
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'remove the windows-hook
UnhookWindowsHookEx hHook
End Sub

Nicky
07-05-2003, 19:16
Hay lắm trung.
Nếu Trung đúng thì bằng cách này có thể không cần đến Hook toàn cục như mọi người đã làm.
Nhưng để mọi người kiểm tra lại đã, nicky cũng chưa kiểm tra được nên chưa khẳng định.

dtt_vn
08-05-2003, 21:04
có ai rảnh thì kiểm tra đi nhé

dragonduydat
08-05-2003, 22:23
Trời ơi, cái code này chỉ cho phép lấy key trên form cua VB thôi, không thể lấy khi nó hoạt động trên cửa sổ khác, vẩn chưa được.

dtt_vn
08-05-2003, 23:35
xin lỗi bạn, nói ra thì kỹ càng một tý nhé. bạn nên xem lại cái hàm getkeystate đi. dtt_vn đã biên dịch thử trên winxp và dĩ nhiên là cái hàm ấy chạy tốt. dtt_vn gõ text bên word, nhưng nó vẫn hiện text bên form đấy. mà căn cứ vào đâu mà nói thế??

White_Rose
09-05-2003, 01:25
Chán thật, thế cãi nhau qua lại thì cái gọi là "chương trình giống như VietKey trên VB" đâu?
Có một số hàm API cho phép biết trạng thái hiện tại của bàn phím nhưng nó sẽ khác xa với việc hook bàn phím. Khi hook, nếu có bất kì tác động nhấn phím thì OS sẽ ghi nhận phím đó và đặt giá trị của nó vào trong param. Trình tiếng Việt sẽ lấy giá trị này ra và có cách xử lý của nó.
Chứ lấy trạng thái bàn phím thì hoàn toàn không chính xác, phụ thuộc rất nhiều. Không những thế phạm vi cũng chỉ trong ứng dụng, nghĩa là giá trị sau khi xử lý không thể "gửi" cho các ứng dụng khác. Cũng vì lý do hoàn toàn tưong tự mà người ta không thể viết các keylogger trong VB được.

Nicky
09-05-2003, 19:19
Mà này Trung ơi.
Hình như không ổn rồi. Cái hàm SendInput làm sao có thể Send được mấy kí tự Unicode, làm thế nào để nó Send chứ Â đến ứng dụng..hic...:( Nó chỉ có thể send mấy cái key trên bàn phím thôi, và cả các cú nhắp chuột nữa..nicky thấy khôg ổn rồi..:(

dtt_vn
09-05-2003, 19:53
để dtt_vn xem lại đã

haison2240
13-06-2003, 19:08
Cái trò này càng lúc càng lí thú và đáng được quan tâm . Lẹ lên mấy huynh ơi .

ttc7582
15-06-2003, 09:27
Vấn đề này chất lượng lắm, mong các bạn cứ tiếp tục bàn về nó để mình được tham khảo.
thank

BlueStar
16-06-2003, 19:31
CT cua tui chạy OK trên Win98....Win khac thi ko biết

KEM_WALL
17-06-2003, 20:32
vậy thì đưa lên cho mọi người cùng tham khảo đi
walls thấy việc dùng DLL C++ rùi gọi lại trong VB các bạn bàn chưa kĩ đó