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

Win32API 質問箱 Build6

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

過去スレ
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0159 NGNG
>>157
は、リダイレクトを指定しないとき、ハンドルが存在するか確認はしてないわけだな?

リダイレクトすると、自動作成されるってのが結論なのかねぇ。
0160デフォルトの名無しさんNGNG
>>159
DOS窓から実行させればリダイレクトしなくても表示されますが?
0161127NGNG
>>158
以下のよーな感じですよね?GetKeyState関数の使い方は
引っ掛かりませんでしたけど...ね

if(GetKeyState(VK_KANA) & 0x0001){
  // かな_ON
}else{
  // かな_OFF
}
指定してる仮想キーを間違えてるのかなぁ...
0162デフォルトの名無しさんNGNG
160age
0163デフォルトの名無しさんNGNG
LoadLibraryでDLLをマップしようとすると、NT系ではOKですが、
9x系ではGetLastError「このアプリケーションの実行に必要なライブラリ ファイル
のうちの 1 つが見つかりません。」と返してきます。

MSDNには、
「DllMainがWin32 関数の Unicode 版を呼び出そうとした場合も、LoadLibrary は失敗します。」
とあるので、これが気になっているのですが・・・。

DLLはCOMサーバで、unicodeプログラムになっています。
0164デフォルトの名無しさんNGNG
>>160
表示されないぞ
0165デフォルトの名無しさんNGNG
>>163
何のDLL使おうとしてるんだか知らんが、そのDLLがリンクしてるDLLがNT系固有なんじゃないか?
Dependency Walkerでも見ろ。
0166147NGNG
>>161
合ってるよ。
それで取得できるはずだけど。
0167147NGNG
>>161
あ、IME2000固有のカナモード切換のこと?
だったら多分無理だよ。
(ごめん、キーボードのカナロックかと思った)

以前にMSのサポート技術情報ページで、
IME97かIME98あたりからAPIでの変更が不可能に
なったというのを読んだことがある。
0168127NGNG
>>167
むぅ...「Alt+ローマ字」で切替えるヤシは
APIで変更が出来ないのか...

(゚д゚)マズーだな...こりゃ...
さて、どーしよ
016993NGNG
>>140
ありがとうございます。
Stringで宣言していた時は、Chr(0)だのvbNullCharだので初期化してたのですが、
あちこちコードをいじり倒したので、今となってはよくわからなくなってしまいました。
今後の参考にさせて頂きます。
0170名無し@沢村NGNG
皆様方、ボタンなのですが、ボタンは子ウインドウなのでマウスでクリックしたとき、そのウインドウのハンドルを取得したいのですが、どうすればできますか?
いろいろなボタンをクリックしたときに、そのボタンに応じたハンドルを取得できますか?
0171デフォルトの名無しさんNGNG
>>170
GetDlgItem
0172デフォルトの名無しさんNGNG
>>168
keybd_event で何か入力させてみて、何が入力されたか調べる・・・とかいう最終手段もなきにしもあらず
0173名無し@沢村NGNG
コントロール(ボタン)上で、マウスボタンが押されたときと離されたときで、違う処理をさせたい場合は?
0174デフォルトの名無しさんNGNG
>>173
サブクラス化したほうが早いんじゃない?
0175名無し@沢村NGNG
>>174
サンキュー、サブクラス化したらなったよ。
でもCallWindowProcをしたら1番目の引数がlong (__stdcall *)(void *,unsigned int,unsigned int,long)' から 'int (__stdcall *)(void)' に変換できません。(新しい機能 ; ヘルプを参照)とエラーが出たよ。
本に書いてあるようにしたのにどうして?
どうやって解決するの?
017692NGNG
>118
ありがとうございました。
サンプルを参考にWaitCommEventの最後の引数をNULLにしたら直りました。
理由は不明ですが・・
0177デフォルトの名無しさんNGNG
>>176
CallWindowProcのヘルプ嫁

STRICTを定義するのはデフォルトと思ってたがなあ・・・
0178177NGNG
しもうた176じゃなくて175だ
0179デフォルトの名無しさんNGNG
K&R本によるとfgetcは内部でgetcを使って一文字ずつ読んでいるようですが、
Win32APIには一行ずつを読むAPIは無いので同じような関数を作るとすれば、
ReadFileで一文字ずつ読み込んでいくのが妥当ですよね?
それとも他に便利なAPIありますか?
0180sageNGNG
同じような関数を作るくらいなら、fgets使ったほうがいいんじゃない?
0181デフォルトの名無しさんNGNG
>138
ありがとうございます。参考にします。
0182デフォルトの名無しさんNGNG
>>179
おいおい、ReadFileで1文字ずつ読んだら
めちゃくちゃ時間かかると思うよ。
何のためにストリームがあると思ってんの?
0183デフォルトの名無しさんNGNG
fgetsだと行末がバッファからはみ出てたら、やばくね?
0184デフォルトの名無しさんNGNG
>>183
やばいね。

>>182
ReadFileってバッファリングしなかったっけ?
0185デフォルトの名無しさんNGNG
ReadFileで一気にバッファに読み込んでそのバッファで1行処理
やって処理がバッファの終わりまで来たらまた読み込んでじゃ駄目なの?
0186デフォルトの名無しさんNGNG
メモリマップしてが――っと読んでイケ。
0187デフォルトの名無しさんNGNG
この話題って、定期的に出ますな。で、いっつも
 1文字ずつ読むんですか?→バッファに少しずつまとめて読め→メモリマップ使え
の流れ。
0188デフォルトの名無しさんNGNG
>>187
で実際メモリマップ最強ってことでええの?
0189デフォルトの名無しさんNGNG
>>188
だめ。少なくとも、windowsではローレベルI/O汁
windowsのメモリマップは直接マッピングしてくれずに勝手にキャッシュするから。
0190デフォルトの名無しさんNGNG
ではこの質問がきたら
「バッファに少しずつまとめて読め」
ということね。FAQ認定
0191デフォルトの名無しさん NGNG
>>189
キャッシュされるとなにがまずい?
少なくともNT系ではマップした方が速いのだが。
0192デフォルトの名無しさんNGNG
よくでる質問の割に定石って無いわけ?
0193デフォルトの名無しさんNGNG
>>191
ディスク>キャッシュ>マップされたメモリ となる。
キャッシュの分オーバーヘッドが掛かり、遅くなる。
0194デフォルトの名無しさん NGNG
>>159
まともな知識のある奴は一人もいないのかね。
ウィンドウズアプリでは標準出力のハンドルが割り当てられない。
GetFileType(GetStdHandle(STD_OUTPUT_HANDLE))してGetLastError()
を取ると、ERROR_INVAID_HANDLEが返ってくることからも分かる。
ランタイムのstdoutやcoutは存在するため、一見出力できるように思えるが、
バッファがフラッシュされたタイミングでエラーになる。
ただしリダイレクトされている場合は別だ。親プロセスが標準出力に
正しいハンドルを割り当てた状態をリダイレクトと呼ぶのだから、
出力できるのがあたりまえだ。
0195 NGNG
>>194
半日かけて、よく調べた。感動した。
0196151NGNG
>153
さんの言う通りでした。
いつの間に設定がなくなったんでしょう。
XPでは始めは設定されてないのかな。
とにかく無事解決しました。
ありがとうございました。
0197デフォルトの名無しさんNGNG
>>193
PAGE_NOCACHEしても?
0198デフォルトの名無しさんNGNG
>>194
試してみたらちゃんとハンドルが返ってきましたが?
もちろんリダイレクトなんかしてませんが?

と思ってたらようやく原因が分かった。
エントリをmainにしていて/subsystem:windows /entry:mainCRTStartupで
リンクするとコンソール用のスタートアップが走るせいか標準出力の
ハンドルが準備される。
エントリをWinMainにしたら0(INVALID_HANDLE_VALUEじゃない。MSDNの嘘つき)
が返ってきてGetLastError()もERROR_INVALID_HANDLEになりますた。
0199デフォルトの名無しさんNGNG
って今テストしたら0(FILE_TYPE_UNKNOWN)が返ってきた。何か勘違いしてたらしい。
0200デフォルトの名無しさんNGNG
じゃ結局、AllocConsole()を使え。という結論でよろしいか。
0201デフォルトの名無しさんNGNG
既に起動済みの他アプリ(自作ではない)のボタン等のコントロールを非表示にする
ことは可能でしょうか?
0202デフォルトの名無しさんNGNG
FindWindowとかWindowFromPointとかでどうにかハンドルを手に入れれば
あとはなんとでも
0203デフォルトの名無しさんNGNG
スタートボタンとウィンドウズキーを使用不可にするジョークソフト
作りたいんですが検索キーワードを教えて下さい
プラットフォームSDKが英語で嫌になりました
0204デフォルトの名無しさんNGNG
まず英語勉強しろ
0205デフォルトの名無しさんNGNG
>>203
マウスメッセージとキーメッセージをフックしたら?
0206デフォルトの名無しさんNGNG
>>205
NC(非クライアント)関係をやれば出来ますか?
0207デフォルトの名無しさんNGNG
EM_SETSELで指定できる値の上限を知りたいのですが、
私の環境(Win98SE)では0x7FFFまでのようなのですが、
NT系ではどうなんでしょうか?
0208201NGNG
>>202
FindWindowでハンドルを得て、CaptionやIconの変更は出来たのですが,,
申し訳ありませんが、もう少しご助言いただけませんでしょうか?
0209デフォルトの名無しさんNGNG
>>208
FindWindowで得られるのは親ウィンドウのハンドル。
そのハンドルを元にGetDlgItemやFindWindowExや
GetWindow等を使って、対象のコントロールの
ウィンドウハンドルを取得。
そしてそれをShowWindowかSetWindowPosで非表示にする。
0210名無し@沢村NGNG
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、
サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^;
違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。
またボタンの上のフォントも作ったフォントではなく、普通のフォントが表示されるのですが、どうしたらいい?
0211デフォルトの名無しさんNGNG
>>210
意味がワカラン

ボタンを持つ主体は自分なのか他人なのか、
フック内でどんな処理を行っているのか
フォントを作った後にどうしているのか

これくらい書け
0212201NGNG
>>209
試行錯誤しながらやってみたのですがうまくいきません。
具体的にはMSOffice上のボタンを非表示にしたいのですが、もう少し
ご助言いただけないでしょうか。

現在
HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );

とやっていますが、thehwndにはNULLが入ってしまいます。
0213209NGNG
>>212
その前に、そのコントロールは間違いなくウィンドウなの?

Office系では単に親ウィンドウ内にコントロールの絵を
描画しているだけのことが多いよ。
具体的にはExcelのどの部分のボタンですか?
0214201NGNG
>>209
プレビュー画面の各ボタンです。
0215デフォルトの名無しさんNGNG
教えてほしいっす。
ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの
スタックを持っていますが、これはスレッドごとにメモリ上に実際に確保される
スタックの位置が違うと解釈していいのでしょうか?
0216209NGNG
>>214
Excel2000で確認してみたところ、
子ウィンドウの子ウィンドウ(孫)だから

HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "EXCELC", "" );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );
のような感じで取得できると思う。
0217デフォルトの名無しさんNGNG
>>215
> ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの
> スタックを持っていますが、

こっちの真偽は、よく知らんが...

> これはスレッドごとにメモリ上に実際に確保される
> スタックの位置が違うと解釈していいのでしょうか?

これは、正しい。
0218201NGNG
>>209
ありがとうございました!期待通りの操作ができました。
わかりやすい説明に確認までしていただきまして感謝しています。

あと、図々しいかと思いますが、もうひとつ。
EXCEL2000で確認とありましたが、それはどのように調べるものな
のでしょうか?
0219209NGNG
>>218
Excel2000の印刷プレビューの画面を確認したという意味です。
俺はVC++に付属している SPY++というツールで確認しました。
ただ、EnumChildWindows等を使えばツールがなくても
比較的簡単に調べられます。
0220名無し@沢村NGNG
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、
サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^;
違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。
またボタンの上のフォントも作ったフォントではなく、デフォルトのフォントが表示されるのですが、どうしたらいい?
フック内ではボタンが押されたときと、離されたときで違う処理だけ行なっています。
フォントはメインウインドウ内でつくった後なにもしていません。
0221デフォルトの名無しさんNGNG
>フォントはメインウインドウ内でつくった後なにもしていません。
オモロイ
0222215NGNG
>>217
わかったっす。ありがとー
0223名無し@沢村NGNG
皆様方、大変初歩的な質問で申し訳ないのですが、
コンボボックスをつくったのですよ。
そしてfor(i=0;i<100;i++)
SendMessage(hwnd,CB_ADDSTRING,2,(LPARAM)szbuffer[i]);
としたのですがコンボボックス内に何も字が表示されないのですよ。
本に書いてあるとおりにしたのに、どうしてでしょう?
どう考えてもわかりません…
0224デフォルトの名無しさんNGNG
>>223
wParamの2って何?
とりあえずダイアログエディタで、コンボボックスの矢印の部分をクリックして、
出てきた枠を下にぐ――――んと広げてみれ。
0225名無し@沢村NGNG
>>224
ヌヒよ、ダイアログじゃねーよ、ヌヒよ。
0226名無し@沢村NGNG
皆様方、コンボボックスですが、解決しました。
コンボボックスをつくるとき高さを充分にとってやればよかったのね…。
でも矢印をクリックしないと字が出てこないのですが…。
つまり一番上のスペースに字が最初から出ていないのですが…。
よくソフトなんかでは一番上のスペースに字もが最初から字が出ていますが、あれはどうするの?
0227デフォルトの名無しさんNGNG
>>226
CB_SETCURSEL
0228デフォルトの名無しさんNGNG
Windows のマクロで 9x 系か NT 系かを判定する方法ってありませんかね?
具体的には、プリプロセッサーの処理の時点で NT 系だけに存在する関数を
#ifdef で条件コンパイルしたいんです。
関数でなら GetVersionEx() というものを使えばいいらしいんですが、
これだと条件コンパイルできませんし。よろしくお願いします。
0229デフォルトの名無しさんNGNG
>>228
もう一度頭の中を整理したほうがいいぞ
0230デフォルトの名無しさんNGNG
>228
コンパイルしている環境のOSと、
動かすべき環境のOSは違うかもしれないんだが。
0231228NGNG
>229-230
あっ、そういえば……ありがとうございました。
解決できたので吊ってきます。
0232名無し@沢村NGNG
>>227
ありがとうございました。
CB_SETCURSELとしたところ、初めから字がコンボボックスに出ました!!
それからもうひとつ質問ですが、コンボボックスをつくるとき高さをだんだん低くしてやってみたのですが、
いくら低くしてもこれ以上低くならないというのが何かあるみたいなのです…。
よくソフトなんかでは、もっと低くてカッコいいコンボボックスを見かけるのですが、
よく見かけるソフト並みにコンボボックスの高さを低くするにはどうしたらいいの?
またそんな方法があるの?
0233デフォルトの名無しさんNGNG
自アプリに限らない登録済みホトッキー一覧を取得するにはどうすればよいのでしょう?
0234デフォルトの名無しさん NGNG
>>233
 const int id = 123;
 bool used[8][256];
 for (int mod = 0; mod < 8; mod++){
  for (int vk = 0; vk < 256; vk++){
   used[mod][vk] = !::RegisterHotKey(hWnd, id, mod, vk);
   ::UnregisterHotKey(hWnd, id);
  }
 }
0235デフォルトの名無しさんNGNG
現在webブラウザを作っています。
レンダリング結果を自然にするため、
文字のカーニングを行いたいのですが、
フォントから情報を取得する方法が分かりません。

参考になるサイトなど教えて下さい
0236デフォルトの名無しさんNGNG
GetKerningPair っつう API があるけど?
0237デフォルトの名無しさんNGNG
MFCでダイアログベースのHTTPクライアントを作っています。
InternetReadFileで読み込んでいるのですが、読み込み中は
ダイアログの何処をクリックしても反応がありません。
他に良い方法は無いでしょうか・・・
0238名無し@沢村NGNG
皆様方、コンボボックスの高さの件ですが、誰にも聞かずに解決しましたヨ!!
CB_SETITEMHEIGHTとすれば良かったのね!!
あと皆様方、コンボボックスにたくさんデータを入れたのですが、
データの一番下までスクロールすると、データの一番下の字のもっと下の部分に空白ができるのですが、この空白のなくす方法はないものでしょうか?
良くソフトなんかでは、データの一番下の字までで終わりになっていてカッコいいので、あんなふうにしたいのですが…?
0239デフォルトの名無しさんNGNG
>>238
CBS_NOINTEGRALHEIGHTを外すのだ外すのだ外すのだ
0240デフォルトの名無しさんNGNG
>>237
INTERNET_FLAG_ASYNCで開け。
またはスレッドを作る。
0241デフォルトの名無しさんNGNG
>>240
async・・というと非同期ですか。
ちょいとやってみます、thx!
0242名無し@沢村NGNG
皆様方、私は我ながらすごいこと発見いたしましたので、皆様方にお教えいたします。
それは{mciSendStringなんですが、{mciSendStringでopenとやってplayとやると、
演奏が終わったあと再びボタンを押しても演奏されないんです。
しかし停止ボタンで演奏途中で停止した場合は、もう一度演奏ボタンを押しても演奏されるんですね…^^;
私はこの事実に注目して演奏がひとりでに終わったあと再びボタンを押しても演奏されるようにする大発見をしたんです!!
それは皆様方、まず、{mciSendStringでcloseとやったあとopenとやってplayとやるといいんですよ!!
何故なら停止ボタンはmciSendStringのcloseから成り立っているからなんですねっ!
ちょっと邪道のような気もしますが何も問題は発生しないのでいいと思うんですが…。
皆様方はどう思われます?
いつも教わってばかりなので、たまには私が教えたのですが、いかがでしたでしょうか?
0243デフォルトの名無しさんNGNG
>>242
ここに書き散らすよりも、ホームページにTipsとして書いたほうが
後の人のためだと思う。
0244デフォルトの名無しさんNGNG
>>243
いや、どう見てもネタだろ・・・
0245デフォルトの名無しさんNGNG
>>244
うるせえ黙れオナニーならホムペでやってろ
とやんわりと言ってるのだと思われ
0246デフォルトの名無しさんNGNG
>>242
一つだけ言わせてもらえれば、馴れ合いたいだけなら
どっか他所でやってくれ。
0247デフォルトの名無しさんNGNG
Tips かよ?
0248デフォルトの名無しさんNGNG
アプリケーションモーダルなダイアログを自前で作りたいんですが
親ウィンドウを設定したあと子ウィンドウが閉じられるまで
親ウィンドウにフォーカスを移さなくするにはどうすればいいんですか
EnableWindow()ではなんか違うよう気がするんですが…
0249デフォルトの名無しさんNGNG
何が違うんだよ。EnableWindow()でいいんだよ。
0250デフォルトの名無しさんNGNG
違う気がする…
0251デフォルトの名無しさんNGNG
おまえの脳内妄想なんかには付き合ってらんねーよ。
そのまま一生悩んでろ。
0252デフォルトの名無しさんNGNG
>>248
DialogBox()使ってるの?
Win95以降MFC使ってるからDialogBox()の動作よくしらへんけど
0253デフォルトの名無しさんNGNG
親にフォーカスが来たタイミングでダイアログにフォーカスを移してやれば
いいと思うんだがダメかね。
0254デフォルトの名無しさんNGNG
MessageBox(hWndParent,"","",MB_OK);
としたときのメッセージボックスと
hWndParentの関係のようなものにしたいんですが
なんとかいっぱつでできるような方法はないでしょうか
0255デフォルトの名無しさんNGNG
>>252
自前でって書いてるからアプリケーションモーダルの
ふるまいをエミュレートしたいって解釈したんだけど
>>254
違うんだったらDialogBox()
つーか>>252は無視か? とっとと首くくって氏ね
0256デフォルトの名無しさんNGNG
MFCは、DoModalすると、modelessでdialogつくって、
親をEnableWindow(FALSE)してるが。

つか、何がどう違うんだよ。釣れた、とかいうのは勘弁な。
0257252NGNG
>>255
>自前でって書いてるからアプリケーションモーダルの
>ふるまいをエミュレートしたいって解釈したんだけど
書き込んでから248を読み直してきがついた。249が正解とオモタ
でも、どうやってダイアログを表示してるか書いてないんで
一応252の書き込みしててもいいかとオモタ
0258デフォルトの名無しさんNGNG
ポップアップメニューって、位置とアラインを指定(TPM_XXALIGN)してやると、
領域が画面内に収まるように位置が自動調整されるじゃないですか。

これを普通のウィンドウでやりたいんですが、位置を計算してくれる APIなど
ありますか?やっぱ、自分でしこしこ計算するしかないんですかね?
■ このスレッドは過去ログ倉庫に格納されています