<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TAKABO SOFT&#187; カテゴリー「Win32 API」｜TAKABO SOFT</title>
	<atom:link href="http://takabosoft.com/category/win32api/feed" rel="self" type="application/rss+xml" />
	<link>http://takabosoft.com</link>
	<description>ドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。</description>
	<lastBuildDate>Wed, 04 Apr 2012 14:30:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>(Win32API) キーコードからキー名取得</title>
		<link>http://takabosoft.com/20100614223356.html</link>
		<comments>http://takabosoft.com/20100614223356.html#comments</comments>
		<pubDate>Mon, 14 Jun 2010 13:33:56 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20100614223356.html</guid>
		<description><![CDATA[ショートカットキーやホットキー、それからゲーム操作のカスタマイズ時にキー名を表示する事があると思いますが、キーコードからキー名を取得する方法をご紹介。
TCHAR szBuf[128];
UINT nScanCode = [...]]]></description>
			<content:encoded><![CDATA[<p>ショートカットキーやホットキー、それからゲーム操作のカスタマイズ時にキー名を表示する事があると思いますが、キーコードからキー名を取得する方法をご紹介。</p>
<pre class="brush: cpp;">TCHAR szBuf[128];
UINT nScanCode = MapVirtualKey(btKeyCode, 0);
if (nScanCode) {
	switch (btKeyCode) {
	case VK_LEFT:
	case VK_UP:
	case VK_RIGHT:
	case VK_DOWN:
	case VK_PRIOR:
	case VK_NEXT:
	case VK_END:
	case VK_HOME:
	case VK_INSERT:
	case VK_DELETE:
	case VK_DIVIDE:
	case VK_NUMLOCK:
		nScanCode |= 0x100;
		break;
	}
	if (GetKeyNameText(nScanCode &lt;&lt; 16, szBuf, sizeof(szBuf))) {
		// szBufにキー名が入る
	}
}</pre>
<p>日本のサイトで方法を紹介されているページも有ったのですが、Homeキー等一部のキー名の取得がうまく行っていませんでした。<br />
海外のサイトに解決策が載っていたので、そこから一部拝借してみました。<br />
たぶんこれで良いと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20100614223356.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SW シンセサイザの音量・ミュートをプログラムで制御</title>
		<link>http://takabosoft.com/20100217172927.html</link>
		<comments>http://takabosoft.com/20100217172927.html#comments</comments>
		<pubDate>Wed, 17 Feb 2010 08:29:27 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20100217172927.html</guid>
		<description><![CDATA[音量（パンポット）はmidiOutSetVolumeを使えばあっという間に設定できるのですが、
これだとミュートチェックは外してくれません。
というわけでこちら（http://www.terra.dti.ne.jp/~v [...]]]></description>
			<content:encoded><![CDATA[<p>音量（パンポット）はmidiOutSetVolumeを使えばあっという間に設定できるのですが、<br />
これだとミュートチェックは外してくれません。</p>
<p>というわけでこちら（<a href="http://www.terra.dti.ne.jp/~vivas/delphi/mixerapi.html">http://www.terra.dti.ne.jp/~vivas/delphi/mixerapi.html</a>）のサイト様の説明を参考にさせて頂きながらミキサーAPIを使ってミュートを解除するコードを書いてみました。</p>
<pre class="brush: cpp;">MIXERLINE MixerLine = {sizeof(MIXERLINE)};
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (mixerGetLineInfo((HMIXEROBJ)nDevID, &amp;amp;MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
	MIXERCONTROL Ctrl;
	MIXERLINECONTROLS Ctrls = {sizeof(MIXERLINECONTROLS), MixerLine.dwLineID};
	Ctrls.cControls = 1;
	Ctrls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
	Ctrls.cbmxctrl = sizeof(MIXERCONTROL);
	Ctrls.pamxctrl = &amp;amp;Ctrl;
	if (mixerGetLineControls((HMIXEROBJ)nDevID, &amp;amp;Ctrls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
		MIXERCONTROLDETAILS Details = {sizeof(MIXERCONTROLDETAILS)};
		Details.dwControlID = Ctrl.dwControlID;
		Details.cChannels = 1;	// 決めうちで良いらしい
		MIXERCONTROLDETAILS_BOOLEAN Boolean = {0};
		Details.paDetails = &amp;amp;Boolean;
		Details.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
		if (mixerSetControlDetails((HMIXEROBJ)nDevID, &amp;amp;Details, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
			// 成功
		}
	}
}</pre>
<p>この制御をDominoに組み込めば「音が鳴らない！」と助けを求める方が激減する予感。</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20100217172927.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DirectShow Editing Service (DES)　とVisual Studioは相性悪い？</title>
		<link>http://takabosoft.com/20100112115711.html</link>
		<comments>http://takabosoft.com/20100112115711.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 02:57:11 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://takabosoft.com/?p=994</guid>
		<description><![CDATA[DirectShowの動画編集機能（DES）を使っていろいろ実験していたところ、
アルファブレンディングがどうにも上手く行かなかった。
http://msdn.microsoft.com/ja-jp/library/cc [...]]]></description>
			<content:encoded><![CDATA[<p>DirectShowの動画編集機能（DES）を使っていろいろ実験していたところ、<br />
アルファブレンディングがどうにも上手く行かなかった。</p>
<p><a href="http://msdn.microsoft.com/ja-jp/library/cc352035.aspx">http://msdn.microsoft.com/ja-jp/library/cc352035.aspx</a></p>
<p>ちゃんとやったつもりが、動画プレビュー時に何故かアプリが何事もなかったかのように終了してしまう（例外なども無し）。<br />
各関数のエラー値を見たりエラーログ出力機能を使ったりしても原因を特定できず・・・。</p>
<p>ふと、コンパイルしたEXEをエクスプローラ上から起動してみたら上手く起動できましたorz<br />
なんですかこれ、Vsual Studioの「デバッグの停止」が誤爆してるんだろうか？？</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20100112115711.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VC, MFCでグラデーションを描画するには</title>
		<link>http://takabosoft.com/20091104163953.html</link>
		<comments>http://takabosoft.com/20091104163953.html#comments</comments>
		<pubDate>Wed, 04 Nov 2009 07:39:53 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/?p=974</guid>
		<description><![CDATA[GradientFill APIのラッパー関数を作ってみました。
と言っても縦のグラデしか対応させていませんが。
void FillGrad(CDC* pDC, CRect rc, COLORREF colBegin,  [...]]]></description>
			<content:encoded><![CDATA[<p>GradientFill APIのラッパー関数を作ってみました。<br />
と言っても縦のグラデしか対応させていませんが。</p>
<pre class="brush: cpp;">void FillGrad(CDC* pDC, CRect rc, COLORREF colBegin, COLORREF colEnd)
{
	TRIVERTEX av[2] = {
		rc.left, rc.top, GetRValue(colBegin) &lt;&lt; 8, GetGValue(colBegin) &lt;&lt; 8, GetBValue(colBegin) &lt;&lt; 8, 0xff00,
		rc.right, rc.bottom, GetRValue(colEnd) &lt;&lt; 8, GetGValue(colEnd) &lt;&lt; 8, GetBValue(colEnd) &lt;&lt; 8, 0xff00,
	};
	GRADIENT_RECT gr = {0, 1};
	GradientFill(pDC-&gt;GetSafeHdc(), av, 2, &amp;gr, 1, GRADIENT_FILL_RECT_V);
}</pre>
<p>GradientFill APIは古いOSでは動きませんのでご注意ください。</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20091104163953.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Win32API)WritePrivateProfileStringは高機能</title>
		<link>http://takabosoft.com/20090816002525.html</link>
		<comments>http://takabosoft.com/20090816002525.html#comments</comments>
		<pubDate>Sat, 15 Aug 2009 15:25:25 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20090816002525.html</guid>
		<description><![CDATA[Microsoftは設定データなどをレジストリへ保存する事を推奨しているぽいですが、結構嫌がるユーザーさんが多いので私のソフトではiniファイルへ書き出すことが多いわけなのですが、久々にWritePrivateProfi [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoftは設定データなどをレジストリへ保存する事を推奨しているぽいですが、結構嫌がるユーザーさんが多いので私のソフトではiniファイルへ書き出すことが多いわけなのですが、久々にWritePrivateProfileString APIを調べていたら、やれば出来る子という事が判明しました。</p>
<p>APIの名前から機能を「文字列をiniファイルに書き出す」だけだと勝手に思いこんでいたのですが、引数の渡し方によってはキーを削除したり、セクションを削除したりできるようです。<br />
（こういうのは削除専用のAPIを別途作った方が使い手は判りやすいと思うんですが。）</p>
<p>また、ユニコード版(WritePrivateProfileStringW)は、ユニコードのまま文字列を書き出せるという事も判明。<br />
ただし、iniファイルがユニコードファイルである必要があります。<br />
なので、iniファイルが存在していなかったら、BOM（バイトオーダーマーク）だけのファイルを生成した上でWritePrivateProfileStringWを実行すれば良さそうです（ファイルが無い状態でWritePrivateProfileStringWを呼ぶとShiftJisに変換されてしまうようです）。</p>
<p>こんな感じかな。</p>
<pre class="brush: cpp;">
CString strIniPath = iniファイルのパス
if (!::PathFileExists(strIniPath)) {
	CFile file;
	if (file.Open(strIniPath, CFile::modeWrite | CFile::modeCreate | CFile::shareExclusive)) {
		BYTE bom[2] = {0xff, 0xfe};
		file.Write(bom, 2);
		file.Close();
	}
}
::WritePrivateProfileString(_T(&quot;Test&quot;), _T(&quot;Test&quot;), strUnicode, strIniPath);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20090816002525.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Win32API) ちょっとした効果音を再生するには</title>
		<link>http://takabosoft.com/20090602223545.html</link>
		<comments>http://takabosoft.com/20090602223545.html#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:35:45 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20090602223545.html</guid>
		<description><![CDATA[DirectSoundを使うまでもない音の再生は
sndPlaySound API
http://msdn.microsoft.com/ja-jp/library/cc428790.aspx
もしくは
PlaySound [...]]]></description>
			<content:encoded><![CDATA[<p>DirectSoundを使うまでもない音の再生は<br />
sndPlaySound API<br />
<a href="http://msdn.microsoft.com/ja-jp/library/cc428790.aspx">http://msdn.microsoft.com/ja-jp/library/cc428790.aspx</a><br />
もしくは<br />
PlaySound API<br />
<a href="http://msdn.microsoft.com/ja-jp/library/cc428768.aspx">http://msdn.microsoft.com/ja-jp/library/cc428768.aspx</a><br />
を使う。</p>
<p>たしか複数再生が出来ないといった制限があったはずですが、ちょっとした効果音を鳴らすにはこれで足りるかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20090602223545.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GDI+ (gdiplus)</title>
		<link>http://takabosoft.com/20080504135536.html</link>
		<comments>http://takabosoft.com/20080504135536.html#comments</comments>
		<pubDate>Sun, 04 May 2008 04:55:36 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20080504135536.html</guid>
		<description><![CDATA[GDI＋はAquaMakerでも使っているWindows標準（拡張？）のグラフィックス機能でして、最近趣味でも仕事でもちょくちょく使ってみたりしているのですが、メリットが非常に多い反面、デメリットも結構あるので、その辺の [...]]]></description>
			<content:encoded><![CDATA[<p>GDI＋はAquaMakerでも使っているWindows標準（拡張？）のグラフィックス機能でして、最近趣味でも仕事でもちょくちょく使ってみたりしているのですが、メリットが非常に多い反面、デメリットも結構あるので、その辺の情報を載せてみたいと思います。</p>
<h4>描画速度が遅い</h4>
<p>これが一番ネックで、実際に採用されにくくなっている気がします。<br />
DrawImageで画像を転送するだけでも遅いので残念です。<br />
オフスクリーン同士で拡大縮小回転などを一切行わない場合はLockBitsだかでメモリをロックしてmemcpyなどでメモリをコピーした方が速いこともあります。</p>
<p>画像の拡大縮小の描画の際、補間モードを指定出来るのですが、速度の速いバイリニア方式（InterpolationModeBilinear）を使った際、初回縮小描画時は高品質・低速な描画で、いったん拡大描画や回転描画を行うと低品質・高速な描画が行われるようになったりして安定しません。<br />
（良い回避策はなさそうな予感）</p>
<p> </p>
<h4>メタファイル(WMF,EMF)の描画でアンチエイリアスが掛からない</h4>
<p>GDI+の線描画機能などはアンチエイリアスを掛けられるのですが、その設定をしていてもメタファイル描画の際にはアンチエイリアスが掛かりません。<br />
他の描画は全て綺麗なのに、メタファイルだけはジャギーが目立つので非常に残念な結果になります。</p>
<p>ただ、これは一応対策がありまして、メタファイルを解析してGDI+の描画機能を使ってアンチエイリアスオンの状態で描画し、それをEMF+形式（？）に記録（保存）すれば、今度はそのEMF+形式を読み込んで描画したときには、アンチエイリアスオンの状態で描画が行われます。<br />
（一度コンバータのようなものを作ってしまえばOKです）</p>
<p>GDI+にはメタファイルに記録されている命令を列挙する関数がありますので、その辺を使えばなんとか実現できます。</p>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20080504135536.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>現在のキー状態を取得する</title>
		<link>http://takabosoft.com/20011216175404.html</link>
		<comments>http://takabosoft.com/20011216175404.html#comments</comments>
		<pubDate>Sun, 16 Dec 2001 08:54:04 +0000</pubDate>
		<dc:creator>takabosoft</dc:creator>
				<category><![CDATA[ProgrammingTips]]></category>
		<category><![CDATA[Win32 API]]></category>

		<guid isPermaLink="false">http://takabosoft.com/20011216175404.html</guid>
		<description><![CDATA[何かアクションが起こった際（例えばマウスクリック時）に、キーボードが押されているかどうかを判定したい場合があります（シフトキー等）。
そんな時には「GetKeyState関数」を使います。
押されていると、SHORT型の [...]]]></description>
			<content:encoded><![CDATA[<p>何かアクションが起こった際（例えばマウスクリック時）に、キーボードが押されているかどうかを判定したい場合があります（シフトキー等）。</p>
<p>そんな時には「<b>GetKeyState関数</b>」を使います。</p>
<p>押されていると、SHORT型の最上位ビットが１になります。</p>
<p>最下位ビットが1のときはキーがトグル状態にあることを、0のときはトグルが解除されていることを示します。</p>
<pre class="brush: cpp;">
//シフトキーの判定例（&amp; 0x80でも良いみたい）
if(GetKeyState(VK_SHIFT) &amp; 0x8000){
	//処理
}
</pre>
<p>ちなみに、シフトやコントロールキーと言ったキーはマクロで定義されていますが（VK_SHIFT等）、<br />
通常の「A」や「B」と言ったキーは定義されていません。これらのキーは、キーコードを指定しれやれば良いです。</p>
<pre class="brush: cpp;">
if(GetKeyState('A') &amp; 0x8000){
	//処理
}
</pre>
<p>同時に全キー状態を取得したい場合には、「<b>GetKeyboardState関数</b>」を使います。<br />
この関数は、256バイトの配列を引き渡してやると、そこへ各キーの状態を詰め込んでくれます。</p>
<p>こちらも、最上位ビットが1の場合は押されているという事になります。</p>
<pre class="brush: cpp;">
BYTE KeyState[256];
GetKeyboardState(KeyState);

//シフトキー判定例
if(KeyState[VK_SHIFT] &amp; 0x80){
	//処理
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://takabosoft.com/20011216175404.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

