• 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

HotKeyManager dùng KeyboardHook

Các bài viết hướng dẫn về Visual Basic .NET và C#

Moderators: tungcan5diop, QUANITGROBEST

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Wed 26/03/2008 10:29 pm

Thủ thuật: HotKeyManager dùng KeyboardHook
Tác giả: Kỳ Nam
Mô tả: Dùng KeyboardHook sẽ 0 sợ hotkey đã được dùng bởi chương trình khác


Code: Select all

  1. Imports System.Runtime.InteropServices
  2.  
  3. Public NotInheritable Class User32
  4.  
  5.     Public Declare Auto Function SetWindowsHookEx Lib "user32.dll" (ByVal idHook As WH, ByVal lpfn As HookProc, ByVal hmod As IntPtr, ByVal dwThreadId As Int32) As IntPtr
  6.     Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As IntPtr) As Boolean
  7.     Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal ncode As Int32, ByVal wParam As Int32, ByVal lParam As IntPtr) As Int32
  8.     Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
  9.  
  10.     Public Declare Auto Function MapVirtualKey Lib "user32.dll" (ByVal Code As Windows.Forms.Keys, ByVal MapType As MVK) As Short
  11.  
  12. End Class
  13.  
  14. <Flags()> Public Enum [MOD]
  15.     None = 0
  16.     Alt = 1
  17.     Control = 2
  18.     Shift = 4
  19.     Win = 8
  20. End Enum
  21.  
  22. Public Enum MVK
  23.     VirtualKeyToScan
  24.     ScanToVirtualKey
  25.     VirtualKeyToCharacter
  26.     ScanToVirtualKeyEx
  27. End Enum
  28.  
  29. Public Enum WH
  30.     CALLWNDPROC = 4
  31.     CALLWNDPROCRET = 12
  32.     CBT = 5
  33.     DEBUG = 9
  34.     FOREGROUNDIDLE = 11
  35.     GETMESSAGE = 3
  36.     HARDWARE = 8
  37.     JOURNALPLAYBACK = 1
  38.     JOURNALRECORD = 0
  39.     KEYBOARD = 2
  40.     KEYBOARD_LL = 13
  41.     MAX = 11
  42.     MAXHOOK = MAX
  43.     MIN = -1
  44.     MINHOOK = MIN
  45.     MOUSE = 7
  46.     MOUSE_LL = 14
  47.     MSGFILTER = -1
  48.     SHELL = 10
  49.     SYSMSGFILTER = 6
  50. End Enum
  51.  
  52. Public Enum WM
  53.     KEYDOWN = &H100
  54.     KEYUP = &H101
  55.     SYSKEYDOWN = &H104
  56.     SYSKEYUP = &H105
  57. End Enum
  58.  
  59. Public MustInherit Class BaseHook
  60.     Implements IDisposable
  61.  
  62.     Private HookHandle As IntPtr
  63.     Private HookProc As User32.HookProc
  64.  
  65.     Protected MustOverride ReadOnly Property HookType() As WH
  66.  
  67.     ''' <summary>
  68.     ''' Cần có sẵn standard application message loop trên thread hiện tại , nếu chưa có thì dùng Application.Run()
  69.     ''' </summary>
  70.     Public Sub InstallHook()
  71.         If HookHandle <> IntPtr.Zero Then Return
  72.         HookProc = AddressOf Hook
  73.         HookHandle = User32.SetWindowsHookEx(HookType, HookProc, Marshal.GetHINSTANCE([GetType]().[Module]), 0)
  74.         If HookHandle = IntPtr.Zero Then
  75.             Throw New System.ComponentModel.Win32Exception()
  76.         End If
  77.     End Sub
  78.  
  79.     Private Function Hook(ByVal Code As Integer, ByVal WParam As IntPtr, ByVal LParam As IntPtr) As IntPtr
  80.         Dim Result As IntPtr = User32.CallNextHookEx(HookHandle, Code, WParam, LParam)
  81.         Return IIf(Code < 0, Result, IIf(InternalHookProcessing(WParam, LParam), New IntPtr(1), Result))
  82.     End Function
  83.  
  84.     Protected MustOverride Function InternalHookProcessing(ByVal WParam As IntPtr, ByVal LParam As IntPtr) As Boolean
  85.  
  86.     Public Sub UninstallHook()
  87.         If HookHandle = IntPtr.Zero Then Return
  88.         User32.UnhookWindowsHookEx(HookHandle)
  89.         HookHandle = IntPtr.Zero
  90.         HookProc = Nothing
  91.     End Sub
  92.  
  93. #Region " IDisposable Support "
  94.  
  95.     Private disposedValue As Boolean = False        ' To detect redundant calls
  96.  
  97.     ' IDisposable
  98.     Protected Overridable Sub Dispose(ByVal disposing As Boolean)
  99.         If Not Me.disposedValue Then
  100.             If disposing Then
  101.                 ' TODO: free other state (managed objects).
  102.             End If
  103.  
  104.             ' TODO: free your own state (unmanaged objects).
  105.             UninstallHook()
  106.             ' TODO: set large fields to null.
  107.         End If
  108.         Me.disposedValue = True
  109.     End Sub
  110.  
  111.     ' This code added by Visual Basic to correctly implement the disposable pattern.
  112.     Public Sub Dispose() Implements IDisposable.Dispose
  113.         ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
  114.         Dispose(True)
  115.         GC.SuppressFinalize(Me)
  116.     End Sub
  117.  
  118. #End Region
  119.  
  120. End Class
  121.  
  122. Public Class KeyboardHook
  123.     Inherits BaseHook
  124.  
  125.     Public Event KeyDown(ByVal sender As Object, ByVal e As KeyboardHookEventArgs)
  126.     Public Event KeyUp(ByVal sender As Object, ByVal e As KeyboardHookEventArgs)
  127.  
  128.     Protected Overrides ReadOnly Property HookType() As WH
  129.         Get
  130.             Return WH.KEYBOARD_LL
  131.         End Get
  132.     End Property
  133.  
  134.     Protected Overrides Function InternalHookProcessing(ByVal WParam As System.IntPtr, ByVal LParam As System.IntPtr) As Boolean
  135.         Dim Key As Keys
  136.         Key = CType(Marshal.ReadInt32(LParam), Keys)
  137.         Dim KHEA As New KeyboardHookEventArgs(Key, False)
  138.  
  139.         Select Case CType(WParam, WM)
  140.             Case WM.SYSKEYDOWN, WM.KEYDOWN
  141.                 RaiseEvent KeyDown(Me, KHEA)
  142.  
  143.             Case WM.SYSKEYUP, WM.KEYUP
  144.                 RaiseEvent KeyUp(Me, KHEA)
  145.  
  146.         End Select
  147.  
  148.         Return KHEA.Cancel
  149.     End Function
  150.  
  151. End Class
  152.  
  153. Public Class KeyboardHookEventArgs
  154.  
  155.     Private _Key As Keys
  156.     Private _Cancel As Boolean
  157.  
  158.     Public Sub New()
  159.     End Sub
  160.  
  161.     Public Sub New(ByVal Key As Keys, ByVal Cancel As Boolean)
  162.         _Key = Key
  163.         _Cancel = Cancel
  164.     End Sub
  165.  
  166.     Public ReadOnly Property Key() As Keys
  167.         Get
  168.             Return _Key
  169.         End Get
  170.     End Property
  171.  
  172.     Public Property Cancel() As Boolean
  173.         Get
  174.             Return _Cancel
  175.         End Get
  176.         Set(ByVal value As Boolean)
  177.             _Cancel = value
  178.         End Set
  179.     End Property
  180.  
  181. End Class
  182.  
  183. Public NotInheritable Class Macro
  184.  
  185.     Public Shared Function HiOrder(ByVal n As Integer) As Short
  186.         Return (n >> 16) And 65535
  187.     End Function
  188.  
  189.     Public Shared Function LoOrder(ByVal n As Integer) As Short
  190.         Return n And 65535
  191.     End Function
  192.  
  193. End Class
  194.  
  195. Public Structure HotKey
  196.  
  197.     Private M As [MOD]
  198.     Private K As Keys
  199.  
  200.     Public Sub New(ByVal Value As Integer)
  201.         M = Macro.HiOrder(Value)
  202.         K = Macro.LoOrder(Value)
  203.     End Sub
  204.  
  205.     Public Sub New(ByVal M As [MOD], ByVal K As Keys)
  206.         Me.M = M
  207.         Me.K = K
  208.     End Sub
  209.  
  210.     Public Property Modifier() As [MOD]
  211.         Get
  212.             Return M
  213.         End Get
  214.         Set(ByVal value As [MOD])
  215.             M = value
  216.         End Set
  217.     End Property
  218.  
  219.     Public Property Key() As Keys
  220.         Get
  221.             Return K
  222.         End Get
  223.         Set(ByVal value As Keys)
  224.             K = value
  225.         End Set
  226.     End Property
  227.  
  228.     Public Shared Widening Operator CType(ByVal K As HotKey) As Integer
  229.         Return (K.M << 16) Or K.K
  230.     End Operator
  231.  
  232.     Public Shared Widening Operator CType(ByVal I As Integer) As HotKey
  233.         Return New HotKey(I)
  234.     End Operator
  235.  
  236.     Public Shared Operator =(ByVal a As HotKey, ByVal b As HotKey) As Boolean
  237.         Return a.Value = b.Value
  238.     End Operator
  239.  
  240.     Public Shared Operator <>(ByVal a As HotKey, ByVal b As HotKey) As Boolean
  241.         Return Not a.Value = b.Value
  242.     End Operator
  243.  
  244.     Public Overrides Function ToString() As String
  245.         If K = Keys.None Then Return "None"
  246.         Dim C As Char = Convert.ToChar(User32.MapVirtualKey(K, MVK.VirtualKeyToCharacter))
  247.         If M > [MOD].None Then
  248.             Dim S As String = ""
  249.             If M And [MOD].Control Then S = S & "Ctrl+"
  250.             If M And [MOD].Shift Then S = S & "Shift+"
  251.             If M And [MOD].Alt Then S = S & "Alt+"
  252.             If M And [MOD].Win Then S = S & "Win+"
  253.             Return S & C
  254.         Else
  255.             Return C
  256.         End If
  257.     End Function
  258.  
  259.     Public ReadOnly Property HasKey() As Boolean
  260.         Get
  261.             Return K And Keys.KeyCode > Keys.None
  262.         End Get
  263.     End Property
  264.  
  265.     Public ReadOnly Property Value() As Integer
  266.         Get
  267.             Return (M << 16) Or CInt(K)
  268.         End Get
  269.     End Property
  270.  
  271.     Public Overrides Function GetHashCode() As Integer
  272.         Return Value.GetHashCode
  273.     End Function
  274.  
  275. End Structure
  276.  
  277. Public Delegate Sub HotKeyInvoker(ByVal Key As HotKey)
  278.  
  279. Public Class HookHotKeyManager
  280.  
  281.     Public Delegate Sub HotKeyPressedHandler(ByVal sender As Object, ByVal HotKey As HotKey)
  282.  
  283.     Private HotKeyPressedHandlerList As New List(Of HotKeyPressedHandler)
  284.  
  285.     ''' <summary>
  286.     ''' Asynchronous event
  287.     ''' </summary>
  288.     Public Custom Event HotKeyPressed As HotKeyPressedHandler
  289.  
  290.         AddHandler(ByVal value As HotKeyPressedHandler)
  291.             HotKeyPressedHandlerList.Add(value)
  292.         End AddHandler
  293.  
  294.         RemoveHandler(ByVal value As HotKeyPressedHandler)
  295.             HotKeyPressedHandlerList.Remove(value)
  296.         End RemoveHandler
  297.  
  298.         RaiseEvent(ByVal sender As Object, ByVal HotKey As HotKey)
  299.             For Each handler As HotKeyPressedHandler In HotKeyPressedHandlerList
  300.                 If handler IsNot Nothing Then
  301.                     handler.BeginInvoke(sender, HotKey, Nothing, Nothing)
  302.                 End If
  303.             Next
  304.         End RaiseEvent
  305.  
  306.     End Event
  307.  
  308.     Dim WithEvents KH As New KeyboardHook
  309.     Dim CurrentModifier As [MOD]
  310.     Dim D As New Dictionary(Of HotKey, [Delegate])
  311.  
  312.     Public Sub Start()
  313.         KH.InstallHook()
  314.     End Sub
  315.  
  316.     Public Sub AddHotKey(ByVal Key As HotKey, ByVal Action As HotKeyInvoker)
  317.         D.Add(Key, Action)
  318.     End Sub
  319.  
  320.     Public Sub AddHotKey(ByVal Key As HotKey, ByVal Action As MethodInvoker)
  321.         D.Add(Key, Action)
  322.     End Sub
  323.  
  324.     Public Sub AddHotKey(ByVal Key As HotKey)
  325.         D.Add(Key, Nothing)
  326.     End Sub
  327.  
  328.     Private Sub KH_KeyDown(ByVal sender As Object, ByVal e As KeyboardHookEventArgs) Handles KH.KeyDown
  329.         If e.Key = Keys.LMenu OrElse e.Key = Keys.RMenu Then
  330.             CurrentModifier = CurrentModifier Or [MOD].Alt
  331.  
  332.         ElseIf e.Key = Keys.LControlKey OrElse e.Key = Keys.RControlKey Then
  333.             CurrentModifier = CurrentModifier Or [MOD].Control
  334.  
  335.         ElseIf e.Key = Keys.LShiftKey OrElse e.Key = Keys.RShiftKey Then
  336.             CurrentModifier = CurrentModifier Or [MOD].Shift
  337.  
  338.         ElseIf e.Key = Keys.LWin OrElse e.Key = Keys.RWin Then
  339.             CurrentModifier = CurrentModifier Or [MOD].Win
  340.  
  341.         End If
  342.     End Sub
  343.  
  344.     Private Sub KH_KeyUp(ByVal sender As Object, ByVal e As KeyboardHookEventArgs) Handles KH.KeyUp
  345.         If e.Key = Keys.LMenu OrElse e.Key = Keys.RMenu Then
  346.             CurrentModifier = CurrentModifier And Not [MOD].Alt
  347.  
  348.         ElseIf e.Key = Keys.LControlKey OrElse e.Key = Keys.RControlKey Then
  349.             CurrentModifier = CurrentModifier And Not [MOD].Control
  350.  
  351.         ElseIf e.Key = Keys.LShiftKey OrElse e.Key = Keys.RShiftKey Then
  352.             CurrentModifier = CurrentModifier And Not [MOD].Shift
  353.  
  354.         ElseIf e.Key = Keys.LWin OrElse e.Key = Keys.RWin Then
  355.             CurrentModifier = CurrentModifier And Not [MOD].Win
  356.  
  357.         Else
  358.             For Each HK As HotKey In D.Keys
  359.                 If HK.Modifier = CurrentModifier AndAlso HK.Key = e.Key Then
  360.                     Dim Action As [Delegate] = D(HK)
  361.                     If Action IsNot Nothing Then
  362.                         If TypeOf Action Is HotKeyInvoker Then
  363.                             DirectCast(Action, HotKeyInvoker).BeginInvoke(HK, Nothing, Nothing)
  364.                         ElseIf TypeOf Action Is MethodInvoker Then
  365.                             DirectCast(Action, MethodInvoker).BeginInvoke(Nothing, Nothing)
  366.  
  367.                         End If
  368.                     End If
  369.                     RaiseEvent HotKeyPressed(Me, HK)
  370.                 End If
  371.             Next
  372.         End If
  373.     End Sub
  374.  
  375. End Class


dùng nó , bấm CTRL+A / CTRL+B để thấy

Code: Select all

  1. Public Class Form1
  2.  
  3.     Dim WithEvents HHKM As New HookHotKeyManager
  4.  
  5.     Public Sub New()
  6.         ' This call is required by the Windows Form Designer.
  7.         InitializeComponent()
  8.  
  9.         ' Add any initialization after the InitializeComponent() call.
  10.         HHKM.AddHotKey(New HotKey([MOD].Control, Keys.A))
  11.         HHKM.AddHotKey(New HotKey([MOD].Control, Keys.B), AddressOf HotKey2)
  12.         HHKM.Start()
  13.     End Sub
  14.  
  15.     Private Sub HHKM_HotKeyPressed(ByVal sender As Object, ByVal HotKey As HotKey) Handles HHKM.HotKeyPressed
  16.         MessageBox.Show(HotKey.ToString)
  17.     End Sub
  18.  
  19.     Private Sub HotKey2()
  20.         MessageBox.Show("HotKey2 được bấm")
  21.     End Sub
  22.  
  23. End Class



User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Wed 26/03/2008 10:52 pm

project
Test.7z
(16.79 KiB) Downloaded 513 times

boyvt
Thành viên chính thức
Thành viên chính thức
Posts: 17
Joined: Fri 28/03/2008 9:41 am
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby boyvt » Fri 28/03/2008 9:54 am

Công dụng của nó là làm gì vậy bạn ? Mình không hiêu rõ lắm. Mong chỉ dẫn.
Mới làm quen với VB.NET, mong các anh chị ở caulacbovb giúp đỡ. Cám ơn rất nhiều :)

[b]Sân chơi Trường THPT Hòa Bình - Xuyên Mộc- BR_VT[/b]
http://thpthoabinh.edu.vn

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby luungoc2005 » Wed 18/06/2008 3:57 pm

Công dụng của nó là làm hotkey
Đừng nói ko hiểu hotkey là chi....
Hotkey do cái code này tạo ra ko sợ đã được xài bởi soft khác
Mà sao ko xài luôn GetAsyncKeyState cho tiện :D
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

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:

Re: HotKeyManager dùng KeyboardHook

Postby vo_minhdat2007 » Sat 12/07/2008 7:42 pm

Error sau khi thực hiện lệnh HHKM.Start() ở dòng 12 trong đoạn code 2.
An error occurred creating the form. See Exception.InnerException for details. The error is: The parameter is incorrect

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Tue 15/07/2008 12:56 pm

vo_minhdat2007 wrote:Error sau khi thực hiện lệnh HHKM.Start() ở dòng 12 trong đoạn code 2.
An error occurred creating the form. See Exception.InnerException for details. The error is: The parameter is incorrect

có dùng windows 64bit 0 ?

tienlbhoc
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 415
Joined: Sat 14/07/2007 10:06 pm
Location: Hà Nội
Been thanked: 1 time

Re: HotKeyManager dùng KeyboardHook

Postby tienlbhoc » Tue 15/07/2008 1:01 pm

E hèm hook bị trên win 64 bit , đây chính là lý do mình cực kỳ kị với cái của này :D . Có phương hướng giải quyết không vậy
Diễn đàn và blog phần mềm tự làm :
http://my.opera.com/DienDanTienlbhoc/forums/
http://my.opera.com/tienlbhoc/blog/

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Tue 15/07/2008 1:28 pm

Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal ncode As Int32, ByVal wParam As Int32, ByVal lParam As IntPtr) As Int32

----> đổi thành :

Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal ncode As Int32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

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:

Re: HotKeyManager dùng KeyboardHook

Postby vo_minhdat2007 » Thu 17/07/2008 7:24 pm

Kỳ Nam wrote:Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal ncode As Int32, ByVal wParam As Int32, ByVal lParam As IntPtr) As Int32

----> đổi thành :

Public Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal ncode As Int32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

Vẫn bị. Tuy nhiên khi đọc được biết từ WinXp thì sẽ ignore cái hHook nên bỏ nó ra thì lại lỗi lãng nhách :
Operation have completed succesfully và dừng chương trình, còn bẫy lỗi cho ko có gì thì nhấn mòn phím cũng không đc gì cả!

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Thu 17/07/2008 7:54 pm

có dùng windows 64bit 0 , nói đi để còn biết đường mà lần chớ

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:

Re: HotKeyManager dùng KeyboardHook

Postby vo_minhdat2007 » Thu 17/07/2008 8:04 pm

Kỳ Nam wrote:có dùng windows 64bit 0 , nói đi để còn biết đường mà lần chớ
Last edited by thuongall on Wed 25/11/2009 12:18 pm, edited 1 time in total.
Reason: Có dùng 64bit không thì trả lời ngay, sao Đạt post 1 loạt report hệ thống rất dài, biến nó thành rác cho forum vậy?

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Thu 17/07/2008 8:38 pm

nghĩ sao dậy

0 có chớ gì

tải Test.7z ở trên thử được 0

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:

Re: HotKeyManager dùng KeyboardHook

Postby vo_minhdat2007 » Thu 24/07/2008 7:03 pm

Tìm được lỗi rồi. Muốn sống thì giao cái reference Fac... gì gì đó ra mau >:) .

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Fri 25/07/2008 8:41 am

làm gì còn referencer nào nữa

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:

Re: HotKeyManager dùng KeyboardHook

Postby vo_minhdat2007 » Fri 25/07/2008 11:20 am

Chứ cái này là cái gì mà xoá trong project Test là nó lỗi? B-(

Untitled.jpg

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: HotKeyManager dùng KeyboardHook

Postby Kỳ Nam » Fri 25/07/2008 12:46 pm

xoá nó đi


Return to “[.NET] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests