Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

I notice that when moving my sprites the response to keypressing is somewhat slow.

 

If I increment the x axis by 1 the movement is too slow, if I increment by x * n the motion is quicker, but jerky.

 

When I used to program in C++ I wrote a keyboard interrupt handle which made the response to keypressing extremely fast resulting in smooth fast motion.

 

I am currently using DrawImageUnscaled to draw the sprite and DrawImage to erase it. I have not got into DirectX yet as that is many chapters away!

 

1. Is there a way to program in VB.NET a new keyboard interrrupt or is that just too low level for it?

 

2. Is there a better way to respond to keypress or draw the sprite using GDI+

 

3. Am I expecting too much. Like will my problem be solved once (if) I learn to program DirectX and should simply accept the current state of affairs as part of the road to learning greater things?

 

Thnx

My website
Posted (edited)

The problem you are facing is the difference between .net and C++. I did a drawing test on this topic myself. You can download these programs and see for yourself.

 

Here are the links:

 

You can trust each program. I did nothing wierd or nasty.

You must unzip all three, put them in the same folder and then use the merge file located in the 3rd Chunk to put the file together again. There are directions in the download on how to use the drawing tests.

 

1st Chunk

2nd Chunk

3rd Chunk

 

If you have problems and are interested, let me know. I can e-mail the programs too.

Edited by aewarnick
C#
Posted

Don't know if this will be of any help, but I just happen to be playing with some keyboard stuff in one of my apps. I found this, and have been messing with it, so it isn't very clean at the moment. Put this in a keyboard module:

 

Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.Drawing
Imports System.Threading

Module Keyboard

   Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
   Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As KeyboardHookDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
   Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
   Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As KBDLLHOOKSTRUCT) As Integer

   Public Structure KBDLLHOOKSTRUCT
       Public vkCode As Integer
       Public scanCode As Integer
       Public flags As Integer
       Public time As Integer
       Public dwExtraInfo As Integer
   End Structure

   ' Low-Level Keyboard Constants
   Private Const HC_ACTION As Integer = 0
   Private Const LLKHF_EXTENDED As Integer = &H1
   Private Const LLKHF_INJECTED As Integer = &H10
   Private Const LLKHF_ALTDOWN As Integer = &H20
   Private Const LLKHF_UP As Integer = &H80

   ' Virtual Keys
   Public Const VK_TAB = &H9
   Public Const VK_CONTROL = &H11
   Public Const VK_ESCAPE = &H1B
   Public Const VK_DELETE = &H2E
   Public Const VK_A = &H41
   Public Const VK_B = &H42
   Public Const VK_C = &H43
   Public Const VK_D = &H44
   Public Const VK_E = &H45
   Public Const VK_F = &H46
   Public Const VK_G = &H47
   Public Const VK_H = &H48
   Public Const VK_I = &H49
   Public Const VK_J = &H4A
   Public Const VK_K = &H4B
   Public Const VK_L = &H4C
   Public Const VK_M = &H4D
   Public Const VK_N = &H4E
   Public Const VK_O = &H4F
   Public Const VK_P = &H50
   Public Const VK_Q = &H51
   Public Const VK_R = &H52
   Public Const VK_S = &H53
   Public Const VK_T = &H54
   Public Const VK_U = &H55
   Public Const VK_V = &H56
   Public Const VK_W = &H57
   Public Const VK_X = &H58
   Public Const VK_Y = &H59
   Public Const VK_Z = &H5A

   Private Const WH_KEYBOARD_LL As Integer = 13&
   Public KeyboardHandle As Integer


   ' Implement this function to catch keys
   Public Function IsHooked(ByRef Hookstruct As KBDLLHOOKSTRUCT) As Boolean

       Static Dim x As Integer = 0

       'Debug.Write(vbCrLf)
       'Debug.Write("vkcode: " & Hookstruct.vkCode & vbCrLf)
       'Debug.Write("time: " & Hookstruct.time & vbCrLf)
       'Debug.Write("dwextrainfo: " & Hookstruct.dwExtraInfo & vbCrLf)
       'Debug.Write("flags: " & Hookstruct.flags & vbCrLf)
       'Debug.Write("scancode: " & Hookstruct.scanCode & vbCrLf)

       'CBool(GetAsyncKeyState(VK_CONTROL) And &H8000)


       If Hookstruct.vkCode = VK_S Then
           Debug.Write("Key - S" & vbCrLf)
       End If

       Return False
   End Function


   Public Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer

       If (Code = HC_ACTION) Then

           If (IsHooked(lParam)) Then
               Return 1
           End If

       End If

       Return CallNextHookEx(KeyboardHandle, Code, wParam, lParam)

   End Function


   Public Delegate Function KeyboardHookDelegate(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
   <MarshalAs(UnmanagedType.FunctionPtr)> Private callback As KeyboardHookDelegate

   Public Sub HookKeyboard()
       callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
       KeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, callback, Marshal.GetHINSTANCE([Assembly].GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
   End Sub

   Public Function Hooked()
       Hooked = KeyboardHandle <> 0
   End Function

   Public Sub UnhookKeyboard()
       If (Hooked()) Then
           Call UnhookWindowsHookEx(KeyboardHandle)
       End If
   End Sub

End Module



 

"keyboard.hookkeyboard" to start (on form load?)

"keyboard.unhookkeyboard" to stop (on form close?)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...