On Friday, 14 November 2014 at 02:08:22 UTC, Casey wrote:
Well, I edited the code to add the chat button, and as I feared it didn't recignise it in game. However, if I manually press the chat button it'll work fine

What exactly happened there?

1)What part of this do I need to keep when adding the second hotkey? Include an example if possible. I find it hard to understand what is necessary to repeat and what I can just include once.

The RegisterHotKey function will need to be called again with a new ID. Then, the WM_HOTKEY message will have to handle the other hotkey id too.

You can copy and paste every instance of hotkey_id to make a hotkey2_id in a pinch.

I know there's a lot of concepts behind the MSDN pages that aren't all newbie friendly (well, actually, there are pages on it to explain the concepts too, in the References part at the bottom of each page. You'll be in for many hours of reading though, it took me weeks to get going beyond copy/paste and it was /years/ before I knew all the concepts, but gotta start somewhere). Anyway, take a look at the pages to better understand what the code is doing - the concepts will make sense too once you see enough of it and in the mean time, it can help to explain the pieces in isolation.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646279%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms646310%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms646271%28v=vs.85%29.aspx

This is all Windows specific, of course, but the concepts apply to a lot of systems - if you can write Win32 code, you can do a lot of stuff.

2)All I need to do at the moment to enable this to work is to add a ~1ms delay from the time the chat key is pressed down, and when it is pressed up. Then it /should/ funtion in game properly.

The easiest way would be to split up the part that does SendInput into two parts - notice how in the code, there were separate events for pressed and released. You'd need to split that up into two separate calls to SendInput with some kind of sleep in between. There's also a timestamp thing mentioned in the MSDN docs which might work but I'm not sure that would actually work.

3)It's a personal preference of mine to not have the chat window pop up like it does, nor the terminal popup. This is a minor request, so I don't need it immediately. Is there any way to make those disappear?

The terminal won't appear if you use the -L SUBSYSTEM thing from a previous post on the compile command at the end of the lit of files.

The window itself could be hidden with the ShowWindow system function, but then you'd have to consider: how will you close the program when you don't want the hotkeys registered anymore? Having a visible window makes that easy.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx

The hwnd ShowWindow needs is available through window.impl.hwnd, so like

ShowWindow(window.impl.hwnd, SW_HIDE);

i should add this to simpledisplay.d too...

4)I'd like the first hotkey to be 0 + 1 on the numpad. Numlock is always enabled on my keyboard, so I can't use arrows or anything like that. The second set of hotkeys would be Ctrl + Del/End/PgDn/Insert/Home/PgUp, each one sending a different message.

The Virtual Keys thing is the answer here. Search for virtual key codes on MSDN and you'll find this

http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

Then search that page for "Numeric keypad 0 key" and you'll find the VK_NUMPAD0 name and number.

5)Is there any way to pause the commands? I have one hotkey set to Ctrl + Delete, and it gets really annoying when I try to Delete a full word but instead I send a chat message. I think that I could activate and pause it with another hotkey, something like ctrl + numpad 0. That should be something I'd never press.


This is pretty straightforward: you can use an if clause with a variable in the WM_HOTKEY message to skip processing. Or, you could use UnregisterHotKey, passing the hwnd from the window and the ID number to turn it off entirely, then RegisterHotKey again later to turn it back on.

I'm going to see if I can't figure everything above out on my own. Maybe I'll start to learn it a bit more. I'm also assuming I'll need another package to be imported if I am to add that delay, but it might already be in one of these.

core.thread is one you can import, that gives you Thread.sleep
http://dlang.org/phobos/core_thread.html#sleep

This isn't the way you'd do this in a real program - it is usually a bad idea to sleep the thread responsible for handling window messages because then it can become unresponsive, but as long as you only sleep for a few milliseconds at a time it shouldn't be an issue.

Reply via email to