Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

I'm not sure if this is the category to drop this question under, so please move it if it's not.

 

I have a program that takes screenshots by using a hotkey (user defined - ALT, CTRL, SHIFT or WIN + a user-defined character). This works perfectly under any program EXCEPT directx programs. It works fine with OpenGL (Medal of Honor Allied Assault) but not at all with DirectX (Halo). It seems that DX just completely ignores all hotkeys. Is there a way I can set this up to recognize my hotkeys while directx is in the foreground and my program is minimized to the system tray? I even tried setting the program on top and hiding the form, and still no go.

 

I'd appreciate any feedback anyone has on this.

 

Thanks!

  • 1 month later...
Posted
I'm not sure, but there is a way to disable global hotkeys this is most likely what Microsoft did in halo. Reason being if you use ALT as a strife moniter, and TAB is the score board if you are strifing and then try to view the score board you will ALT + TAB out of the game, which is annoying. You may want to look into enabling global hotkeys. And then enable them after you run the game. Just a thought.

~Nate�

___________________________________________

Please use the [vb]/[cs] tags on posted code.

Please post solutions you find somewhere else.

Follow me on Twitter here.

Posted
No, it's in the program. There is a specific module in DirectX that ignores hotkeys. If the programmer that wrote the game chooses to use this method, there is nothing you can do about it. ;)
Posted

I just thought of it, you might be able to use the Windows API, and GetAsyncKeyState . It's just a thought I don't know if it would work or not. You could also try this website it may work even if 'hot keys' are disabled. http://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4831/.

 

Private Declare Function GetAsyncKeyState Lib "user32" _
   (ByVal vKey As Integer) As Integer

~Nate�

___________________________________________

Please use the [vb]/[cs] tags on posted code.

Please post solutions you find somewhere else.

Follow me on Twitter here.

Posted (edited)

I dont know the GetAsyncKeyState, but it sounds like you'd have to ask each key to see if it is pressed or not, several times per second.

 

Another way would be to use the LowLevelKeyboardProc API (sorry, dont have a declare ;), do have a link though : MSDN - LowLevelKeyboardProc ). This should allow you to put a hook into all keyboard input. This means that each time a key is pressed or released, windows calls a callback function you specified with the information of which key is pressed/released. Also, if you take a screenshot while in the callback, it will probably freeze all input from the keyboard until the screenshot has finished.

 

Be carefull though as this allows you to intercept keyboard commands before they are even handled by the application that actually receives them. Also make sure you remove the hook, I remember debugging and quiting an application with a hook still active. I was quite iritated that after the debugger had stopped and I pressed a key somehow the system stopped responding to the keyboard, either due to not cleaning up the hook in itself, or in combination with VB 5 ;). It took a reboot to correct this problem.

 

EDIT: Only just read the link to codeguru from Nate Bross. This is an article about using the lowlevelkeyboardproc to hook the keyboard action. So if you're curious about it, that article is a good read, including the declarations you'll need

Edited by Wile
Nothing is as illusive as 'the last bug'.

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...