Page 1 of 1

Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 09/07/2008 12:50 pm
by tienlbhoc
Thủ thuật: Tạo phím nóng trong dotnet
Tác giả: tienlbhoc và hieubm(cviet) đồng tác giả tìm kiếm
Mô tả: không thèm đụng hook


Tất nhiên đây chỉ có tác dụng cục bộ trong chương trình thôi nếu cuốn cửa sổ xuống thì không được . Cách làm cực kỳ đơn giản là nạp chồng phương thức ProcessDialogKey của form , bạn chỉ cần tạo form và paste đoạn code đây vào để xem , dù ở bất kỳ control nào trên form thì gõ alt + D sẽ luôn cho thông báo "You are stupid" :D

Code: Select all

  1.        protected override bool ProcessDialogKey(Keys keyData)
  2.         {
  3.             switch(keyData)
  4.             {
  5.                 case Keys.Alt | Keys.D:
  6.                     MessageBox.Show("You are stupid");
  7.                     return true;
  8.                     break;
  9.                 // some more cases...                    
  10.             }
  11.             return false;
  12.         }

Nếu không thích dùng swich thì dùng if như sau

Code: Select all

  1.        protected override bool ProcessDialogKey(Keys keyData)
  2.         {
  3.             if (keyData == (Keys.Alt | Keys.D))
  4.             {
  5.                 MessageBox.Show("You are stupid");
  6.                 return true;
  7.             }
  8.             else return false;
  9.         }

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 09/07/2008 2:49 pm
by clarkkent
Ủa bên C# không có sự kiện Form_KeyPress à :-/

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 09/07/2008 3:43 pm
by tienlbhoc
có nhưng nếu con trỏ ở trong 1 text box ở trong form thì thử xem có bắt được không nhé ;))

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Fri 11/07/2008 8:37 pm
by bong_dem
Có thuộc tính keypreview mà :|

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Fri 11/07/2008 9:43 pm
by tienlbhoc
Ừ há, không biết cái này :D , mà coi như 1 cách khác , có sao đâu :D

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 11:06 am
by CoiBi
bong_dem wrote:Có thuộc tính keypreview mà :|

Thử cho cursor vào DataGridView xem

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 11:28 am
by tienlbhoc
tớ đã thử , thấy keypreview vẫn nhận , nó nhận cả khi dùng phím lên xuống trái phải ở trong text , còn cái của tớ thì không :(

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 2:09 pm
by tienlbhoc
Thử với webbrower , kết quả , dùng keypreview không ăn thua đâu , tóm lại cách của tui vẫn là best :D. Dù không bắt được các phím lên xuống nhưng có phím nóng nào cần tới nó đâu :D

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 4:00 pm
by neverland87
tienlbhoc wrote:tớ đã thử , thấy keypreview vẫn nhận , nó nhận cả khi dùng phím lên xuống trái phải ở trong text , còn cái của tớ thì không :(

best mà thế đó >:) . Hook mới là best >:)

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 4:15 pm
by tienlbhoc
Dotnet tạo ra nhiều lớp vậy , cốt yếu để thay thế hook , chạy không phụ thuộc hệ điều hành mà (bác ne học nhiều thế mà không biết à) . Vì vây hạn chế đến mức nào hay mức đó . Không cứ phải chạy linux mới là hệ điều hành mới , biết đâu win mới cũng sẽ có thay đổi . Nhiều ứng dụng chập cheng vì winvista đó . unikey chặn phím thôi mà cũng có rắc rối với vista . hook này cũng chặn phím , chắc gì đã thoát . Rồi sắp có win 7 nữa .
Phù , nói tóm lại , cách này nhanh , bổ , rẻ , mang phong cách dotnet , tiêu biểu cho tư tưởng dotnet , nói chung là best :))

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Sat 12/07/2008 5:18 pm
by neverland87
tienlbhoc wrote:Dotnet tạo ra nhiều lớp vậy , cốt yếu để thay thế hook

Trong khi chưa có lớp nào hỗ trợ bắt phím thì tạm thời dùng hook. Quan trọng là đạt được kết quả, người dùng họ muốn anh bắt phím ở các ứng dụng khác, họ có quan tâm anh dùng hook hay ko dùng hook hay không đâu :D

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Tue 16/09/2008 6:57 pm
by luungoc2005
có sẵn cả rùi, registerhotkey+unregisterhotkey...

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Fri 10/10/2008 8:48 am
by clarkkent
Có cái nào khác ngoài 2 cái đó không, không biết sao đưa vô 1 số chương trình nó bị đơ... :D

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 04/03/2009 4:17 pm
by ShareToShare
theo tui đánh giá bài viết của bác @tienlbhoc hay
hay ở chổ nào thì khi dùng userControl thì sẽ rõ , vì userControl ko có KeyPreview

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 08/04/2009 10:16 am
by ShareToShare
tôi đang viết hotkey trên userControl giống như bác @tienlbhoc nói ở trên . Nói chung nó chạy ổn . Nhưng chỉ khi nào focus nó nằm trên userControl thì mới dùng hotkey được , còn nếu nó nằm trên textbox của form (ko phải của userControl đâu nha) thì hotkey lại gọi ko được . Mong mọi người giúp đỡ

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 08/04/2009 2:28 pm
by MATH-INFO
@Tienlbhoc: Trước giờ bạn tạo hotkey toàn dùng hook à, đao to búa lớn thế, Lên google search coi người ta tạo hot key có dùng hook không nha... (tất nhiên là phải có tác dụng trên toàn bộ mọi cửa sổ).

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 08/04/2009 8:33 pm
by tienlbhoc
cái đăng ký hotkey biết rồi , nhưng cái đó run 64bit trục trặc đó bác, đã xét hotkey toàn cục thì hook là lành nhất

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Thu 09/04/2009 10:12 am
by MATH-INFO
Hook toàn cục để bắt hotkey rất khó khăn, phải xử lý keyup key down rất nhiêu khê. Chưa kể không thể giải quyết được đụng độ xảy ra nếu hotkey của mình trùng với một chương trình nào đó khác.

Chỉ nên sử dụng khi muốn khóa máy và chỉ cho unlock khi nhấn hotkey.

Re: Tạo phím nóng trong dotnet không thèm đụng hook

Posted: Wed 22/05/2013 5:18 pm
by thuanchinapro07
function ProcessDialogKey là gốc rễ để bắt event bàn phím . khi override bạn có thể bắt được sự kiện khi gõ 1 phím bất kì
Nó được gọi đầu tiên
thứ tự gọi các function khi gõ phím. (khi xử lý gõ bản phím)
1. ProcessDialogKey
2. KeyDown
3. KeyPress

p/s: với VB cũng tương tự.
Nếu bạn hay customize các control đôi khi bạn sẽ hay phải override function ProcessDialogKey này