• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Khoá các phím hệ thống trong chương trình

Các thủ thuật về hệ thống, thư mục, tập tin và mạng

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Khoá các phím hệ thống trong chương trình

Gửi bàigửi bởi vo_minhdat2007 » T.Tư 26/03/2008 8:49 pm

Thủ thuật: Khoá các phím hệ thống trong chương trình
Tác giả: vo_minhdat2007
Mô tả: Các phím như Alt+Tab, Alt+F4, ... tuy nhiên chỉ áp dụng khi chạy dạng Release (Built rồi chạy file exe), không có tác dụng khi debug! Ngoài ra cũng áp dụng được với VB2005 (chưa test)
---------------------------------------------------
Đầu tiên, cho đoạn code sau vào 1 Module :
  1.  Imports System.Runtime.InteropServices
  2.  Imports System.Reflection
  3.  
  4.  Module Hook 'ở đây tên module là hook, bạn đổi thành tên module bạn đã đặt
  5.  Region "Declarations"
  6.      Private Const HC_ACTION As Integer = 0
  7.      Private Const WH_KEYBOARD_LL As Integer = 13&
  8.  
  9.      Private Structure KBDLLHookStruct
  10.          Public vkCode As Integer
  11.          Public scanCode As Integer
  12.          Public flags As Integer
  13.          Public time As Integer
  14.          Public dwExtraInfo As Integer
  15.      End Structure
  16.  
  17.      <MarshalAs(UnmanagedType.FunctionPtr)> _
  18.      Private callback As KeyboardHookDelegate
  19.      Private mbBlockKeys As Boolean = True
  20.      Private miKeyboardHandle As Integer = 0
  21.      Private Delegate Function KeyboardHookDelegate(ByVal Code As Integer, _
  22.          ByVal wParam As Integer, ByRef lParam As KBDLLHookStruct) As Integer
  23.      Private Declare Function CallNextHookEx Lib "user32" ( _
  24.          ByVal hHook As Integer, ByVal nCode As Integer, _
  25.          ByVal wParam As Integer, ByVal lParam As KBDLLHookStruct) As Integer
  26.      Private Declare Function SetWindowsHookEx Lib "user32" _
  27.          Alias "SetWindowsHookExA" _
  28.          (ByVal idHook As Integer, ByVal lpfn As KeyboardHookDelegate, _
  29.          ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
  30.      Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
  31.          ByVal hHook As Integer) As Integer
  32.  End Region
  33.  
  34.  Region "Properties"
  35.      Public Property BlockKeyCombinations() As Boolean
  36.          Get
  37.              Return mbBlockKeys
  38.          End Get
  39.          Set(ByVal value As Boolean)
  40.              mbBlockKeys = value
  41.          End Set
  42.      End Property
  43.  
  44.      Public ReadOnly Property IsHooked() As Boolean
  45.          Get
  46.              Return miKeyboardHandle <> 0
  47.          End Get
  48.      End Property
  49.  End Region
  50.      Public Function IsInIDE() As Boolean
  51.          Return System.Diagnostics.Debugger.IsAttached
  52.      End Function
  53.  
  54.      Public Sub HookKeyboard()
  55.          ' Release any existing keyboard hook.
  56.          UnhookKeyboard()
  57.          If Not IsInIDE() Then
  58.              callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
  59.              miKeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, callback, _
  60.              Marshal.GetHINSTANCE([Assembly].GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
  61.          End If
  62.      End Sub
  63.  
  64.      Public Sub UnhookKeyboard()
  65.          If (IsHooked()) Then Call UnhookWindowsHookEx(miKeyboardHandle)
  66.      End Sub
  67.  
  68.      Private Function BlockKeyCombination(ByVal Hookstruct As KBDLLHookStruct) As Boolean
  69.          Dim bResult As Boolean = False
  70.          If mbBlockKeys Then
  71.              Select Case Hookstruct.vkCode
  72.                  Case System.ConsoleKey.Escape
  73.                      If My.Computer.Keyboard.CtrlKeyDown Then
  74.                          Debug.Print("Blocking: Ctrl-Esc")
  75.                          bResult = True
  76.                      ElseIf My.Computer.Keyboard.AltKeyDown Then
  77.                          Debug.Print("Blocking: Alt-Esc")
  78.                          bResult = True
  79.                      End If
  80.                  Case System.ConsoleKey.Tab
  81.                      If My.Computer.Keyboard.AltKeyDown Then
  82.                          Debug.Print("Blocking: Alt-Tab")
  83.                          bResult = True
  84.                      End If
  85.                  Case System.ConsoleKey.RightWindows, System.ConsoleKey.LeftWindows
  86.                      Debug.Print("Blocking: Windows Key")
  87.                      bResult = True
  88.                  Case System.ConsoleKey.Applications
  89.                      Debug.Print("Blocking: Application Key")
  90.                      bResult = True
  91.                  Case System.ConsoleKey.F4
  92.                      If My.Computer.Keyboard.AltKeyDown Then
  93.                          Debug.Print("Blocking: Alt-F4")
  94.                          bResult = True
  95.                      End If
  96.                  Case Else
  97.              End Select
  98.          End If
  99.          Return bResult
  100.      End Function
  101.  
  102.      Private Function KeyboardCallback(ByVal Code As Integer, _
  103.          ByVal wParam As Integer, ByRef lParam As KBDLLHookStruct) As Integer
  104.          Dim lResult As Integer = 0
  105.          If (Code = HC_ACTION) AndAlso (BlockKeyCombination(lParam)) Then
  106.              lResult = 1
  107.          Else
  108.              lResult = CallNextHookEx(miKeyboardHandle, Code, wParam, lParam)
  109.          End If
  110.          Return lResult
  111.      End Function
  112.  
  113.  End Module


Xong rồi, giờ trong phần Application Events, trong sự kiện Startup, thêm đoạn code :
  1. HookKeyboard()   
  2. BlockKeyCombinations = True

Bất cứ lúc nào muốn ngừng hoặc bật thì hãy cho BlockKeyCombinations bằng False/True
Và trong sự kiện Shutdown, đừng quên trả lại nhé!



HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Re: Khoá các phím hệ thống trong chương trình

Gửi bàigửi bởi HaiPT » T.Tư 26/03/2008 9:55 pm

hardcording quá , em cải tiến lại thành 1 class có sinh sự kiện keypress và cho phép bỏ qua không xử lý mã nếu cần , tham khảo lại các bài viết trong forum cũ ( Vb,c# , chạy trong IDE OK ) .
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

tai_computer
Thành viên chính thức
Thành viên chính thức
Bài viết: 27
Ngày tham gia: T.Bảy 15/08/2009 11:03 am
Has thanked: 1 time

Re: Khoá các phím hệ thống trong chương trình

Gửi bàigửi bởi tai_computer » CN 24/01/2010 8:49 pm

Hi. Thanks vo_minhdat2007 nha bài rất có ích test thử coai :D


Quay về “[.NET] Hệ thống - Tập tin - Thư mục và Mạng”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách