<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Is it possible to generate keyboard events when running in the background?</title>
		<link>http://www.allegro.cc/forums/view/608420</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 24 Sep 2011 21:49:48 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m trying to write a small program to record my input on another program. I decided to use Allegro 5&#39;s event system so that I don&#39;t lose events. It works great since even if I have an <span class="source-code"><a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k2">)</span></span>, the program catches all events. The problem is that it only works if the program window has the focus. If I switch to another window, the program no longer catches keyboard events even though it keeps running in the background.</p><p>I know this is the normal behavior but is there a way to force an Allegro 5.0.4 program to keep generating keyboard events even if it&#39;s window doesn&#39;t have the focus?.</p><p>Thanks.</p><p>[EDIT:] Forgot to mention, I want to do this on Windows XP.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 23 Sep 2011 06:06:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is a very key logger way to do things.</p><p>A typical message is passed through the programs that have focus. I&#39;d pass a message to the foremost program and wait for its response to that key press. If it returns <span class="source-code">TRUE</span> that it had handled it, nothing else receives that message. If it returns false, it means that it didn&#39;t understand how to process it and is giving it back so someone else &quot;higher up&quot; can try to process it.</p><p>In many cases, the OS itself blocks this message from reaching your background-suspended program. The only exceptions to this occur when you have drivers that place hooks on the system events. These always get processed, and CAN block the message from going any further, although key loggers are typically smart enough to let the key press actually reach their destination or the user would quickly know something was wrong when they start entering their bank information and nothing is appearing in their browser window.</p><p>Can you describe why you&#39;d want to keep receiving those messages? If I play your game, then switch to write an email, I wouldn&#39;t want my WASD keys to start moving a ship around while I can&#39;t see it (and where it shouldn&#39;t even be accepting inputs).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Fri, 23 Sep 2011 09:48:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608420/931937#target">OnlineCop</a> said:</div><div class="quote"><p> Can you describe why you&#39;d want to keep receiving those messages?
</p></div></div><p>I&#39;m playing a game I downloaded and I want to record my input on that game so that I can replay it later (and probably fine tune it).</p><p>A while ago I tried to do the same thing with Allegro 4. On Allegro 4 the program keeps receiving keyboard input if you use <span class="source-code"><a href="http://www.allegro.cc/manual/set_display_switch_mode"><span class="a">set_display_switch_mode</span></a><span class="k2">(</span>SWITCH_BACKGROUND<span class="k2">)</span></span> but in order to not lose any key presses you must not <span class="source-code"><a href="http://www.allegro.cc/manual/rest"><span class="a">rest</span></a><span class="k2">(</span><span class="k2">)</span></span> so the program takes 100% of the CPU and slows the actual game (maybe this wouldn&#39;t be an issue if I had a 2 cores CPU).</p><p>With Allegro 5&#39;s event system it seemed like catching the key presses would require practically no CPU usage but, unlike Allegro 4, it doesn&#39;t have an option like <span class="source-code"><a href="http://www.allegro.cc/manual/set_display_switch_mode"><span class="a">set_display_switch_mode</span></a><span class="k2">(</span><span class="k2">)</span></span>.</p><p>I tried the Windows API function <span class="source-code">AttachThreadInput<span class="k2">(</span><span class="k2">)</span></span> but looks like it doesn&#39;t do what I expected it to. Right now I&#39;m watching an example on how to set a keyboard hook.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 23 Sep 2011 21:15:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you&#39;re interesting just in the end result (you don&#39;t really care about learning how to do this), there are several programs, some free, that allow you to do this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Oscar Giner)</author>
		<pubDate>Fri, 23 Sep 2011 22:36:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I want to be able to customize it for my needs while also learning how to do it.</p><p>After searching and trying some of the examples without luck, I decided to look at the code of <a href="http://myhook.sourceforge.net/">MyHook</a>, a really simple keylogger, and found that the keyboard hook code was OK but in order to actually get to the callback, I had to explicitly handle the Windows&#39; messages (at least that&#39;s what MyHook does and it&#39;s the only method I got to work until now).</p><p>I made a few more changes to my code and I got it to work although not quite as I expected. Only key events performed when the Allegro 5 window is active are inserted into the Allegro event queue; key events performed when the Allegro 5 window is inactive are detected by the hook callback function but are not inserted into the Allegro event queue. CPU usage is low so I guess this might work.</p><p>I&#39;ll clean the mess in my code and post it here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 24 Sep 2011 01:30:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you might want to look into user events. You could have the hook callback function throw one of those.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (J-Gamer)</author>
		<pubDate>Sat, 24 Sep 2011 13:56:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, that&#39;s what I did. This is the sample code I&#39;m using for setting the keyboard hook. I marked the lines that do the actual work for the keyboard hook.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;allegro5/allegro_opengl.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro_windows.h&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span>
<span class="number">   7</span>
<span class="number">   8</span><span class="p">#define WMSG_EVENT    ALLEGRO_GET_EVENT_TYPE('W','M','S','G')   // Base identifier for Windows MSG events</span>
<span class="number">   9</span><span class="p">#define WMSG_KEYDOWN  (WMSG_EVENT + 0)</span>
<span class="number">  10</span><span class="p">#define WMSG_KEYUP    (WMSG_EVENT + 1)</span>
<span class="number">  11</span><span class="p">#define WMSG_OTHER    (WMSG_EVENT + 2)</span>
<span class="number">  12</span>
<span class="number">  13</span>
<span class="number">  14</span>
<span class="number">  15</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  16</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>events <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  17</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  18</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number">  19</span><a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> state<span class="k2">;</span>
<span class="number">  20</span>
<span class="number">  21</span>HHOOK kbHook<span class="k2">;</span>
<span class="number">  22</span>HINSTANCE appInstance<span class="k2">;</span>
<span class="number">  23</span>MSG msg<span class="k2">;</span>
<span class="number">  24</span>
<span class="number">  25</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>uevents<span class="k2">;</span>           <span class="c">// Event queue for user events</span>
<span class="number">  26</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a> usource<span class="k2">;</span>           <span class="c">// User event source</span>
<span class="number">  27</span><span class="k1">int</span> redraw, quit <span class="k3">=</span> FALSE<span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span>
<span class="number">  30</span>
<span class="number">  31</span>LRESULT CALLBACK LowLevelKeyboardProc<span class="k2">(</span> <span class="k1">int</span> nCode, WPARAM wParam, LPARAM lParam <span class="k2">)</span> <span class="k2">{</span>
<span class="number">  32</span>    KBDLLHOOKSTRUCT <span class="k3">*</span>pKeyBoard <span class="k3">=</span> <span class="k2">(</span>KBDLLHOOKSTRUCT <span class="k3">*</span><span class="k2">)</span>lParam<span class="k2">;</span>
<span class="number">  33</span>    DWORD vkCode<span class="k2">;</span>
<span class="number">  34</span>    
<span class="number">  35</span>    <span class="k1">switch</span> <span class="k2">(</span>wParam<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  36</span>        <span class="k1">case</span> WM_KEYDOWN:
<span class="number">  37</span>        <span class="k1">case</span> WM_KEYUP:
<span class="number">  38</span>            vkCode <span class="k3">=</span> pKeyBoard-&gt;vkCode<span class="k2">;</span>
<span class="number">  39</span>            <span class="c">//printf("%c %d\n", vkCode, pKeyBoard-&gt;time);</span>
<span class="number">  40</span>            event.user.type <span class="k3">=</span> wParam <span class="k3">=</span><span class="k3">=</span> WM_KEYDOWN ? WMSG_KEYDOWN <span class="k2">:</span> WMSG_KEYUP<span class="k2">;</span>
<span class="number">  41</span>            event.user.data1 <span class="k3">=</span> vkCode<span class="k2">;</span>
<span class="number">  42</span>            event.user.data2 <span class="k3">=</span> pKeyBoard-&gt;time<span class="k2">;</span>
<span class="number">  43</span>            event.user.data3 <span class="k3">=</span> MapVirtualKey<span class="k2">(</span>vkCode, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>    <span class="c">// MAPVK_VK_TO_VSC</span>
<span class="number">  44</span>            event.user.data4 <span class="k3">=</span> pKeyBoard-&gt;scanCode<span class="k2">;</span>
<span class="number">  45</span>            <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span><span class="k3">&amp;</span>usource, <span class="k3">&amp;</span>event, NULL<span class="k2">)</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_631.html" target="_blank">puts</a><span class="k2">(</span><span class="s">"Event not delivered"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  46</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  47</span>        default:
<span class="number">  48</span>            <span class="k1">return</span> CallNextHookEx<span class="k2">(</span> NULL, nCode, wParam, lParam <span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>    <span class="k2">}</span>
<span class="number">  50</span>    
<span class="number">  51</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  52</span><span class="k2">}</span>
<span class="number">  53</span>
<span class="number">  54</span>
<span class="number">  55</span>
<span class="number">  56</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  57</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>    <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_WINDOWED <span class="k3">|</span> ALLEGRO_OPENGL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BPS_TO_SECS"><span class="a">ALLEGRO_BPS_TO_SECS</span></a><span class="k2">(</span><span class="n">30</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>    <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>events <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>events, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>events, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>    
<span class="number">  70</span>    <a href="http://www.allegro.cc/manual/al_init_user_event_source"><span class="a">al_init_user_event_source</span></a><span class="k2">(</span><span class="k3">&amp;</span>usource<span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>uevents <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>uevents, <span class="k3">&amp;</span>usource<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</span><span class="c">// Sets a global keyboard hook</span>
<div class="highlight"><span class="number">  75</span>    appInstance <span class="k3">=</span> GetModuleHandle<span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span> </div><div class="highlight"><span class="number">  76</span>    kbHook <span class="k3">=</span> SetWindowsHookEx<span class="k2">(</span>WH_KEYBOARD_LL, LowLevelKeyboardProc, appInstance, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> </div><span class="number">  77</span>    <span class="k1">if</span> <span class="k2">(</span>kbHook <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_631.html" target="_blank">puts</a><span class="k2">(</span><span class="s">"Keyboard hook succesfully installed"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  79</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_631.html" target="_blank">puts</a><span class="k2">(</span><span class="s">"Keyboard hook installation failed"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>        quit <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number">  81</span>    <span class="k2">}</span>
<span class="number">  82</span>
<span class="number">  83</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">192</span>, <span class="n">192</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  85</span>    <span class="c">// Wait for a timer event</span>
<span class="number">  86</span>        <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>events, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>        <span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span>
<span class="number">  88</span>            redraw <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number">  89</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP <span class="k3">&amp;</span><span class="k3">&amp;</span> event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number">  90</span>            quit <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number">  91</span>    <span class="c">// Keyboard hook logic</span>
<div class="highlight"><span class="number">  92</span>        <span class="k1">while</span> <span class="k2">(</span>PeekMessage<span class="k2">(</span><span class="k3">&amp;</span>msg, NULL, <span class="n">0</span>, <span class="n">0</span>, PM_REMOVE<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span> </div><span class="number">  93</span>            <span class="c">//while (GetMessage(&amp;msg, NULL, 0, 0) &gt; 0) {</span>
<span class="number">  94</span>            <span class="c">//TranslateMessage(&amp;msg);</span>
<div class="highlight"><span class="number">  95</span>            DispatchMessage<span class="k2">(</span><span class="k3">&amp;</span>msg<span class="k2">)</span><span class="k2">;</span> </div><div class="highlight"><span class="number">  96</span>        <span class="k2">}</span> </div><span class="number">  97</span>    <span class="c">// Drawing</span>
<span class="number">  98</span>        <span class="k1">if</span> <span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>events<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  99</span>            <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>            redraw <span class="k3">=</span> FALSE<span class="k2">;</span>
<span class="number"> 101</span>        <span class="k2">}</span>
<span class="number"> 102</span>    <span class="k2">}</span>
<span class="number"> 103</span>    
<span class="number"> 104</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>UnhookWindowsHookEx<span class="k2">(</span>kbHook<span class="k2">)</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_631.html" target="_blank">puts</a> <span class="k2">(</span><span class="s">"Can't remove keyboard hook"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>    <span class="k1">else</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_631.html" target="_blank">puts</a><span class="k2">(</span><span class="s">"Keyboard hook removed successfully"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>    
<span class="number"> 107</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>uevents<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 108</span>        <span class="k1">int</span> lParam<span class="k2">;</span>
<span class="number"> 109</span>        <span class="k1">char</span> keyName<span class="k2">[</span><span class="n">80</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 110</span>    
<span class="number"> 111</span>        <a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>uevents, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>        lParam <span class="k3">=</span> event.user.data4 <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span><span class="k2">;</span>
<span class="number"> 113</span>        GetKeyNameText<span class="k2">(</span>lParam, keyName, <span class="n">80</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>    <span class="c">// Print data: Event type | Timestamp | Windows Virtual Key Code | Windows key name</span>
<span class="number"> 115</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%5d  %d  %d %s\n"</span>, event.type, event.user.data2, event.user.data1, keyName<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 116</span>    <span class="k2">}</span>
<span class="number"> 117</span>    <a href="http://www.allegro.cc/manual/al_destroy_user_event_source"><span class="a">al_destroy_user_event_source</span></a><span class="k2">(</span><span class="k3">&amp;</span>usource<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span><span class="k2">}</span>
</div></div><p>

By using <span class="source-code">PeekMessage<span class="k2">(</span><span class="k2">)</span></span> the Allegro program keeps running normally so it&#39;s responsive to, for example, adding a GUI to start/stop recording input. <span class="source-code">GetMessage<span class="k2">(</span><span class="k2">)</span></span>, on the other hand, waits for a message. Both have it&#39;s pros and cons.</p><p>Some of the fields I&#39;m filling in the user events are redundant; that&#39;s because I&#39;m experimenting.</p><p>Now I want to save the input to a file. I&#39;m planning to simply write the contents of the <span class="source-code">event</span> variable as I go through the user event queue by saving <span class="source-code"><span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a><span class="k2">)</span></span> bytes at a time. Then I should be able to read them back into an <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a></span> variable, right?.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 24 Sep 2011 21:49:48 +0000</pubDate>
	</item>
</rss>
