<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tasten aus Konfigurationsdatei auslesen und verarbeiten]]></title><description><![CDATA[<p>Ich möchte aus einer Konfigurationsdatei verschiedene Tasten auslesen und mit GetAsyncKeyState innerhalb des Programs überprüfen, wann diese gedrückt werden. Das Problem ist nun, dass GetAsyncKeyState als ersten und einzigen Parameter int erwartet, was die Sache kompliziert macht, da ich lieber die Definitionen wie z.B. VK_NUMPAD0 in der Konfigurationsdatei benutzen möchte. Ich könnte natürlich ganz einfach 0x60 (NUMPAD0) mit GetPrivateProfileInt auslesen, aber das ist eher weniger aufschlussreich.</p>
<p>Die einzige und bestimmt uneleganteste Lösung, die mir auf Anhieb einfällt ist, die Einträge mit GetPrivateProfileString auszulesen und dann nacheinander abzugleichen.</p>
<pre><code class="language-cpp">[Keys]
Close = VK_NUMPAD0
</code></pre>
<pre><code class="language-cpp">int closekey = 0;
void readini()
{
	std::string str(50, 0); 
	GetPrivateProfileString(&quot;Keys&quot;, &quot;Close&quot;, &quot;VK_NUMPAD0&quot;, (char*)str.c_str(), 50, &quot;keys.ini&quot;);
	if(str == &quot;VK_NUMPAD0&quot;)
		closekey = 0x60;
	else if(str == &quot;VK_NUMPAD1&quot;)
		closekey = 0x61;
	//else if ..............
}

int Main()
{
	if(closekey != 0)
	{
		if (GetKeyState(closekey) &amp; 0x8000)
			CloseWindow();
	}
}
</code></pre>
<p>Das würde zwar funktionieren, aber so würde ich das niemals benutzen. Da gibt es bestimmt elegantere Lösungen, auch wenn mir das nicht ganz so einfach zu sein scheint. Ich bin für jede Hilfe dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244280/tasten-aus-konfigurationsdatei-auslesen-und-verarbeiten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:08:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244280.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Jun 2009 23:25:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sat, 27 Jun 2009 23:25:40 GMT]]></title><description><![CDATA[<p>Ich möchte aus einer Konfigurationsdatei verschiedene Tasten auslesen und mit GetAsyncKeyState innerhalb des Programs überprüfen, wann diese gedrückt werden. Das Problem ist nun, dass GetAsyncKeyState als ersten und einzigen Parameter int erwartet, was die Sache kompliziert macht, da ich lieber die Definitionen wie z.B. VK_NUMPAD0 in der Konfigurationsdatei benutzen möchte. Ich könnte natürlich ganz einfach 0x60 (NUMPAD0) mit GetPrivateProfileInt auslesen, aber das ist eher weniger aufschlussreich.</p>
<p>Die einzige und bestimmt uneleganteste Lösung, die mir auf Anhieb einfällt ist, die Einträge mit GetPrivateProfileString auszulesen und dann nacheinander abzugleichen.</p>
<pre><code class="language-cpp">[Keys]
Close = VK_NUMPAD0
</code></pre>
<pre><code class="language-cpp">int closekey = 0;
void readini()
{
	std::string str(50, 0); 
	GetPrivateProfileString(&quot;Keys&quot;, &quot;Close&quot;, &quot;VK_NUMPAD0&quot;, (char*)str.c_str(), 50, &quot;keys.ini&quot;);
	if(str == &quot;VK_NUMPAD0&quot;)
		closekey = 0x60;
	else if(str == &quot;VK_NUMPAD1&quot;)
		closekey = 0x61;
	//else if ..............
}

int Main()
{
	if(closekey != 0)
	{
		if (GetKeyState(closekey) &amp; 0x8000)
			CloseWindow();
	}
}
</code></pre>
<p>Das würde zwar funktionieren, aber so würde ich das niemals benutzen. Da gibt es bestimmt elegantere Lösungen, auch wenn mir das nicht ganz so einfach zu sein scheint. Ich bin für jede Hilfe dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733872</guid><dc:creator><![CDATA[Talin]]></dc:creator><pubDate>Sat, 27 Jun 2009 23:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 00:15:06 GMT]]></title><description><![CDATA[<p>Die Lösung ist nciht schlecht, irgendwie mußt du ja auch die Codes in die richtigen übersetzen. Das einzige was mir noch einfallen würde als alternative Lösung wäre die Buchstaben zusammenzurechnen und dann einen switch zu verwenden, also etwa so:</p>
<pre><code class="language-cpp">void readin()
{
    char/string str=GetPrivateProfileString(...);
    int stringvalue;
    for(int i=0;i&lt;stringsize;++i)
    {
        stringvalue+=string[i];
    };
    switch(stringvalue)
    {};
};
</code></pre>
<p>Hier müsstest du nur einmal die Werte ausrechnen und dann ggf in den cases nochmal mit if arbeiten, da es sicher mehr als einen Code gibt der den selben Zahlenwert hat. Inwiefern allerdings diese Variante schneller ist als if/else if wenn man von über 100 möglichen Codes ausgeht weis ich nicht.</p>
<p>Allgemein solltest du bei so eienr config aber auch bedenken das sie normalerweise nur 1x beim start ausgelesen wird und somit ein kleines bischen Zeit dafür durchaus vertretbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733878</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 28 Jun 2009 00:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 00:25:33 GMT]]></title><description><![CDATA[<p>[quMir kommt da in erster Linie eine map in den Sinn, vor allem wenn es um noch mehr Keys der WinAPI geht (also nicht nur VK_NUMPADX). Etwa so:</p>
<pre><code class="language-cpp">#include &lt;string&gt;                   // Für std::string
#include &lt;map&gt;                      // Für std::map
#include &lt;boost/assign/list_of.hpp&gt; // Für die coole Initialisierung

void readini()
{
    static const std::map&lt;std::string,int&gt; mapping = boost::assign::map_list_of
      (&quot;VK_NUMPAD0&quot;, VK_NUMPAD0)
      (&quot;VK_NUMPAD1&quot;, VK_NUMPAD1)
      (...)
      (&quot;VK_ESCAPE&quot;, VK_ESCAPE)
    ;

    char str[50] = {0};
    GetPrivateProfileString(&quot;Keys&quot;, &quot;Close&quot;, &quot;VK_NUMPAD0&quot;, str, 50, &quot;keys.ini&quot;);

    std::map&lt;std::string,int&gt;::iterator pos = mapping.find( str );
    if ( pos != mapping.end() )
        closekey = pos-&gt;second;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1733882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733882</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 28 Jun 2009 00:25:33 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 00:29:16 GMT]]></title><description><![CDATA[<p>An die Map hatte ich garnicht gedacht, die dürfte die schnellste Variante sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733886</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 28 Jun 2009 00:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 19:56:51 GMT]]></title><description><![CDATA[<p>Map war genau das, was ich gesucht habe. Da ich kein Boost benutze, habe ich es nun wie folgt gelöst:</p>
<pre><code class="language-cpp">typedef std::map&lt;std::string, int&gt; TStrIntMap;
typedef std::pair&lt;std::string, int&gt; TStrIntPair;

int closekey;
int GetKeyValue(std::string ConfStr)
{
	TStrIntMap tMap;

	tMap.insert(TStrIntPair(&quot;VK_NUMPAD0&quot;, VK_NUMPAD0));
	tMap.insert(TStrIntPair(&quot;VK_NUMPAD1&quot;, VK_NUMPAD1));

	TStrIntMap::iterator p;
	for(p = tMap.begin(); p != tMap.end(); ++p)
	{
		std::string strKey;
		strKey = p-&gt;first;
		if( ConfStr  == strKey)
		{
			return p-&gt;second;
		}
	}
	return 0;
}

void SetKeyValues()
{
	char str[50] = {0};
    GetPrivateProfileStringA(&quot;Keys&quot;, &quot;Close&quot;, &quot;VK_NUMPAD0&quot;, str, 50, szIniFile);

	int keyvalue = GetKeyValue(str);
	if(keyvalue != 0)
		closekey = keyvalue;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1734245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734245</guid><dc:creator><![CDATA[Talin]]></dc:creator><pubDate>Sun, 28 Jun 2009 19:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 20:34:14 GMT]]></title><description><![CDATA[<p>Erstmal entschuldige ich mich für den Doppelpost, aber bis jetzt bin ich noch nicht dazu gekommen, mich zu anzumelden. Also, nun zu meiner nächsten Frage. Ich habe mir den Code von Badestrand nochmals genauer angeschaut und gesehen, dass man das Ganze ohne For-Schleife lösen kann, dann nämlich mit &quot;find&quot;. Diese Variante scheint mir besser zu sein. Stimmt das oder liege ich mit meiner Vermutung falsch? Wenn ich mir die Codes genauer ansehen, dann könnte ich mir sogar vorstellen, dass der erste Code ungefähr dasselbe macht wie der zweite, nur dass er letztendlich kürzer ist.</p>
<pre><code class="language-cpp">TStrIntMap::iterator p = tMap.find(ConfStr);
	if(p != tMap.end() )
		return p-&gt;second;
</code></pre>
<pre><code class="language-cpp">TStrIntMap::iterator p;
	for(p = tMap.begin(); p != tMap.end(); ++p)
	{
		std::string strKey;
		strKey = p-&gt;first;
		if( ConfStr  == strKey)
		{
			return p-&gt;second;
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1734259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734259</guid><dc:creator><![CDATA[Talin]]></dc:creator><pubDate>Sun, 28 Jun 2009 20:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Tasten aus Konfigurationsdatei auslesen und verarbeiten on Sun, 28 Jun 2009 20:38:49 GMT]]></title><description><![CDATA[<p>Talin schrieb:</p>
<blockquote>
<p>Wenn ich mir die Codes genauer ansehen, dann könnte ich mir sogar vorstellen, dass der erste Code ungefähr dasselbe macht wie der zweite, nur dass er letztendlich kürzer ist.</p>
</blockquote>
<p>Nicht nur das, er dürfte auch schneller sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Die std::map-Klasse ist oft als <a href="http://de.wikipedia.org/wiki/Bin%C3%A4rer_Baum" rel="nofollow">binärer Baum</a> implementiert um das Finden schnell zu machen.</p>
<p>Oh, und <code>tMap.insert(TStrIntPair(&quot;VK_NUMPAD0&quot;, VK_NUMPAD0));</code> lässt sich auch kürzer schreiben mit <code>tMap[&quot;VK_NUMPAD0&quot;] = VK_NUMPAD0;</code> (diesmal aber ohne Geschwindigkeitsunterschied).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734263</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 28 Jun 2009 20:38:49 GMT</pubDate></item></channel></rss>