Kỹ thuật hook

Liên hệ QC

geotech

Thành viên mới
Tham gia
24/6/06
Bài viết
29
Được thích
16
Em đang tìm hiểu kỹ thuật hook, em nghe đã lâu, chứng kiến nhiều mà vẫn chưa hiểu tường tận về kt hook. Nhờ các bác giải thích ngắn gọn giùm em với
Em thấy trong các tools của bác Tuân dùng kt hook, xin hỏi bác Tuân kỹ thuật hook windows form giữa VB và Delphi có khác nhau gì kô?
mấy tools em viết giờ cần hiển thị message tiếng việt unicode, e nghĩ đến hook...nhưng do thiếu kn về cái này, mày mò lâu quá, bác Tuân có code về hook để chặn và xử lý thông điệp, cụ thể là các message tiếng việt unicode share em với.
Cám ơn bác trước.
 
Về cơ bản thì chỉ cần tham khảo cái phần đỏ đỏ ở cái code này: (Dĩ nhiên code này ko chạy đâu vì chưa đủ code)

Mã:
Public Function MsgBox(ByVal Prompt As String, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal Title As String = "", Optional ByVal hwnd As Long = 0) As VbMsgBoxResult
Dim ret As Long
Dim hInst As Long
Dim Thread As Long

    
    'Set up the CBT hook
    If hwnd > 0 Then
        ParenthWnd = hwnd
    Else
        ParenthWnd = GetActiveWindow
    End If
    
    hInst = GetWindowLong(hwnd, GWL_HINSTANCE)
    Thread = GetCurrentThreadId()

[COLOR="Red"]    If hwnd > 0 Then
        '//hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, hInst, Thread)
        hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProcCenterForm, hInst, Thread)
    Else
        '//hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, hInst, Thread)
        hHook = SetWindowsHookEx(WH_CBT, AddressOf WinProcCenterScreen, hInst, Thread)
    End If[/COLOR]
    
    '// Convert to Unicode
    Prompt = ConvertU(Prompt)
    Title = ConvertU(Title)
    ret = UniMsgBox(Prompt, Title, Buttons)
    
    MsgBox = ret
End Function

Chỉ cần nhìn thấy như vậy, bạn có thể google ra cả được mớ tài liệu + code liên quan tới vấn đề này.

Ngoài ra, khi lập trình Windows thì còn 1 khái niệm về Subclassing nữa. Có thể tham khảo code tại đây.

Tuy nhiên, theo mình thì hãy "đứng trên vai người khổng lồ" thì tốt hơn vì nên dành thời gian cho bài toán nghiệp vụ. Những kỹ thuật như thế này tốn thời gian lắm (mà lại ko hiệu quả nữa). Delphi 9 đã Unicode toàn bộ rồi, còn cần gì tới vụ UniMsgbox nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang tìm hiểu kỹ thuật hook, em nghe đã lâu, chứng kiến nhiều mà vẫn chưa hiểu tường tận về kt hook. Nhờ các bác giải thích ngắn gọn giùm em với
Em thấy trong các tools của bác Tuân dùng kt hook, xin hỏi bác Tuân kỹ thuật hook windows form giữa VB và Delphi có khác nhau gì kô?
mấy tools em viết giờ cần hiển thị message tiếng việt unicode, e nghĩ đến hook...nhưng do thiếu kn về cái này, mày mò lâu quá, bác Tuân có code về hook để chặn và xử lý thông điệp, cụ thể là các message tiếng việt unicode share em với.
Cám ơn bác trước.

Kỹ thuật hook có sử dụng các hàm Windows API như anh hai2hai giới thiệu (SetWindowsHookEx) ở bài trên. Các ngôn ngữ lập trình đều sử dụng các hàm Windows API.

Bạn đọc các bài dưới đây:
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
http://delphi.about.com/od/kbwinshell/a/delphi_hook.htm
HookExcelMessageA

Để làm unicode trên Delphi , tốt nhất bạn hãy dùng Delphi 2009. Tât cả các code trước đây của bạn viết trên Delphi cũ, khi chuyển sang Delphi 2009 biên dịch thì trở thành ứng dụng "unicode supported", như thể ngủ dậy thành hoàng tử --=--! Nếu bạn vẫn muốn sử dụng unicode cho các Delphi phiên bản cũ thì hãy dùng bộ controls (VCL) của tntware (open source).
 
Upvote 0
Cám ơn anh hai2hai, anh TuanVNUNI
Những góp ý của các anh rất hữu ích.
Đợt trước em đã cài D2009 thấy hỗ trợ Unicode rất tốt, nhưng khá nặng.
Vả lại bài toán của em nhằm mục đích phục vụ nghiên cứu, chủ yếu là numerical analysis
chương trình của em đang phát triển có các thư viện hỗ trợ D6 thôi,
Em có dùng TntUnicode controls, em sẽ tìm hiểu thêm trong code của cái này.

PS: câu "đứng trên vai người khổng lồ" của bác hai2hai rất hay, đó cũng là phương châm làm việc của em
 
Upvote 0
Nếu lập trình trên Delphi 6, bạn nên dùng Delphi 7 sẽ tốt hơn nhiều.

Để dùng unicode bạn dùng các hàm Windows API có chữ W ở cuối, ví dụ như kà GetComputerNameW(), các hàm có khai báo hoặc trả về kiểu PWideChar (LPWCHAR) .
Sử dụng kiểu dữ liệu là : WideChar, PWideChar (LPWCHAR), WideString, OleVariant.
Kết hợp các hàm cung cấp trong bộ controls của tntWare để xử lý chuỗi, các hàm có khai báo hoặc trả về kiểu nói trên.
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ em chuyển sang Delphi 7 lại không có một số component,
em đặt câu hỏi theo cách khác, đơn giản và trực tiếp vào vấn đề nhờ anh Tuân và anh em trên diễn đàn giúp: Em cần hiển thị message: 'Xin chào các bạn' sử dụng lệnh showmessage(); trên delphi 6.
Xin chân thành cảm ơn anh.
 
Upvote 0
Bây giờ em chuyển sang Delphi 7 lại không có một số component,
em đặt câu hỏi theo cách khác, đơn giản và trực tiếp vào vấn đề nhờ anh Tuân và anh em trên diễn đàn giúp: Em cần hiển thị message: 'Xin chào các bạn' sử dụng lệnh showmessage(); trên delphi 6.
Xin chân thành cảm ơn anh.

Vì IDE của Delphi 2007 trở về trước không hỗ trợ Unicode nên bạn có 2 cách giải quyết vấn đề này.
1. Bạn viết 1 hàm chuyển từ TCVN3 qua Unicode, ví dụ tên là TCVN3ToUnicode sau đó bạn gõ TCVN3 trong IDE và dùng hàm này chuyển sang Unicode như sau: ShowMessageW(TCVN3ToUnicode('chuỗi kí tự TCVN3')).
2. TntComponent có 1 số hàm chuyển chuỗi Unicode ra 1 dạng chuỗi đặc biệt, đây là cách lưu chuỗi Unicode trong file .dfm. Mình chưa tìm hiểu rõ về những hàm này vì mình chỉ thường làm theo cách 1.
 
Upvote 0
Mình không lập trình VB, nên cũng biết hàm TCVNtoUnicode của anh Tuân, nhưng chưa chuyển sang delphi được, nhờ bạn và các các bác trên diễn đàn chuyển giùm.
thanks
 
Upvote 0
Mình không lập trình VB, nên cũng biết hàm TCVNtoUnicode của anh Tuân, nhưng chưa chuyển sang delphi được, nhờ bạn và các các bác trên diễn đàn chuyển giùm.
thanks

Dưới đây là code tôi viết cho Delphi 2009. Nếu biên dịch bởi Delphi phiên bản thấp hơn bạn hãy sửa lại như sau:

Char thay bằng WideChar
PChar thay bằng PWideChar
string thay bằng WideString


Mã:
function TCVN3TôUnicde(vnstr:PAnsiChar):PChar;stdcall; //For VBA
var CÂnChar;
I,nLen : LongInt;
sWide:string;
IsFirst:Boolean;
label lbBegin;
begin
try

  if vnstr=nil then result^:=#0;

lbBegin:

  sWide:='';
  //getmem(result,125);
  //Result^:=#0;
  nLen := Length(vnstr);
   for I := 0 To nLen do
   begin
      C:=Char(vnstr[I]);
      case vnstr[I] of
          'a': C := Char(#97);
          '¸': C := Char(#225);
          'µ': C := Char(#224);
          '¶': C := Char(#7843);
          '·': C := Char(#227);
          '¹': C := Char(#7841);
          '¨': C := Char(#259);
          '¾': C := Char(#7855);
          '»': C := Char(#7857);
          '¼': C := Char(#7859);
          '½': C := Char(#7861);
          'Æ': C := Char(#7863);
          '©': C := Char(#226);
          'Ê': C := Char(#7845);
          'Ç': C := Char(#7847);
          'È': C := Char(#7849);
          'É': C := Char(#7851);
          'Ë': C := Char(#7853);
          'e': C := Char(#101);
          'Ð': C := Char(#233);
          'Ì': C := Char(#232);
          'Î': C := Char(#7867);
          'Ï': C := Char(#7869);
          'Ñ': C := Char(#7865);
          'ª': C := Char(#234);
          'Õ': C := Char(#7871);
          'Ò': C := Char(#7873);
          'Ó': C := Char(#7875);
          'Ô': C := Char(#7877);
          'Ö': C := Char(#7879);
          'o': C := Char(#111);
          'ã': C := Char(#243);
          'ß': C := Char(#242);
          'á': C := Char(#7887);
          'â': C := Char(#245);
          'ä': C := Char(#7885);
          '«': C := Char(#244);
          'è': C := Char(#7889);
          'å': C := Char(#7891);
          'æ': C := Char(#7893);
          'ç': C := Char(#7895);
          'é': C := Char(#7897);
          '¬': C := Char(#417);
          'í': C := Char(#7899);
          'ê': C := Char(#7901);
          'ë': C := Char(#7903);
          'ì': C := Char(#7905);
          'î': C := Char(#7907);
          'i': C := Char(#105);
          'Ý': C := Char(#237);
          '×': C := Char(#236);
          'Ø': C := Char(#7881);
          'Ü': C := Char(#297);
          'Þ': C := Char(#7883);
          'u': C := Char(#117);
          'ó': C := Char(#250);
          'ï': C := Char(#249);
          'ñ': C := Char(#7911);
          'ò': C := Char(#361);
          'ô': C := Char(#7909);
          '­': C := Char(#432);
          'ø': C := Char(#7913);
          'õ': C := Char(#7915);
          'ö': C := Char(#7917);
          '÷': C := Char(#7919);
          'ù': C := Char(#7921);
          'y': C := Char(#121);
          'ý': C := Char(#253);
          'ú': C := Char(#7923);
          'û': C := Char(#7927);
          'ü': C := Char(#7929);
          'þ': C := Char(#7925);
          '®': C := Char(#273);
          'A': C := Char(#65);
          '¡': C := Char(#258);
          '¢': C := Char(#194);
          'E': C := Char(#69);
          '£': C := Char(#202);
          'O': C := Char(#79);
          '¤': C := Char(#212);
          '¥': C := Char(#416);
          'I': C := Char(#73);
          'U': C := Char(#85);
          '¦': C := Char(#431);
          'Y': C := Char(#89);
          '§': C := Char(#272);
      end;
      sWide:= sWide + C;
   end;
//result:=OleVariant(sWide);
   result:=PChar(string(sWide));
   //IsFirst:=False;
except
  Result^:=#0;


end;

end;
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom