Win32API質問箱 Build42
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/04/14(金) 06:09:09やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
0232デフォルトの名無しさん
2006/04/22(土) 15:35:220233デフォルトの名無しさん
2006/04/22(土) 15:36:00むしろOS/2
0235デフォルトの名無しさん
2006/04/22(土) 21:42:25GetCaretPos はキャレットを所有しているウィンドウのクライアント座標しか
返してくれません。キャレットを所有しているウィンドウのハンドルが
分かれば、ClientToScreen でスクリーン座標に変換できるのですが、
そのような関数が見当たりません。どなたか助けてください!
0236デフォルトの名無しさん
2006/04/22(土) 22:31:160237デフォルトの名無しさん
2006/04/22(土) 23:28:200238デフォルトの名無しさん
2006/04/23(日) 00:12:55WH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントロール?を探す感じでしょうか?
0239デフォルトの名無しさん
2006/04/23(日) 01:29:210240238
2006/04/23(日) 01:45:48元は、キーが押された時にフォーカスの当たっていたコントロールということです。
0241デフォルトの名無しさん
2006/04/23(日) 01:57:52Windowsプログラミング初心者です。
SetWindowsHookExでWH_KEYBOARDを監視するとして、何かキーが押されたらコールバックが発生しますが
コールバック元を特定するにはどうしたら良いのでしょうか?
フォーカスの当たっているウィンドウ?コントローラ?を探す感じでしょうか?
0242デフォルトの名無しさん
2006/04/23(日) 01:58:56>>236
0244238
2006/04/23(日) 02:27:36↓
GetWindowThreadProcessId
↓
GetGUIThreadInfo
をやって解決しそうです。お騒がせしました。
もしなんかもっとスマートなやり方があったら教えてください。
0245デフォルトの名無しさん
2006/04/23(日) 04:37:19やりとりするには、領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
どっちかのスレッドがこけて解放できなくなるなんてことが普通に起きそうで怖いんですが…
0246245
2006/04/23(日) 05:35:180247デフォルトの名無しさん
2006/04/23(日) 05:38:520248デフォルトの名無しさん
2006/04/23(日) 10:17:12んなコード書くほうが悪いだろう。
0249デフォルトの名無しさん
2006/04/23(日) 10:24:25スレッドの強制終了はNG。
フラグ立ててきっちり終了処理してから死んでくれと頼むのが基本。
その上でそのスレッドが文字列の開放を出来ない理由があるなら
開放の責任をメインスレッドに委ねてしまえばいい。
なんにしても
>領域を確保してそのポインタを渡すような実装しかできないんでしょうか?
これ以外の実装はない。
0250デフォルトの名無しさん
2006/04/23(日) 10:42:360251デフォルトの名無しさん
2006/04/23(日) 10:49:190252デフォルトの名無しさん
2006/04/23(日) 11:33:39スレッド間で悩む必要なんてなかろうに。
0253デフォルトの名無しさん
2006/04/23(日) 19:12:450254デフォルトの名無しさん
2006/04/23(日) 19:16:530255デフォルトの名無しさん
2006/04/23(日) 19:17:310256デフォルトの名無しさん
2006/04/23(日) 19:18:44自分のなかのSDIの知識だけでしたらおかしくなったのでお願いします。
0257デフォルトの名無しさん
2006/04/23(日) 19:42:000258デフォルトの名無しさん
2006/04/23(日) 19:48:36参考になりそうなサイトを教えてください(^人^)
0259デフォルトの名無しさん
2006/04/23(日) 19:54:53http://www.google.co.jp/
0260デフォルトの名無しさん
2006/04/23(日) 19:57:310261デフォルトの名無しさん
2006/04/23(日) 19:57:390262デフォルトの名無しさん
2006/04/23(日) 20:23:450263デフォルトの名無しさん
2006/04/23(日) 20:42:57http://toolbar.yahoo.co.jp/
0264デフォルトの名無しさん
2006/04/23(日) 20:57:400265デフォルトの名無しさん
2006/04/23(日) 21:02:18パイプ
0266デフォルトの名無しさん
2006/04/23(日) 21:08:09CreateFile関数でファイル作成し、
SetFilePointer関数でlDistanceToMoveを0x7FFFFFFF,
dwMoveMethodをFILE_BEGINで実行。
んで、SetEndOfFile関数を使ったら、
連続した領域は確保できそうな気がする。
ただ、CloseHandle関数を実行する前に、
もう一度、SetFilePointer関数とSetEndOfFile関数を使わんと時間がかかるかも。
試してないけどね。
0267デフォルトの名無しさん
2006/04/23(日) 21:10:16まずはこっから
http://www.codeproject.com/atl/ietoolbartutorial.asp
0268デフォルトの名無しさん
2006/04/23(日) 22:10:42TrackPopupMenuでメニューを表示しているとき新たに別のサブメニューを表示しなおす場合、
今までのTrackPopupMenu内の処理から抜けなければならないのですがどうするといいでしょうか。
0269デフォルトの名無しさん
2006/04/23(日) 22:30:58超さんくすこ
0270デフォルトの名無しさん
2006/04/23(日) 22:42:59抜ければ良いんじゃないのかな
0271デフォルトの名無しさん
2006/04/23(日) 22:57:200272268
2006/04/24(月) 00:47:51どのようにして抜けたらいいのか分からないのです。。。
TrackPopupMenuがプログラム側に制御を戻す条件ということです。
0273268
2006/04/24(月) 01:22:060274271
2006/04/24(月) 02:03:03フレームウィンドウにツールバーを作っても、クライアントウィンドウが上に来て押せなくなります。
だからといってクライアントウィンドウに書いてもウィンドウプロシージャがないために処理が出来ない。
こういった場合はサブクラス化でしょうか?
0275デフォルトの名無しさん
2006/04/24(月) 02:09:290276271
2006/04/24(月) 02:23:45ということはフレームウィンドウにツールバーを置いてということですよね?
一回試したのですが駄目でした。。。
やり方が間違っているのでしょうか?
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:03SendMessage(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:260279デフォルトの名無しさん
2006/04/24(月) 10:56:01アクセスする方法があったら教えてください。
0280デフォルトの名無しさん
2006/04/24(月) 12:09:58GetCommStateで取得してパラメータを設定、SetCommStateで設定、
という手順で初期化してるんだけど、ボーレートを230400にしよう
とするとうまくいかない。
DCB構造体を使用している限り出来ない、ということは何となく理解
したけど、じゃあどうすればいいの?
0281デフォルトの名無しさん
2006/04/24(月) 12:15:40まずPCのシリアルポートがその転送速度サポートしてるのか?
普通は115kbpsあたりまでしかサポートしてないと思うが‥‥
0282デフォルトの名無しさん
2006/04/24(月) 12:18:20GetCommPropertiesで取れなきゃダメなんじゃね?
0283デフォルトの名無しさん
2006/04/24(月) 12:25:390284280
2006/04/24(月) 13:27:46>>281
デバイスマネージャから確認したところ、115200,230400,460800,921600を
ドライバ的にはサポートしているっぽい。
>>282
早速GetCommPropertiesを確認してみたところ、
commprop.dwSettableBaudの値は268435456でした。
わからん。。。
0285デフォルトの名無しさん
2006/04/24(月) 13:37:17見るべきは、dwMaxBaudの方じゃないか?
0286デフォルトの名無しさん
2006/04/24(月) 13:39:43あと、268435456 = 0x10000000 = BAUD_USERな
0287280
2006/04/24(月) 13:54:57失礼。まちがえてた。dwMaxBaudが268435456。
ちなみにdwSettableBaudは268856176でした。
>>286
なるほど。
つまりこの値ではサポートしているボーレートの上限はわからないのね。
0289デフォルトの名無しさん
2006/04/24(月) 14:10:39dwSettableBaudはBAUD_なんちゃらのorが入っている。
つまり、268856176だとBAUD_USERが設定可能でBAUD_57600、BAUD_115200...が設定可能と読む。
逆に例えばBAUD_128K、BAUD_56Kが設定できないとわかる。
まぁ、BAUD_USERでの上限はどうやっても判らん訳で。
0290デフォルトの名無しさん
2006/04/24(月) 15:35:370291デフォルトの名無しさん
2006/04/24(月) 16:31:120292デフォルトの名無しさん
2006/04/24(月) 17:20:13こっちでも同じ質問してるな
http://forums.belution.com/ja/vc/000/358/12.shtml
MDIでツールバーの使い方
0294デフォルトの名無しさん
2006/04/24(月) 18:25:33The Code Projectが一番勉強になる件
0295デフォルトの名無しさん
2006/04/24(月) 19:11:23どうするとつけることができますか?
0296デフォルトの名無しさん
2006/04/24(月) 21:20:30簡単なサンプルを書いてくれ。
0297288
2006/04/25(火) 01:28:16WM_SIZEの処理をしたあとにbreakをしていたのがまずかったです。
つまりその処理の後にデフォルトプロシージャの処理をしてしまっていました。
return 0;に直したら動きました。
0298デフォルトの名無しさん
2006/04/25(火) 06:36:18ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnnetmt/htm/netmtgcom.asp
0299デフォルトの名無しさん
2006/04/25(火) 10:48:00MSDN
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:38GetLastError()は最後に発生したエラーのコードを返す。
6(ERROR_INVALID_HANDLE)のコードが、
WriteFileEx()の呼び出しで設定されたかどうかを判断すべき。
0301デフォルトの名無しさん
2006/04/25(火) 12:34:35GetLastError が 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:43WriteFileExって非同期で書き込みオーダーを出してるだけなんじゃね?
OVERLAPPEDがあるから、FDなど遅い媒体への書き込みとか試してみた?
0303デフォルトの名無しさん
2006/04/25(火) 12:43:43まずは、(Exのついていない)WriteFile()を使って非同期書き込みを行うプログラムを書いて見ることを強く勧める。
そうすれば、「WriteFileEx 関数を使う場合、この関数が「成功」を示す値を返していても、それだけでは不十分です。」
の意味が理解できると思う。
>>300のコメントにあるようにWriteFileExが非0を返したあとにGetLastErrorを呼んでも無意味。
GetOverlappedResultが0を返したとき、GetLastErrorを使う。
0304デフォルトの名無しさん
2006/04/25(火) 13:09:11>関数が 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:37GIF8ビット深さのファイルの(PixelFormat.Format8bppIndexed)
各ピクセルの色を表現するには、0〜255の数字によりますよね。
0が黒で、
1が__色で、
2が__色で、
・
・
・
GIF256色の一覧表って、どのサイトに掲載されているか
教えていただけませんか?かなり困ってます・・・くぅ〜
(探したのですが、僕の探し能力ではみつかりませんでした)
0307デフォルトの名無しさん
2006/04/25(火) 14:29:360308306
2006/04/25(火) 14:30:56いま、307がものすごくいいこといった!!
そこをもっと詳しく・・・(・д・)
0309デフォルトの名無しさん
2006/04/25(火) 14:32:28Image に Palette プロパティがあるだろ。
0310306
2006/04/25(火) 14:34:50どうして.Netだとすぐばれる・・・○rz
Bitmap bitmap1=new Bitmap(fs);
fs.close();
bitmap1.Palette・・・ほんとだ、それらしいのありました。
ってことは、ビットマップインスタンスを
ロックビットして、unsafeでバイト配列を観察していく
方法はだめだったのか・・・くぅ
0311デフォルトの名無しさん
2006/04/25(火) 14:35:340312306
2006/04/25(火) 14:36:44>>つーか、0が黒とは限らないし
いま、311がものすごくいいこといった!!!
>>311
>>そもそもry
306 :デフォルトの名無しさん :2006/04/25(火) 14:26:37
激しくスレ違いで、大変申し訳ないでつが、
0313306
2006/04/25(火) 14:40:211バイトごと順番に観察していくだけでは、
画像の中に赤いピクセルがあるかないか、それすらわからないのですか!!
くはっ今までの苦労はなんだったのか・・・
0314306
2006/04/25(火) 14:53:48これ、か・・・。くぅ。
0315デフォルトの名無しさん
2006/04/25(火) 15:01:090316306
2006/04/25(火) 15:09:57byte 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:280318デフォルトの名無しさん
2006/04/25(火) 16:10:400319デフォルトの名無しさん
2006/04/25(火) 16:30:00デバッグ中に凍ったと思ったら、こんなの表示されたよ
0320デフォルトの名無しさん
2006/04/25(火) 16:47:04どなたかわかる方がいたらお願いします。
>319
ぐぐったらなんか出てきたけどこれとは違うの?
0321デフォルトの名無しさん
2006/04/25(火) 16:58:340322デフォルトの名無しさん
2006/04/25(火) 17:10:41>>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二つ目の項目は自己解決しました。
GetLocationのフラグにあったIEIFLAG_ORIGSIZEをはずしたらOKでした。
0324デフォルトの名無しさん
2006/04/25(火) 18:14:59しかし、WriteFileExで、
OVERLAPPED構造体のリンクが外してあるのはヒドイよな。
WriteFile→WriteFile(非同期)→WriteFileExの順でやらんとピンとこんかもね。
0325320
2006/04/25(火) 18:31:570326320
2006/04/25(火) 19:26:300327319
2006/04/25(火) 19:28:020328デフォルトの名無しさん
2006/04/25(火) 19:38:09どうでもいいけどパレットエントリ中に白があるからといって画像中に白がある保証はない罠。
0329デフォルトの名無しさん
2006/04/25(火) 19:45:16日本語のページを検索
0330デフォルトの名無しさん
2006/04/25(火) 20:19:41ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=2113781
0331デフォルトの名無しさん
2006/04/25(火) 20:21:21お前が無能だからだな
■ このスレッドは過去ログ倉庫に格納されています