[GUI & Code] Phần 3: Tạo GUI có checkbox "Nhớ tài khoảng"


Trích lại bài cũ
Full source của 2 bài trước: http://menly.ml/view/4390cc97

Giới thiệu
Ở phần này bạn có thể sử dụng source của 2 bài cũ rồi chỉnh sửa lại, thêm checkbox vào hoặc bạn có thể tạo một GUI mới bằng Koda hoặc bằng tay. Cách tạo bằng Koda thì mình đã hướng dẫn ở phần 1 rồi (xem tại đây)

Làm thêm chức năng "Nhớ tài khoảng" bằng checkbox cũng không có gì khó. Có 2 cách để thực hiện
  1. Lưu ra file sau đó check xem có nhớ tài khoảng không (cách này cũng đơn giản nhưng mình sẽ hướng dẫn sau)
  2. Sử dụng những hàm có liên quan đến Reg như RegWrite, RegRead, .... (mình ưu tiên cách này hơn)

Hướng dẫn
Để có thể thực hiện được thì đầu tiên bạn phải có một cái GUI đăng nhập và trong GUI đó yêu cầu phải có khung checkbox "Nhớ tài khoảng" (nói vậy cho mấy ông newbie rõ thôi, là newbie thì nên làm theo mẫu trước).

Mình dùng cái GUI ở 2 phần trước và import vào Koda chỉnh sửa lại, thêm giao checkbox. Và thành quả cuối cùng:
Một GUI login có checkbox "nhớ tài khoảng"
Ta bắt đầu tiến hành code nào. Lần đầu đăng nhập thì trước đó sẽ chưa có lưu tài khoảng nào cả, nên chỗ input bạn nên xóa 2 dòng admin giúp mình vì mình để đó cho các bạn hiểu. Chỗ đó sau này sẽ được thay thế bằng tài khoảng sẽ nhớ.

Như phần 2 mình hướng dẫn, ta cũng case biến cho control và code thế này: Khi người dùng nhấn vào button Login, code sẽ tiến hành đưa kiểm tra xem ô checkbox Remember có được tích vào hay không (hay có được checked hay không). Nếu có thì sẽ dùng hàm RegWrite để viết dữ liệu lên đó. Lần thứ 2 đăng nhập thì 2 (2 là có cả tài khoảng và mật khẩu, 1 là chỉ có tài khoảng thôi, tùy chọn) input sẽ đọc reg bằng hàm RegRead, nếu chả có gì thì sẽ để trống, còn có dữ liệu hay tài khoảng mật khẩu được ghi vào thì sẽ lấy mấy cái đó set text của 2 Input.

Nói không bằng làm, code thế này: Vẫn case biến và đặt func như phần 2, chỉ case cái Button thôi, cái Checkbox thì mặc kệ. Sau đó ta có phần While như này

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
  Case $Login_Blogin
   _login()
 EndSwitch
WEnd

Phần Func thì khác. Đầu tiên ta phải đặt biến và gọi hàm để đọc dữ liệu từ 2 Input đã.
Func _login()
 $ruser = GUICtrlRead($Input1)
 $rpass = GUICtrlRead($Input2)
EndFunc

Sau đó, dùng đó dùng hàm If...Else/ElseIf...EndIf để kiểm tra dữ liệu người dùng đưa vào.
If $ruser = "" Or $rpass = "" Then
 MsgBox(16, "Error", "Tài khoảng hoặc mật khẩu đều không được để trống.")

Dòng đầu có nghĩa là kiểm tra xem 2 cái Input đó có nhập gì không (một trong hai vì có cái Or ở giữa, Or: hoặc). Nếu một trong 2 khung để trống thì sẽ có một hộp thoại msgbox hiện lên.

Tiếp tục, nếu không có lỗi xảy ra thì ta code phần nhớ tài khoảng.
Else
 If GUICtrlRead($Checkbox1) = 1 Then
  RegWrite($reglink, "user", "REG_SZ", $ruser)
  RegWrite($reglink, "pass", "REG_SZ", $rpass)
  RegWrite($reglink, "checked", "REG_SZ", 1)
 Else
  RegWrite($reglink, "user", "REG_SZ", "")
  RegWrite($reglink, "pass", "REG_SZ", "")
  RegWrite($reglink, "checked", "REG_SZ", 4)
 EndIf
 MsgBox(0, "Successful", "Login successful")
EndIf

Ở đây có nghĩa thế này, GUI đọc dữ liệu từ hàm, nếu ô checkbox mà được tích vào thì dữ liệu trả về sẽ bằng 1 nên ta sẽ có hàm If như này. Nếu hàm checkbox được checked rồi thì hàm RegWrite sẽ chạy. Cấu trúc của hàm RegWrite như sau
RegWrite ( "keyname" [, "valuename", "type", value] )
  • Keyname là cái registry key được viết, không như tìm trong explorer mà chúng ta phải mò trong regedit bằng cách ấn Run: Regedit. Thường thì được lưu trong HKEY_CURRENT_USER\Software\<tên>\
  • Value name là dữ liệu được ghi, ở đây là "user" và "pass"
  • Type thì có vài loại như "REG_SZ", "REG_MULTI_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_QWORD", or "REG_BINARY". Tùy vào mục đích sử dụng nhưng ở đây mình chỉ dùng cái đầu tiên thôi.
  • Cuối cùng là value, dữ liệu sẽ được ghi vào. Ở code trên, value này sẽ là tài khoảng và mật khẩu đã được nhập trong 2 hàm Input.

Vì không biết biến $reglink là gì nên mình đành phải khai báo bên ngoài để nó bớt rối
Global $reglink = "HKEY_CURRENT_USER\Software\System Login Part 3\"
Mình thường đặt Global cho nó rộng rãi :v sử dụng toàn code và khi báo mỗi chỗ khác nhau cho khỏi nhằm.

Công đoạn cuối cùng là làm sao khi mở lần thứ hai thì code nó sẽ lấy cái tài khoảng và mật khẩu mà bạn đã nhớ. Chúng ta sử dụng hàm RegRead chèn vào hai hàm Input trong GUI (hoặc chỉ chèn tài khoảng thôi cho chức năng  chỉ nhớ mỗi tài khoảng)
Thay vì
Global $Input1 = GUICtrlCreateInput("admin", 80, 5, 225, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
Global $Input2 = GUICtrlCreateInput("admin", 80, 37, 225, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_PASSWORD))

thì sẽ thành
Global $Input1 = GUICtrlCreateInput(RegRead($reglink, "user"), 80, 5, 225, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
Global $Input2 = GUICtrlCreateInput(RegRead($reglink, "pass"), 80, 37, 225, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_PASSWORD))

Đã xong!

Bước cuối cùng là save lại hoặc ấn F5 để hưởng thụ thành quả của mình.

Lưu ý: Nếu bạn nào chỉ muốn nhớ tài khoảng mà không nhớ mật khẩu thì xóa các thứ sau:
Chỉnh sửa chỗ $Input2 phần đọc pass
Xóa luôn cái $rpass = GUICtrlRead($$Input2)
Xóa chỗ nào có phần "pass" trong câu lệnh If..EndIf
1. RegWrite($reglink, "pass", "REG_SZ", $rpass)
2. RegWrite($reglink, "pass", "REG_SZ", "")

Have fun. Chúc thành công.

Mã nguồn
http://menly.ml/view/90e2c49e

Share this

Related Posts

Previous
Next Post »