トップページ⇒tech
1001コメント301KB

Win32API質問箱 Build42

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/04/14(金) 06:09:09
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
0232デフォルトの名無しさん2006/04/22(土) 15:35:22
最近は言語にコントロールが付いてくるのか。
0233デフォルトの名無しさん2006/04/22(土) 15:36:00
>>231
むしろOS/2
02342232006/04/22(土) 17:49:07
>>227
なるほど。ご意見どうもありがとうございます。

>>231
Win32プログラミング歴の長い皆様…という意味っす。
0235デフォルトの名無しさん2006/04/22(土) 21:42:25
現在のキャレットの位置をスクリーン座標で取得したいのですが、
GetCaretPos はキャレットを所有しているウィンドウのクライアント座標しか
返してくれません。キャレットを所有しているウィンドウのハンドルが
分かれば、ClientToScreen でスクリーン座標に変換できるのですが、
そのような関数が見当たりません。どなたか助けてください!
0236デフォルトの名無しさん2006/04/22(土) 22:31:16
GetGUIThreadInfo
0237デフォルトの名無しさん2006/04/22(土) 23:28:20
GetForegroundWindow?
0238デフォルトの名無しさん2006/04/23(日) 00:12:55
SetWindowsHookExでグローバルフックをして
WH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントロール?を探す感じでしょうか?
0239デフォルトの名無しさん2006/04/23(日) 01:29:21
元はキーボードドライバ、とかじゃなくて?
02402382006/04/23(日) 01:45:48
説明足らずですみません。
元は、キーが押された時にフォーカスの当たっていたコントロールということです。
0241デフォルトの名無しさん2006/04/23(日) 01:57:52
209 :デフォルトの名無しさん :2006/04/22(土) 07:52:30
Windowsプログラミング初心者です。
SetWindowsHookExでWH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントローラ?を探す感じでしょうか?
0242デフォルトの名無しさん2006/04/23(日) 01:58:56
>>238
>>236
02432382006/04/23(日) 02:17:47
>>242
この場合、thread idはどこから取得すれば良いのでしょうか?
02442382006/04/23(日) 02:27:36
GetForegroundWindow
↓
GetWindowThreadProcessId
↓
GetGUIThreadInfo

をやって解決しそうです。お騒がせしました。
もしなんかもっとスマートなやり方があったら教えてください。
0245デフォルトの名無しさん2006/04/23(日) 04:37:19
スレッド間で少し長め(WPARAMとかに無理やりキャストできないサイズ)の文字列を
やりとりするには、領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
どっちかのスレッドがこけて解放できなくなるなんてことが普通に起きそうで怖いんですが…
02462452006/04/23(日) 05:35:18
自己解決しました。
0247デフォルトの名無しさん2006/04/23(日) 05:38:52
してませんが…
0248デフォルトの名無しさん2006/04/23(日) 10:17:12
>どっちかのスレッドがこけて解放できなくなるなんてことが普通に起きそうで怖いんですが
んなコード書くほうが悪いだろう。
0249デフォルトの名無しさん2006/04/23(日) 10:24:25
>>245
スレッドの強制終了はNG。
フラグ立ててきっちり終了処理してから死んでくれと頼むのが基本。

その上でそのスレッドが文字列の開放を出来ない理由があるなら
開放の責任をメインスレッドに委ねてしまえばいい。

なんにしても
>領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
これ以外の実装はない。
0250デフォルトの名無しさん2006/04/23(日) 10:42:36
GetFocus()
0251デフォルトの名無しさん2006/04/23(日) 10:49:19
他のアプリから文字を取ってきたりするけど
0252デフォルトの名無しさん2006/04/23(日) 11:33:39
プロセス間のデータ受け渡しで悩むならわかるが
スレッド間で悩む必要なんてなかろうに。
0253デフォルトの名無しさん2006/04/23(日) 19:12:45
動的に確保したメモリを指すポインタを渡した時にどっちに解放責任を持たすかで悩むとか
0254デフォルトの名無しさん2006/04/23(日) 19:16:53
IInterfaceみたいに参照カウンタでもつけたらどうだ?
0255デフォルトの名無しさん2006/04/23(日) 19:17:31
エスパーズが暴走しております
0256デフォルトの名無しさん2006/04/23(日) 19:18:44
MDIでツールバーを作成する方法を教えてください!!!
自分のなかのSDIの知識だけでしたらおかしくなったのでお願いします。
0257デフォルトの名無しさん2006/04/23(日) 19:42:00
MDI ツールバー
0258デフォルトの名無しさん2006/04/23(日) 19:48:36
>>257
参考になりそうなサイトを教えてください(^人^)
0259デフォルトの名無しさん2006/04/23(日) 19:54:53
>>258
http://www.google.co.jp/
0260デフォルトの名無しさん2006/04/23(日) 19:57:31
( ̄Д ̄;) ガーン
0261デフォルトの名無しさん2006/04/23(日) 19:57:39
(^人^)
0262デフォルトの名無しさん2006/04/23(日) 20:23:45
Give Me Toolbar!!!
0263デフォルトの名無しさん2006/04/23(日) 20:42:57
>>262
http://toolbar.yahoo.co.jp/
0264デフォルトの名無しさん2006/04/23(日) 20:57:40
コンソールプログラムを呼び出し、その標準出力をウィンドウが受け取ったりするにはどうすればいいの?
0265デフォルトの名無しさん2006/04/23(日) 21:02:18
>>264
パイプ
0266デフォルトの名無しさん2006/04/23(日) 21:08:09
>>196
CreateFile関数でファイル作成し、
SetFilePointer関数でlDistanceToMoveを0x7FFFFFFF,
dwMoveMethodをFILE_BEGINで実行。
んで、SetEndOfFile関数を使ったら、
連続した領域は確保できそうな気がする。

ただ、CloseHandle関数を実行する前に、
もう一度、SetFilePointer関数とSetEndOfFile関数を使わんと時間がかかるかも。


試してないけどね。
0267デフォルトの名無しさん2006/04/23(日) 21:10:16
>>257
まずはこっから
http://www.codeproject.com/atl/ietoolbartutorial.asp
0268デフォルトの名無しさん2006/04/23(日) 22:10:42
IEのメニューバーのようなツールバーを作ろうとしています。
TrackPopupMenuでメニューを表示しているとき新たに別のサブメニューを表示しなおす場合、
今までのTrackPopupMenu内の処理から抜けなければならないのですがどうするといいでしょうか。
0269デフォルトの名無しさん2006/04/23(日) 22:30:58
>>265
超さんくすこ
0270デフォルトの名無しさん2006/04/23(日) 22:42:59
>>268
抜ければ良いんじゃないのかな
0271デフォルトの名無しさん2006/04/23(日) 22:57:20
MDIでのツールバーはクライアントウィンドウにかくのでしょうか?
02722682006/04/24(月) 00:47:51
>>270
どのようにして抜けたらいいのか分からないのです。。。
TrackPopupMenuがプログラム側に制御を戻す条件ということです。
02732682006/04/24(月) 01:22:06
WM_CANCELMODEを送ったら解決しました。すみません。
02742712006/04/24(月) 02:03:03
どうしてもわかりません。
フレームウィンドウにツールバーを作っても、クライアントウィンドウが上に来て押せなくなります。
だからといってクライアントウィンドウに書いてもウィンドウプロシージャがないために処理が出来ない。

こういった場合はサブクラス化でしょうか?
0275デフォルトの名無しさん2006/04/24(月) 02:09:29
ツールバーの高さを考慮した上でクライアントウィンドウのサイズを調整すべし
02762712006/04/24(月) 02:23:45
>>275
ということはフレームウィンドウにツールバーを置いてということですよね?
一回試したのですが駄目でした。。。
やり方が間違っているのでしょうか?

case WM_SIZE:
   MoveWindow(hClient, 0, 100, LOWORD(lp),HIWORD(lp),TRUE);
SendMessage(hTool, WM_SIZE, wp, lp);
break;
0277デフォルトの名無しさん2006/04/24(月) 03:31:03
case WM_SIZE:
SendMessage(hTool, WM_SIZE, wp, lp);
RECT Rect;
GetClientRect(hTool,&Rect);
MoveWindow(hClient, 0,Rect.bottom,LOWORD(lp),HIWORD(lp)-Rect.bottom,TRUE);
break;

Cはよく分からないんだがこれだとどうなる?
0278デフォルトの名無しさん2006/04/24(月) 06:08:26
FAQだからぐぐったらすぐ見つかると思うよ
0279デフォルトの名無しさん2006/04/24(月) 10:56:01
ISAPIフィルタからASPのアプリケーション変数に
アクセスする方法があったら教えてください。
0280デフォルトの名無しさん2006/04/24(月) 12:09:58
シリアル通信をするのにCreateFileでポートを開け、DCB構造体を
GetCommStateで取得してパラメータを設定、SetCommStateで設定、
という手順で初期化してるんだけど、ボーレートを230400にしよう
とするとうまくいかない。

DCB構造体を使用している限り出来ない、ということは何となく理解
したけど、じゃあどうすればいいの?
0281デフォルトの名無しさん2006/04/24(月) 12:15:40
>>280
まずPCのシリアルポートがその転送速度サポートしてるのか?
普通は115kbpsあたりまでしかサポートしてないと思うが‥‥
0282デフォルトの名無しさん2006/04/24(月) 12:18:20
>>280
GetCommPropertiesで取れなきゃダメなんじゃね?
0283デフォルトの名無しさん2006/04/24(月) 12:25:39
イヤです。
02842802006/04/24(月) 13:27:46
即レスありがとう

>>281
デバイスマネージャから確認したところ、115200,230400,460800,921600を
ドライバ的にはサポートしているっぽい。

>>282
早速GetCommPropertiesを確認してみたところ、
commprop.dwSettableBaudの値は268435456でした。

わからん。。。
0285デフォルトの名無しさん2006/04/24(月) 13:37:17
>>284
見るべきは、dwMaxBaudの方じゃないか?
0286デフォルトの名無しさん2006/04/24(月) 13:39:43
>>284
あと、268435456 = 0x10000000 = BAUD_USERな
02872802006/04/24(月) 13:54:57
>>285
失礼。まちがえてた。dwMaxBaudが268435456。
ちなみにdwSettableBaudは268856176でした。
>>286
なるほど。
つまりこの値ではサポートしているボーレートの上限はわからないのね。

02882762006/04/24(月) 14:04:56
>>277
試してみました
けど、やっぱり結果は同じです。
ツールバーのボタンが見えているのに押せない(..、)
0289デフォルトの名無しさん2006/04/24(月) 14:10:39
>>287
dwSettableBaudはBAUD_なんちゃらのorが入っている。
つまり、268856176だとBAUD_USERが設定可能でBAUD_57600、BAUD_115200...が設定可能と読む。
逆に例えばBAUD_128K、BAUD_56Kが設定できないとわかる。
まぁ、BAUD_USERでの上限はどうやっても判らん訳で。
0290デフォルトの名無しさん2006/04/24(月) 15:35:37
もすかすて、ATコマンドでボーレート設定とか?
0291デフォルトの名無しさん2006/04/24(月) 16:31:12
そりゃModem側の設定だろ
0292デフォルトの名無しさん2006/04/24(月) 17:20:13
>>288
こっちでも同じ質問してるな

http://forums.belution.com/ja/vc/000/358/12.shtml
MDIでツールバーの使い方
02932882006/04/24(月) 18:18:06
>>292
どうしても早くやり方が知りたいので・・・
すみません
0294デフォルトの名無しさん2006/04/24(月) 18:25:33
>>293
The Code Projectが一番勉強になる件
0295デフォルトの名無しさん2006/04/24(月) 19:11:23
レバーコントロールのバンドのタイトルを「(&D)」などとしても下線がつかなかったのですが
どうするとつけることができますか?
0296デフォルトの名無しさん2006/04/24(月) 21:20:30
誰かNetMeetingのAPIを使って
簡単なサンプルを書いてくれ。
02972882006/04/25(火) 01:28:16
>>277さん、原因がわかりました。
WM_SIZEの処理をしたあとにbreakをしていたのがまずかったです。
つまりその処理の後にデフォルトプロシージャの処理をしてしまっていました。
return 0;に直したら動きました。
0298デフォルトの名無しさん2006/04/25(火) 06:36:18
>>296
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnnetmt/htm/netmtgcom.asp
0299デフォルトの名無しさん2006/04/25(火) 10:48:00
WriteFileExの成功の判断の方法で質問があります。

MSDN
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_writefileex.htm
に
=======
関数が成功すると、0 以外の値が返ります。
=======
WriteFileEx 関数を使う場合、この関数が「成功」を示す値を返していても、それだけでは不十分です。GetLastError 関数を呼び出して、いくつかの条件が「成功」しているだけで、把握するべき他の条件がエラーになっていないかどうかをチェックしてください。=======
とあります。

ここでCreateFile,WriteFileEx,CloseHandleの一連の操作を行うテスト・プログラムにおいて,WriteFileExの戻り値が1になっています。処理は正しく行われています。

しかし,MSDNに関数が成功(0以外の値)のときだけでは不十分との記述があったので念のためGetLastErrorを呼び出すと値が6(ERROR_INVALID_HANDLE)でした。Closeが正常なのでハンドルが無効とは考えにくいです。

とすると関数が1(成功)返し,GetLastErrorがERROR_SUCESSを返さない場合はどう判断すればいいのでしょうか?
0300デフォルトの名無しさん2006/04/25(火) 12:25:38
>>299
GetLastError()は最後に発生したエラーのコードを返す。
6(ERROR_INVALID_HANDLE)のコードが、
WriteFileEx()の呼び出しで設定されたかどうかを判断すべき。
0301デフォルトの名無しさん2006/04/25(火) 12:34:35
>>299
GetLastError が ERROR_SUCCESS を返すこと確認するのではなく、
関数が 1 を返すが、アプリ側でさらに処理が必要なケース
(例えば ERROR_MORE_DATA ) について必要な処理を行うようにしてください。

関数が 1 を返し、GetLastError が ERROR_SUCCESS を返すのは、
書き込みが(なぜか)同期的に完了し、コンプリーションルーチンは呼ばれない
ということを示しています(これは0バイトの書き込み以外では珍しいケースです)。
これは成功というより例外的な結果で、アプリが期待しているようにコンプリーション
ルーチンが呼ばれないため、何か特別な対応をする必要が(たぶん)あるでしょう。
(自分で呼ぶとか)。

・・・「例えば」とありますが、ERROR_MORE_DATAとERROR_SUCCESSの2つ以外の
どんな値に対応する必要があるのかは謎です。たぶんこの2つだけでOKなのでしょう。
0302デフォルトの名無しさん2006/04/25(火) 12:42:43
>>299
WriteFileExって非同期で書き込みオーダーを出してるだけなんじゃね?
OVERLAPPEDがあるから、FDなど遅い媒体への書き込みとか試してみた?
0303デフォルトの名無しさん2006/04/25(火) 12:43:43
>>299
まずは、(Exのついていない)WriteFile()を使って非同期書き込みを行うプログラムを書いて見ることを強く勧める。
そうすれば、「WriteFileEx 関数を使う場合、この関数が「成功」を示す値を返していても、それだけでは不十分です。」
の意味が理解できると思う。

>>300のコメントにあるようにWriteFileExが非0を返したあとにGetLastErrorを呼んでも無意味。
GetOverlappedResultが0を返したとき、GetLastErrorを使う。
0304デフォルトの名無しさん2006/04/25(火) 13:09:11
横から>>301に補足
>関数が 1 を返すが〜
戻り値の型がBOOLやbool値の関数の成否を確認する際は
TRUE/trueとの比較はせず、FALSE/falseと比較にしませう
0305デフォルトの名無しさん2006/04/25(火) 14:19:07
誘導されてきました。質問です。
エクスプローラみたいなものを作っていて、縮小版表示アイコンを表示させたいです。
画像のサムネイル表示は出来ましたが、画像以外ファイルのアイコンで
エクスプローラで表示されているような
黒枠の中に小さいアイコンがぽつんとあるアイコンが取れません。
32*32のアイコンを引き伸ばして表示することは現在可能です。
IExtractImage, IExtractIcon, SHGetFileInfoなどつかいましたが同じ状況です。
開発環境はWin2000, VC++6.0です。

また、IExtractImageで取得・表示しているサムネイル画像ですが、
Win2000だと表示できるのに、WinXPだと表示できない画像がまれにあります。
IExtractImageで取得したBitmapをImageListに追加するときに
エラーが起こっているようです。XPでコンパイルしてもダメでした。
このような現象になったことがあるかたいらっしゃいませんか?
0306デフォルトの名無しさん2006/04/25(火) 14:26:37
激しくスレ違いで、大変申し訳ないでつが、
GIF8ビット深さのファイルの(PixelFormat.Format8bppIndexed)
各ピクセルの色を表現するには、0〜255の数字によりますよね。
0が黒で、
1が__色で、
2が__色で、
・
・
・
GIF256色の一覧表って、どのサイトに掲載されているか
教えていただけませんか?かなり困ってます・・・くぅ〜
(探したのですが、僕の探し能力ではみつかりませんでした)
0307デフォルトの名無しさん2006/04/25(火) 14:29:36
ファイルの中にカラーテーブル持ってる
03083062006/04/25(火) 14:30:56
>>307
いま、307がものすごくいいこといった!!
そこをもっと詳しく・・・(・д・)
0309デフォルトの名無しさん2006/04/25(火) 14:32:28
なんか .NET っぽいな。
Image に Palette プロパティがあるだろ。
03103062006/04/25(火) 14:34:50
>>309
どうして.Netだとすぐばれる・・・○rz

Bitmap bitmap1=new Bitmap(fs);
fs.close();

bitmap1.Palette・・・ほんとだ、それらしいのありました。



ってことは、ビットマップインスタンスを
ロックビットして、unsafeでバイト配列を観察していく
方法はだめだったのか・・・くぅ
0311デフォルトの名無しさん2006/04/25(火) 14:35:34
つーか、0が黒とは限らないしそもそもAPIに関係ないだろ。
03123062006/04/25(火) 14:36:44
>>311
>>つーか、0が黒とは限らないし
いま、311がものすごくいいこといった!!!

>>311
>>そもそもry


306 :デフォルトの名無しさん :2006/04/25(火) 14:26:37
激しくスレ違いで、大変申し訳ないでつが、

03133062006/04/25(火) 14:40:21
ってことはbitmapインスタンスをLockBitsして
1バイトごと順番に観察していくだけでは、
画像の中に赤いピクセルがあるかないか、それすらわからないのですか!!
くはっ今までの苦労はなんだったのか・・・
03143062006/04/25(火) 14:53:48
http://i-bbs.sijex.net/imageDisp.jsp?id=ups2&file=1145944407661o.gif

これ、か・・・。くぅ。
0315デフォルトの名無しさん2006/04/25(火) 15:01:09
いい加減黙れスレ違い野郎うぜぇ
03163062006/04/25(火) 15:09:57
byte byWhite=255;
byte byBlack=255;
for (int i = 0; i < 256; i++)
{
//白を見つけたら、
if (bitmap1.Palette.Entries[i].R == 255 && bitmap1.Palette.Entries[i].G == 255 && bitmap1.Palette.Entries[i].B == 255)
{
byWhite = (byte)i;
break;
}
}
for (int i = 0; i < 256; i++)
{
//黒を見つけたら、
if (bitmap1.Palette.Entries[i].R == 0 && bitmap1.Palette.Entries[i].G == 0 && bitmap1.Palette.Entries[i].B == 0)
{
byBlack = (byte)i;
break;
}
}
if (byWhite == 255 || byBlack == 255)
{
return false;
}

ご迷惑おかけしました。
無事、解決することができましたことをご報告申し上げます。

皆さん、ありがとうございました。とても助かりました。
0317デフォルトの名無しさん2006/04/25(火) 15:55:28
プログラム側から、ツールバーのボタンを押したというメッセージを送るにはどうしたらいいのでしょうか?
0318デフォルトの名無しさん2006/04/25(火) 16:10:40
そういうメッセージをSendMessageなりPostMessageなりすればいい
0319デフォルトの名無しさん2006/04/25(火) 16:30:00
ContextSwitchDeadlockって何ですか?
デバッグ中に凍ったと思ったら、こんなの表示されたよ
0320デフォルトの名無しさん2006/04/25(火) 16:47:04
306によって質問が流された>305です。
どなたかわかる方がいたらお願いします。

>319
ぐぐったらなんか出てきたけどこれとは違うの?
0321デフォルトの名無しさん2006/04/25(火) 16:58:34
306を頃すAPIを教えてください
0322デフォルトの名無しさん2006/04/25(火) 17:10:41
299です。

>>300さん
はい。これは実験しました。で,結果ですがわすれちゃった(笑)。CreateFileの直後は0ですがWriteFileExの直後で6になっているのでWriteFileExで設定していると判断した記憶があります。

>>301さん
はい。どうもそれが正解のようです。ありがとうございました。

>>302さん
試していません。って言うか,実はWriteFileExとWriteFileの処理時間を比較していたのです。

>>303さん
WriteFileExとWriteFileの差を見ていたのですが,WriteFileで非同期の書き込みの実験はしていませんでした。意味はまだ理解できていませんが,おれ的には301さんの発言が正解のような気がしています。

GetOverlappedResult なんて関数があったんですね! WriteFileExばかり見ていたので気がつきませんでした(WriteFileExからはリンクがない)。でもWriteFileExで使えるとは書いてありません。要実験ですね。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getoverlappedresult.htm

Win32APIって何でも実験なんだなぁ…。初心者にはきつい。

>>304さん
はい。そうですね。TUREとしては0以外と定義されているので1を返す関数と0xFFFFFFFFを返す関数があるようです。
0323デフォルトの名無しさん2006/04/25(火) 17:45:56
305です。
二つ目の項目は自己解決しました。
GetLocationのフラグにあったIEIFLAG_ORIGSIZEをはずしたらOKでした。
0324デフォルトの名無しさん2006/04/25(火) 18:14:59
>>322
しかし、WriteFileExで、
OVERLAPPED構造体のリンクが外してあるのはヒドイよな。
WriteFile→WriteFile(非同期)→WriteFileExの順でやらんとピンとこんかもね。
03253202006/04/25(火) 18:31:57
ぐぐたーけど、全部英語よってに・・。
03263202006/04/25(火) 19:26:30
教えて、えろい人。
03273192006/04/25(火) 19:28:02
ごめんなさい、325と326は、319でした。
0328デフォルトの名無しさん2006/04/25(火) 19:38:09
>>306
どうでもいいけどパレットエントリ中に白があるからといって画像中に白がある保証はない罠。
0329デフォルトの名無しさん2006/04/25(火) 19:45:16
>>327
日本語のページを検索
0330デフォルトの名無しさん2006/04/25(火) 20:19:41
誰か教えて!!
ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=2113781
0331デフォルトの名無しさん2006/04/25(火) 20:21:21
> 親子関係がよくわからなくなると思うのですが

お前が無能だからだな
■ このスレッドは過去ログ倉庫に格納されています