Tuesday, July 26, 2016

[AutoIT] Sử dụng tổ hợp phím Ctrl + A trong Editbox

 

Xin chào tất cả mọi người hôm nay mình xin tiếp tục viết bài để chia sẻ với các bạn về một thủ thuật khai thác sử dụng Editbox trong AutoIT.



Như các bạn đã biết bình thường trong windows trong các ứng dụng như Notepad, Word, Excel, Powerpoint,.... đa phần tất cả các ứng dụng các bạn có thể sử dụng tổ hợp phím Ctrl + A để nhanh chóng chọn toàn bộ dữ liệu. Thế nhưng đối với Edit box được tạo ra bằng AutoIT thì với mặc định ta không thể làm được mặc dù các tổ hợp phím khác như Ctrl + Z (undo) Ctrl + C (copy) Ctrl + X (cut) vẫn hoạt động bình thường. Mình đã tìm hiểu thử nguyên nhân thì theo nhà sáng lập phát triển autoIT thì đó không phải là mỗi lỗi (Bug) gì cả :) mà trong windows mới là một bug thật sự. Haizzz. Chả biết sao nhưng mà mình thấy như vậy thì không tiện lắm nên đã xem các hướng dẫn để mang tổ hợp phí Ctrl + A trở lại.
Thuật toán ở đây theo mình thấy là không khó khăn lắm nhưng cũng xin được chia sẻ đến các bạn những kinh nghiệm cũng như vấn đề mình gặp phải.

Lúc đầu mình sử dụng hàm HotKeySet để Set tổ hợp phím Ctrl + A chọn toàn bộ dữ liệu. Code mẫu như sau:
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
Opt("MustDeclareVars", 1)
Global $input_left, $input_right, $hleft, $hright
HotKeySet("^a", "_selectall")
GUICreate("", 430, 210)
$input_left = GUICtrlCreateEdit("here is some text on the left", 10, 10, 200, 190)
$input_right = GUICtrlCreateEdit("here is some text on the right", 220, 10, 200, 190)
$hleft = GUICtrlGetHandle($input_left)
$hright = GUICtrlGetHandle($input_right)
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _selectall()
    Local $hWnd = _WinAPI_GetFocus()
    Switch $hWnd
        Case 0
        Case $hleft, $hright
            _GUICtrlEdit_SetSel($hWnd, 0, -1)
            Return
    EndSwitch
EndFunc   ;==>_selectallOk 
hàm này cũng hoạt động khá tốt nhưng khổ nỗi mỗi khi chương trình sử dụng thì bạn sẽ không thể sử dụng được tổ hợp phí Ctrl + A trong các ứng dụng như Notepad, Word, Excel, PowerPoint, etc Vậy Why??? Câu trả lời rất đơn giản hàm HotKeySet là hàm tác dụng lên toàn bộ các ứng dụng trong hệ thống nó sẽ chặn Message Ctrl + A tới các ứng dụng khác và lọc vậy nên các ứng dụng khác không thể tiếp tục sử dụng được Ctrl + A nữa. Vậy giải pháp khắc phục. Theo mình có 2 cách khắc phục là:
Cách 1: Truyền giả Message cho ứng dụng nếu ứng dụng đó không phải là chương trình của mình.
Bạn hãy sửa lại code trên thành như sau:

#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
Opt("MustDeclareVars", 1)
Global $input_left, $input_right, $hleft, $hright
HotKeySet("^a", "_selectall")
GUICreate("", 430, 210)
$input_left = GUICtrlCreateEdit("here is some text on the left", 10, 10, 200, 190)
$input_right = GUICtrlCreateEdit("here is some text on the right", 220, 10, 200, 190)
$hleft = GUICtrlGetHandle($input_left)
$hright = GUICtrlGetHandle($input_right)
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _selectall()
    Local $hWnd = _WinAPI_GetFocus()
    Switch $hWnd
        Case 0
        Case $hleft, $hright ; Kiểm tra xem có phải là Editbox trái hay Edit box phải hay không
            _GUICtrlEdit_SetSel($hWnd, 0, -1)
            Return
 EndSwitch
; Nếu không thuộc chương trình ứng dụng của mình thì:
    HotKeySet("^a") ; Đặt lại phím tăt Ctrl + A như mặc định của windows
    Send("^a")   ; Gửi phím tắt Ctrl + A tới ứng dụng
 HotKeySet("^a", "_selectall") ; Đặt lại phím tắt Ctrl + A cho ứng dụng của ta
EndFunc   ;==>_selectallCách 2: Sử dụng hàm GUISetAccelerators
Hàm này có đặc điểm nó cũng set một HotKey nhưng HotKey này khác biệt với HotKeySet ở đặc điểm nó chỉ tác dụng nội tại trong ứng dụng thôi và không liên quan gì đến ứng dụng ngoài. Code mẫu:
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
 
$hGUI = GUICreate("Test", 500, 500)
 
$hInput1 = GUICtrlCreateEdit("here is some text 1", 10, 10, 480, 240)
$hInput2 = GUICtrlCreateEdit("here is some text 2", 10, 250, 480, 240)
 
; Create dummy for accelerator key to activate
$hSelAll = GUICtrlCreateDummy()
 
GUISetState()
 
; Set accelerators for Ctrl+a
Dim $AccelKeys[1][2]=[["^a", $hSelAll]]
GUISetAccelerators($AccelKeys)
 
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hSelAll
            _SelAll()
    EndSwitch
WEnd
 
Func _SelAll()
    $hWnd = _WinAPI_GetFocus()
    $class = _WinAPI_GetClassName($hWnd)
    If $class = 'Edit' Then _GUICtrlEdit_SetSel($hWnd, 0, -1)
EndFunc   ;==>_SelAll
Bài viết sử dụng các tài liệu tham khảo trên diễn đàn https://www.autoitscript.com của các thành viên AuthenticitymartinMelba23
Cảm ơn các bạn đã đọc bài viết của mình hi vọng nó sẽ có ích cho các bạn. Cảm ơn các bạn đã quan tâm đến blog của mình Tks!

Pass giải nén(nếu có) :http://nothing1010.blogspot.com
 Lưu ý với các bạn là blog của mình sử dụng WinRar 5 để nén nên các bạn phải dùng WinRar5 để giải nén nhé! Nếu bạn nào chưa có thì có thể vào ĐÂY để tải và cài đặt bản mới nhất nhé!

No comments:
Write nhận xét