• 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

Moderators: tungcan5diop, QUANITGROBEST

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

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

Postby vo_minhdat2007 » Wed 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 :
[vbnet]HookKeyboard()   
BlockKeyCombinations = True[/vbnet]
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é!
[vbnet]UnhookKeyboard()[/vbnet]



HaiPT
VIP
VIP
Posts: 252
Joined: Wed 07/09/2005 4:02 pm
Location: Hải Phòng
Has thanked: 1 time
Been thanked: 12 times
Contact:

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

Postby HaiPT » Wed 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
Posts: 27
Joined: Sat 15/08/2009 11:03 am
Has thanked: 1 time

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

Postby tai_computer » Sun 24/01/2010 8:49 pm

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


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

Who is online

Users browsing this forum: No registered users and 1 guest