Win32API質問箱 Build19

このエントリーをはてなブックマークに追加
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
ただし、最新スレくらいは質問する前に検索してくれ。というかしろ。

過去スレなどのリンクはたぶん>>2-5くらい。
- 過去スレ
Build18:http://pc5.2ch.net/test/read.cgi/tech/1081702990/
Build17:http://pc5.2ch.net/test/read.cgi/tech/1077470361/
Build16:http://pc2.2ch.net/test/read.cgi/tech/1073830065/
Build15:http://pc2.2ch.net/test/read.cgi/tech/1069339866/
Build14:http://pc5.2ch.net/tech/kako/1065/10653/1065328397.html
Build13:http://pc5.2ch.net/tech/kako/1059/10595/1059549320.html
Build12:http://pc5.2ch.net/tech/kako/1056/10560/1056033645.html
Build11:http://pc5.2ch.net/tech/kako/1052/10526/1052651750.html
Build10:http://pc5.2ch.net/tech/kako/1047/10478/1047819779.html
Build9:http://pc5.2ch.net/tech/kako/1044/10449/1044929160.html
Build8:http://pc5.2ch.net/tech/kako/1040/10409/1040964626.html
Build7:http://pc3.2ch.net/tech/kako/1036/10366/1036654893.html
Build6:http://pc3.2ch.net/tech/kako/1032/10325/1032548635.html
Build5:http://pc3.2ch.net/tech/kako/1028/10285/1028580373.html
Build4:http://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
Build3:http://pc.2ch.net/tech/kako/1017/10170/1017072275.html
Build2:http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Build1:http://pc.2ch.net/tech/kako/991/991576947.html
(★は「いやー ごめんなさい。」に巻き込まれた模様)

- MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
- 猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/index.html
- Platform SDK Update
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
- Google
http://www.google.com
5デフォルトの名無しさん:04/05/16 21:58
すんません、質問。
今下記のようにしてMCIでwavを開いてるんですが、これだと実行時にwavを読みます。

//hoge.c
static MCI_OPEN_PARMSgst_mop;
gst_mop.dwCallback = (DWORD)g_hWnd;
gst_mop.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
gst_mop.lpstrElementName = "wav/sentaku.wav";
iErr = mciSendCommand(0 , MCI_OPEN , MCI_OPEN_TYPE |
  MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT , (DWORD)&gst_mop);

実行時読みじゃなくてリソースにしたいんですけど、どうやったらいいんでしょう?
試しに下記のようなことをしてみましたがだめでした。

//hoge.rc
WAV_SENTAKU WAVE "wav/sentaku.wav"

//hoge.c
gst_mop.lpstrElementName = "WAV_SENTAKU";
MCIはファイルから読み込む仕様です
>>6
なるほど、どうりでぐぐっても見つからないわけだ。
ありがとうございました。
Win9xでexeのアイコンにファイルを吸わせた場合はちゃんと動作するのに
Win2kだと同じやり方では誤動作してしまうプログラムがあるので、GetCommandLineで
調べたときに9x系と同じ渡し方をする、橋渡し的なプログラムを作ってみたのですが
どうも失敗します。

実際に調べた結果、Windows98ではexeアイコンにファイルを落とすと、

    二重引用符で囲ったexe名+半角スペース+8.3形式表記のファイル名

のようになると判断していますが、この認識ではまずいのでしょうか?
>>8
まずいです。
というか、DnDでの起動しか考慮に入れていない?
他のアプリケーションから起動されることもあるかも知れないし。

で、解決策としては、長いファイル名も短いファイル名も受け取れるようにしておく。
10デフォルトの名無しさん:04/05/17 13:03
INIファイル内で正式なコメントの書き方ってありますか?
今は
; Ident=Value
とかやるとたまたまIdentで取得できなくなることを利用しているんですが。
>>9
多分有名だと思うので書きますが、そのプログラムはRarUtyです。
win98を使っていたときは「送る」にショートカットを置いていて、ファイルの
右クリックメニューから送るとそのファイルが選択されるのですが、
windows2000、xpだと必ずそのフォルダの最初のファイルが選択されてしまうので、
どうにかして回避しようと思いました。
そこで、SendToに置くショートカットをRarUty本体のものではなく、
今回自作したプログラムのものにして、自作プログラムで整形したコマンドライン
引数を与え、間接的に実行することでこの不具合を避けられると考えたのです。

すいません、説明が長くなりました。
あと、書きながら思いついたのですが、RarUtyの元であるVBに
NT系だとコマンドラインまわりがうまく動作しない、などという仕様があるような
気もしました。
>>10
たまたまじゃなくて、それが正しいコメント記述方法かと

GetPrivateProfileSection()の解説部分にも
「セミコロン(;)で始まるコメント行は〜」なんて書かれてるし
13デフォルトの名無しさん:04/05/18 00:28
.NET FrameworkクラスライブラリのControlPaint.DrawButtonに相当する
Win32APIってありますか?
DrawFrameControl
質問の仕方になんかジェネレーションギャップを感じたよ・・・
.NETの足音が聞こえてくるよ
longhornが出たらな。
したばったするぅなよぉ
どとねっとが、くぅるぜ
nainai16.NET
20デフォルトの名無しさん:04/05/18 09:31
OSは、WIN2000で、現在起動している他のプロセスの
読み込んでいるDLLを知る方法はないでしょうか?。
Dependency Walker
>21
ありがとうございます。このプログラムのようなことを実現しようとすると
どんなAPIを使用すればいいのでしょうか?
>>20
ms-help://MS.PSDK.1033/perfmon/base/enumerating_all_modules_for_a_process.htm
メニューのオーナードローに挑戦しています。
通常の項目のオーナードローには成功したのですが、
MF_OWNERDRAWとMF_POPUPを同時に指定した項目だけは、
WM_DRAWITEMが来ないようで描画に失敗します。
MF_POPUPのオーナードローは出来ないのでしょうか?
25デフォルトの名無しさん:04/05/18 14:45
カレットかスクロールバーを移動させないようにするには
どうしたらいいんでしょうか。

>>24
少なくとも俺のところではできてます。
>>25

何をやりたいのやら?
27デフォルトの名無しさん:04/05/18 15:05
"Default"フォントというフォントがありますが、
WinXPだと、これはどこで設定されるんでしょうか?
APIから読んだり書いたりも出来ますか?
>>27
「"Default"フォント」なんてあるか?
Exploereなどに使われてるフォントと言う意味でなら、何かしら
指定されてるのがあると思うが、そんな名前のフォントは無いと思う。

少なくとも俺のマシンのfontsフォルダには無いな。
29デフォルトの名無しさん:04/05/18 16:40
>>26
リッチテキストの処理を行ってるんですが、
Rtfコードを適応すると、スクロールもカレット位置も先頭に戻ってしまうので
入力するたびにテキスト内ががくがくになってしまうんです。
それを防ぎたいんですが、何か方法はないかなと。

MSゴシックとかはまず入ってる。
配布可能なフォント使うか元から入ってるの使うしかない。
hwndの参照先であるウィンドウオブジェクトとは何ですか?
ウィンドウの実体とのことですけど、構造体のようなインスタンスでしょうか
WNDCLASS構造体のウィンドウクラスとは全然違うものですよね?
>>31
ウィンドウはWindowsが内部で管理しているが、その管理コードとでも思っておけ。
>>32
レスありがとうございます。
ちなみにウィンドウクラスとは、そのWindowsが内部で管理しているウィンドウに
初期設定の値を与えるための情報を詰め込んだ構造体と考えて間違いはありませんか?
漏れのレベルはコンソール用のちゃっちいプログラムを書ける程度なんだけど、
試しにいろいろなとこに載ってるWin32APIを使ったソースをコンパイルしようとすると
必ずエラーが出る。コンパイラはBCCなんだけど、どうしてだろう?
みんな普通にコンパイルできてるん?
できてるよ!
おおかたコンパイルオプションの -W を忘れているんだろ。
誘導されてきました。

vc++でwindowsプログラミングをちょっとかじってみております。
質問なのですが、EditBoxを貼り付けたDialogBoxを作って、
EditBoxにフォーカスがあるときに打ち込まれたキーを取得したいのですがよくわかりません
DialogBoxのコールバック関数内でWM_COMMANDを拾うと、
LOWORD(wParam)にIDC_EDITBOXとかが入っていて
HIWORD(wParam)にWM_KEYDOWNが入ってるみたいなのですが、
どのキーが押下されたかっていう情報は取得できませんか?
EditBoxのコールバック関数を作ってWM取る、とかでしょうか
>>33
「ちなみに」という言葉の使い方はその場合、間違い。
ん?-Wってウィンドウズアプリのとき(WinMainあるとき)だろ?
>>34はウィンドウズアプリを作りたいのか、
それともwindowsAPIをちょこっと利用してるだけのコンソールアプリを作りたいのか。

つか、そういう使い方ってできるもんなん?やったことないからわからん。
ちゃんとインポートライブラリリンクするなりしてればコンソールアプリでも普通にAPI使える。
つぅか、使えなかったらなにも出来んぞ。
>>40
stdio.h
があればコンソールでも何とかなる。
>>37
>HIWORD(wParam)にWM_KEYDOWNが入ってるみたいなのですが、
HIWORD(wParam)に入ってるのはEN_じゃないか?

>EditBoxのコールバック関数を作ってWM取る、とかでしょうか
これでいいと思うよ。
CreateしたMutexって別にReleaseしなくても良いんでしたっけ。

というのは、何かこまめにReleaseしているおかげか、
WaitForSingleObjectが効いてないみたい。
44デフォルトの名無しさん:04/05/19 11:38
Mutexってなんか動作分かり難いというかデバッグし難いな。

CRITICAL_SECTION に書き換えた方が読みやすいし誤動作し難い?
Release するかしないかは君のプログラムが決めることだけども、
Release しないと他のスレッドがその mutex を所有することが
できないんだから、Release しなくてもいい状況というのは
普通はない。
46デフォルトの名無しさん:04/05/19 11:47
consoleアプリでWin32APIを使うには、GetModuleHandleで
WinMain引数のhInstanceに相当するハンドルが得られる。
4737:04/05/19 12:41
>>42
レスサンクスです。調べたらEN_〜みたいですね。

あとリソースエディタで貼り付けたEditBoxのコールバック関数
(ウインドウプロシージャと言うべきか)はどう登録するのでしょう?
そのEditBoxだけCreateWindow/RegisterClassExで貼り付けるんでしょうか?
48デフォルトの名無しさん:04/05/19 12:53
サンクスでつ>>45

ついでに、MutexとCryticalSectionとどちらか教えて下さい。
Mutexはグローバルなカーネルオブジェクトだからプロセス間での排他に
使えるが遅い
CriticalSectionはそうではないから同一プロセス内のスレッド間排他が
主な役目になるが軽量で高速
CriticalSectionはWin9xを視野に入れてしまうとタイムアウトができないのがつらいな。
プロセス間同期は必要ないことも多いが。
>>47
サブクラス化で検索。
実はMutexの一番良く見る例の一つが多重起動防止だったり
Cランタイム他のスレッド間同期処理に実際に使われてるのは
CriticalSectionのほうですな。
そこで、メータードセクション

セマフォのように使え、プロセス間同期も出来、それでいて高速。
ただしMSDNそのままの実装だと同一スレッドから複数回 Enter できない罠
5437:04/05/19 16:12
>>51
なんとかできそうッス
キーワードもらえて助かりました
>>49 ミューテックスって遅かったんデスカ!

スレッド間の排他制御にずっと名無しのミューテックス
使ってたんだけどやめたほうがいいかなぁ。
俺はWaitFor〜Objectが使いやすくて好きだな。
それと、Set/GetDlgItemFloatって使えないの?
グローバルネームスペースには存在するんだけど、
実態が存在しないらしくエラー出るし、
なんかリンクする必要あるのかと思ってMSDN探してみたけど無いし
ぐぐっても0件だし・・・
Web上に転がっているMutexのサンプルはしばしば間違っていて抜け穴が存在する。
まぁ、ここでも読んで同期オブジェクトに関する知識を深めろ

短時間でできる汎用の同期オブジェクト
http://www.microsoft.com/japan/msdn/library/ja/jpdndllpro/htm/metrsect.asp?frame=true

↑のソースコード(元記事)
http://msdn.microsoft.com/library/en-us/dndllpro/html/msdn_metrsect.asp?frame=true
>>56
確かにInteliSenceで並んでるけど、どこにもないな。

VC6.0のInteliSenceには無い事から考えると…
 実はその内追加される予定があった関数で、
 InteliSenceの部隊が先行して入れてしまった
とかだったりして。

他のサーチエンジンで検索してみると、GetDlgItemTextを
使って自前で実装した例もあったんで、現状では使いたいなら
それしかなさそうだな。
DirectXがインストールされているかどうかを、
コードレベルで調べる方法があれば教えてください。
そういうAPIがあるといいのですが、なければ
どこかのレジストリを調べることになるのでしょうか…。
>>57
2重起動防止のサンプルですな
DirectXSetupGetVersion
>>58
これって自分でアプリに組み込めってこと?
APIで提供されるんじゃないのか。
>>63
は?
6560:04/05/20 14:04
>>62
どうもありがとうございます。試してみます。
>>64
>>58 をぱっとみて、メータード セクションってのがWin32で提供されているのかと思っただけっす。
提供されてるけど?
>>67
マジで?
MSDNをCreateMeteredSectionで検索しても見つからないんだけど。
>>57
どんな抜け穴ですか?
高橋名人なら突破できるということだ
ワロタ
>>67
PlatformSDK探したけど見当たらなかった。
もしあるならどこにあるか教えてくれ
誰も英語版の記事を読んでないの?
そのくらいのことができないのはちょっとな。
>>73
そうじゃなくて、
英語版の MSDN の記事をコピペしてメータードセクションを作るのではなくて、
最初から PSDK に入ってるんじゃないの?
ってことだと思う。

>>67 の「提供されてるけど」は多分「ソースは提供されているけど?」ということじゃないのかな?
それを、>>68>>72 は、「Win32APIとして最初から提供されているの」って勘違いしたんじゃないかなあ。
>>69
OpenMutex使ってるヤツはペケ
ぐぐったらたったの二件。片方は↑で引用されてるMSDNの記事だった。
比較を見るといいことずくめなんだが、結局
FileMappingを利用して実装してるんだね、フーン
で終わってしまったYo。
>>75
あれか。OpenされてなければCreateってやつね。
78デフォルトの名無しさん:04/05/20 19:23
InitializeCriticalSectionしといて、DeleteCriticalSectionしない、
ってのは弊害ありますか?
7978:04/05/20 19:37
実は、クラスの
コンストラクタでInitializeCriticalSection、
デストラクタでDeleteCriticalSectionするようにしたんですが、
これだと、クラスの生成破棄をマルチスレッドでやっちゃうと、
CriticalSectionが途中で無効になっちゃうかな、と思いまして。

で、クラスの中で初期化するのはやめて、
プログラムのはじめでInitializeCriticalSectionして、
あとはほっとこうかなー、と。

どうでしょう?
それはプログラムの作り方の問題じゃねーのか?
8178:04/05/20 19:56
プログラムの作り方を質問させて頂いてまつ。

79に書いたやり方だと、やっぱりCriticalSectionが途中で無効になりますか?
教えてえ○い人。
82デフォルトの名無しさん:04/05/20 20:34
がいしゅつだったわるいけど、
Win95上でIME を Disableにする方法無い?
クローズじゃなくってDisable.
BOOL WINAPI WINNLSEnableIME(HWND hWnd, BOOL bEnable)
があったんだけけど、これって、NT用だったり。
>>81
クリティカルセクションはそれぞれが独立してるから
何個作ろうが構わない。

そもそも、各スレッドから同時にアクセスされたくないときに
使う物だからプログラムの内容による。

ってことを>>80は言いたかったんだと思う。
>>82
ImmなんとかってAPI群が有るが。
85デフォルトの名無しさん:04/05/20 21:18
>84
ImmSetOpenStatus
とかでしょ。でも、クローズするのはあるが、
IMEを、ディセーブルにするのなんてあった?
>>85
ImmDisableIMEは98以降か。
スマソ。
アクティブなウインドウが変更された時の
そのウインドウハンドルの取得って出来ますか?
GetActiveWindow()
書き方ちょっと間違えました。
Windows全体での
アクティブウインドウが変更になった瞬間を取得です。
フックでもしこんどけ
9189:04/05/21 00:10
>>90
仕込んでみたんですけど、
0==GetParent(アクティブウインドウ)
なやつを引っ張ったとしても。
画面に出てないウインドウも取ってくるですよ。
spyとかで、調べても見つからないような

フック以外ないですかねー
92デフォルトの名無しさん:04/05/21 00:39
OpenSoundとかはとっくに廃止されたというかWin32にはそもそも
存在しなかったような気がしますか、これと同じビープ音で演奏する
方法ってないんでしょうか?
ユーザー補助とかでピヨッとか鳴るから何か手段はあるはずなんだが。
MessageBeep()で鳴らない?
あ、演奏したいのだったらBeep()の方だな。MessageBeep()だと一種類しかないけど、
Beep()の方なら周波数と鳴らす時間を指定できるっぽい。
Beep使ったことあるけど、うるさいしへぼいし、なってる間プログラムはとまるし。
別スレッドで…とかやればいいのだろうけど、まだスレッド意識したことないな。
96デフォルトの名無しさん:04/05/21 01:18
WndProcを呼び出す為にメッセージがあった事にできる
関数があるなら教えてください。

Timerとかあると思うのですが、そんなたいそうなものではなく、
WndProc内でHappenMessage(NULL);みたいにやって
WndProcを抜けた後もう一度WndProcに入るみたいな事がしたいのです。
>>92
宍戸さんの所にあります。だが、めちゃめんどいです。
http://www.sm.rim.or.jp/~shishido/waved.html

後、Beep()は楽だけど、たしか95系だと動かないです。
>>96
適当なメッセージを自身のプロシージャに送れば?
WM_APP+96とか。
>>96
PostMessageでは期待にそえんか?
10096:04/05/21 01:47
>>98>>99
ありがとうございます。やってみます。
10196:04/05/21 02:17
できました。ありがとうございました。
102デフォルトの名無しさん:04/05/21 08:59
テストプログラムを作って、
EnterCriticalSectionを実行しましたが、
Leaveを待たずにEnter出来てしまいます。
クリティカルセクションって同一スレッドでは排他しないんでしたっけ?
いったんクリティカル セクションの所有権を獲得したスレッドは、 その実行をブロック
することなく、 繰り返しEnterCriticalSectionを呼び出すことができます。これにより、
スレッド自身が、 すでに所有しているクリティカル セクションを待つ間、 デッドロック
状態に陥らないようになります。スレッドの所有権を解除するには、 各EnterCriticalSection
呼び出しに対してLeaveCriticalSection関数を1回ずつ呼び出さなければなりません。

ってことでしょ多分
そういうことですか、納得。>>103
>>102
同一スレッドで排他したらデッドロックするじゃん。
2^32 + 1回連続Enterしても大丈夫なんだろうかね?
>>92
音を鳴らすだけなら、sndPlaySoundで良いんじゃない?
もうちょっと、色々して鳴らすならMCI系で。
それ以上なら、waveOut系を使うしかないかな…。
>>106
たぶんダメポ
>>106
とりあえず、やってみた。
結果は、デッドロックや例外で止まるとかはないが、
CrticalSectionの機能を果たさなくなってる。

まぁ、普通はそんな回数やる前に設計見直せって
話になるだろうから、心配するなw
>>106
そんな事態を招くプログラマの頭のほうが深刻な問題だけどな。
ファイルの関連づけ取得を楽にするAPIってないですかね?
がんばってレジストリ読むしかない?
質問。

Win32APIのExtTextOutW ( ExtTextOutのUnicode版 ) 使ったんだけど、
SetTextAlign( hDC, TA_UPDATECP ) とやっても X と Y が有効になっちゃうんだけど、
これって自分の環境だけなのか、他でもなっているのか教えてください。

他でもなってるなら(APIのバグなら)自分でカレントポジション持ってきて移動させますので。

#ちなみにANSI版はまだ試してないっス

自分の環境は
WinXP
VC++.NET 7.1
.NET FrameWork1.1 (APIだから関係なし?)
です。
>>111
FindExecutable
とりあえず、Wizardで作られたソースに
 MoveToEx(hdc , 100 , 100 , NULL);
 SetTextAlign(hdc, TA_UPDATECP);
 ExtTextOut(hdc, 200, 200, 0, NULL, _T("0000"), 4, NULL);
 ExtTextOut(hdc, 200, 200, 0, NULL, _T("1111"), 4, NULL);
ってな感じで追加して試してみたが、ドキュメントどおりの挙動だったぞ…

ちなみに、AでもWでも一緒。
115111:04/05/21 18:50
>>113
サンクス
116112:04/05/21 19:27
>>114
ありがとう。
じゃぁなんか自分のコードにバグあるっぽいね。
早速探してみるよ。
関連づけられていないファイルをダブルクリックした場合、
開く方法を選択するダイアログが出てくるけど、
これを開くAPIってある?
ShellExecuteでは出てこないんだけど・・・
KBにあったけど番号忘れた。
>>117
rundll32 shell32,OpenAs_RunDLL %1
120デフォルトの名無しさん:04/05/21 23:33
「ファイルを保存するダイアログ」を外部からパスを与えて操作したいんだけど
どうしたらいい?
メモ帳とかでCtrl+Sで出てくるようなやつで表示されているパスを変更したいっ
てことなんだけどどうでしょう.
>>120
すでに開いているのを操作するのか?
そのパスで開きたいのか?
さあ、DOTCH?
SetCurrentDirectory
>>121
前者です.
>>122
これだと「そのパスで開く」ということになるんですよね?
フックするしかないかな。
あれってダイアログの種類二、三ない?
全部同じ操作でいけるのかな?
てか>>123は何がしたいんだ?
126123:04/05/22 00:17
>>125
親が仕事でPCを使っていて, いくつかの保存先を行ったり来たりするんだけどそ
れを省力化あるいは自動化できたらいいなと.
>>126
Placebarをカスタマイズ汁。}
>>126
えらいな、自分で作るっていう考えが。
129123:04/05/22 00:28
>>127
それだとあらかじめ登録しておいたフォルダに保存するて感じで, 希望としては
もちっと柔軟性が欲しいところなんです.
というか, ある既存のアプリが作ったフォルダの名前を取得して, 別の既存のア
プリで何かのデータをそのフォルダに保存するということがやりたいというわけ
です.
130デフォルトの名無しさん:04/05/22 03:30
.bmpファイルを開いてBMPINFOを得る方法を教えてください。
>>130
ヘッダを読む
>>131
いろいろ調べておっしゃるバイナリを調べる方法や、
キャストしたりオフセットを使ったりする方法はあったのですが、
GetBitmapInfo(bmpFileName, &bmpInfo);
こういう感じで簡単に得られるのはないでしょうか。
無い
>>132
キャストしないでも、
#pragma pack(1)とかされてるはずだから、
 1 ビットマップをオープン
 2 BITMAPFILEHEADERを読む
 3 bfOffBitsをみてBITMAPINFOのサイズを決定
 4 BITMAPINFOを読む
とすれば問題なく読める。
別に要素ごとに一つ一つ読む必要は無い。
135130:04/05/22 03:48
>>133
なら、LoadImage→SelectObject→SetDIBitsで得られますか。
136130:04/05/22 03:52
>>134
調べてみます。

>>135
分かりにくいですね。
以下のはDDBですよね?このような感じでDIBを得たいのです。

PAINTSTRUCT ps;
HDC hDC = NULL, hDCBitmap = NULL;
HBITMAP hBitmap = NULL;
hDC = BeginPaint(hWnd, &ps);
hDCBitmap = CreateCompatibleDC(hDC);
hBitmap = (HBITMAP)LoadImage(NULL, BMP_FILE, IMAGE_BITMAP,
16, 16, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
SelectObject(hDCBitmap, hBitmap);
BitBlt(hDC, 0, 0, 16, 16, hDCBitmap, 0, 0, SRCCOPY);
DeleteDC(hDCBitmap);
DeleteObject(hBitmap);
EndPaint(hWnd, &ps);
>>136
GetObject
138130:04/05/22 03:57
>>137
GetObject(hBitmap, sizeof(BITMAPINFO), &bmpInfo);
ですか?
>>136
LR_CREATEDIBSECTIONつけてんだからDIBだろうが。
140130:04/05/22 04:00
>>139
そうだと思うのですが、どこにパレットとピクセル配列があるのか
分からないのです。bitmap.bmBitsだと思うのですが。
SetPixelVで表示したいのでそこにアクセスする方法を探していました。
141130:04/05/22 04:29
まだ自分のLVでは無理なようなのでもう少し勉強してからにします。
お答えいただきありがとうございました。
142デフォルトの名無しさん:04/05/22 04:35
システムクラス(BUTTONとか)のWM_NCCREATEをうけとりたいのですが
SetWindowsHookEx以外の方法ってありますか
>>142
スーパークラス化
144142:04/05/22 06:56
ありがとうございます
145117:04/05/22 09:02
>>118-119
できました。
ありがとうございました。
146デフォルトの名無しさん:04/05/22 13:31
モードレスダイアログのエディットコントロールに最初に表示されるように。
SetDlgItemTextで文字を表示さしてるんですけれど、
ダイアログが呼び出されたときに何故か最初に表示されてる文字の一つが反転
(マウスでクリックして選択された状態)になってるんです。
これってどうゆう原因なんでしょうか。.netで開発してるんですけど、プロパティにはそれらしい
項目はないみたいだったんですけど。お願いします。
ドラッグドロップでマイコンピュータなどの特殊フォルダはどうやって受け取れば良いんでしょうか?
IDataObject::GetDataに渡すFORMATETC::cfFormatに設定する値を変えればいいと思うのですが、
どの定数を設定すればいいのかわかりません。
よろしくお願いいたします。
149147:04/05/22 19:08
>>148
ありがとうございました。
150デフォルトの名無しさん:04/05/22 20:18
CreateWindowEx で、作ったツールバーの背景色を変えるにはどうしたらいいですか?
もしくは、ツールバーのビットマップのうち、透過色を指定する方法でもかまいません。

Win9x と XP で、デフォルトの背景色が違うので、なんとかしたいのです。
151146:04/05/22 20:54
モードレスダイアログのエディットコントールのプロパティの
TabstopがTrueになってたのが原因だったみたいです。
Falseにしたら治りました。
質問があります
Win32Apiだけではないですが教えてください

インターネットをIEで複数開いて、それぞれのWindowに最新F5信号絶え間なくを送りたい
のですが可能でしょうか?

一つ一つのWindowを順番にアクティブにして最新信号を送る方法と
アクティブ、非アクティブのWindowに信号を送るのとが考えられますが
非アクティブのWindowに最新信号(F5)は遅れるのでしょうか?

あと、今のサーバーは最新信号だけでは落ちないようになっていると聞きますが
このプログラムで大量の数のWindowを起動し最新信号(F5)を送っても
効果はあまりなのでしょうか?

どうか教えてください、お願いします m(_;)m
>>152
韓国人かよ
一台からやってもDOS攻撃は意味がない。
155152:04/05/22 22:09
>>154
ありがとうございます
そういえばそのようなこと聞いたことがあったような気がします
では、作っても意味がないのでしょうか?
OS上の限界なのでしょうかね?

window一つでもwindow複数でもサーバーの負担は変わらないのかな

分かりました、別の方法を考えてみます
DDoS推奨。てかなんのスレだここは
157152:04/05/22 22:18
>>156
DDosと言う方法があるんですね
さっそく調べてみます
最近の朝鮮人は2ch派生の顔文字使うらしいよ。NAVERでフレームやってた奴らが広めたらしい。
スレが違う方向に逝ってしまう予感・・・
REM ---DDOS.BAT---
:A
CURL http://www.2ch.net/ > NUL
GOTO A
REM ---EOF---
161デフォルトの名無しさん:04/05/23 02:00
msdn に、

Requirements
Routine Required header Compatibility
malloc <stdlib.h> and <malloc.h> ANSI, Win 98, Win Me, Win NT, Win 2000, Win XP

と書いてあるのですが、malloc は win95 で使えないんですか?
んなーこたぁない。
VC++7.1とかだとそもそもWin95が対象外。
164デフォルトの名無しさん:04/05/23 04:30
HWND button = CreateWindow("BUTTON","Hello",WS_VISIBLE | BS_PUSHBUTTON, ... )
として第8引数にもNULLを指定し、あとでSetParentとSetWindowLongPtr
で親のHWNDとWS_CHILDを追加しているのですがうまくいきません

DWORD button_style = GetWindowLongPtr(button,GWL_STYLE);
button_style |= WS_CHILD;
button_style ^= WS_POPUP;
SetWindowLongPtr(button,GWL_STYLE,button_style);
SetParent(button,window);

ボタンに指定したのと同じ位置,サイズ,キャプションでウィンドウが表示され、その中に
ボタンが表示されてしまいます
ボタンの親をあとから指定することは不可能なのでしょうか?
俺もSetParentしてえ
>>165
イ`
SetParent(俺, 隣のおねいさん);
>>167
まずハンドルを取得汁
>>167
養子縁組を申し込めばOK
養子縁組に必要な書類==ハンドル
養子縁組に必要な条件
(>>167).年齢() < (>>167).隣のおねいさん.年齢()
172デフォルトの名無しさん:04/05/23 14:35
メッセージ等を使わずに
SHIFTキーが押されているかどうかをチェックするにはどうすればいいですか?
GetKeyboardStateとか
GetKeyState
GetShiftKeyState
GetAsyncKeyState
177デフォルトの名無しさん:04/05/23 17:23
LoadBitmap で読み込んだビットマップのピクセルに直接アクセスするには、
どうしたらいいですか?
背景色を GetSysColor(COLOR_BTNFACE) に置き換えたいのです。
178デフォルトの名無しさん:04/05/23 18:51
GetPixelVとかSetPixelVとかで出来るのでない?
Get/SetBitmapBits()
つーかここで〜するAPIはなんですか?とか言ってるヤツでVC使いなら
インテリセンスでそれらしいの探せ
FolderのContext Menu Handlersに自作アプリを追加したのですが、
エクスプローラの左フォルダーツリーから呼び出された場合と
右のファイルリストから呼び出された場合で追加可能アイテム数がかなり違います。
(左約3万、右約140)
この差はどこから来るのでしょうか?
また右の場合の項目数を増やす事は出来ませんでしょうか?
>>179
msdnの目次のほうがいいとおもいます
>>179
今は、SetDIBits()では?
MultibyteToWideCharのコードページ、
CP_ACPとCP_OEMCPを使っている例が多いのですが、
どっちを使うべきなんでしょうか?差がわかりません。
日本語環境ならCP_ACPでおげ
thx!
明示的にSJISから変換したいなら932が正解な気がするが。
Find*Fileのファイル名から変換するのに使用してるんです
932決め打ちだと日本語環境以外で(使うかはともかく)不具合出ませんか?
>>187
システムのコードページを得て変換するのが正解のような。
それなら、CP_ACP で正解。
OEM変換する必要がある環境って触ったこと無い人多そう。
191デフォルトの名無しさん:04/05/24 21:01
GetDlgItemIntってint型しか使えないんだけど、int型の範囲超えちゃうような
数値とかの場合はどうしてるの?
>>191
文字列で取って、自分で扱ってる多倍長整数とかその他の形式に、自分で変換すればいいだけでは?
WM_MOUSEWHEELはwin98でも使えるのにWHEEL_DELTAとかは
_WIN32_WINNT>=0x400でないと定義されないのはなぜじゃ!
もじれつ
もりぜつ
196デフォルトの名無しさん:04/05/24 21:23
>>192
文字列をdouble型に変換するのってどうするんでしたっけ?
197196:04/05/24 21:25
atof関数だったかも
atofはfloatだべ
strtodだ
どっちにしろAPIではないがな
VCではdoubleだが > atof
200デフォルトの名無しさん:04/05/24 22:56
atoi64 は、VC独自仕様?
201デフォルトの名無しさん:04/05/24 22:59
コマンドの標準入出力をゲットしてなにかしらこねくり回そうかなーと思っているんですが、
CreatePipeとか使って標準入出力を他のHANDLEにパイプすることには成功したんですが、
どうもリダイレクトとかパイプとか使用してると、挙動がかわるコマンドってあるじゃないですか?(lsとか)

この挙動がパイプつなげる前と変わらないようにしたいんですが、なんか方法ってありますかね?
正確にはわかりませんが、自分の憶測だと、そういうコマンドって、
内部で、出力先を調べて、結果を変えてると思うんですが、
その調べるときの出力先をダマして教えてしまうような方法がないかなーと思うんですが…
atof()はひょーじゅんでdoubleだろ

ていうかANSI以前では引数だの戻り値だのにfloatだのcharだのといった
型は使えなかったんじゃないか確か
なんでもint, long, double, ポインタ
>>201
むり。
>>201
Unixなら、psuedo ttyを使ってそういう類の仕事をやることがある
はず
tclでかかれたexpectとかはそーゆー目的のツール
のはず
>>202
引数は、
float → double
char,short → int
というルールだけど、
戻り値はなんでもアリだった気が。
>>205
原理的にはできるとおもう
プロトタイプなんてモンも無かったし引数はとりあえずスタックに
プッシュするだけだから、ああなってただけだと思うから

でも、実際にfloatやchar戻してる例なんてみたことないよ
>>201
リダイレクトさせるんじゃなくて、
フッカ潜り込ませて、そのプロセスのコンソール入出力をぶん取る方が確実と思うが。
208201:04/05/25 00:07
>>207
フッカというとHookerのことですか?
フックというとSetWindowsHookExぐらいしかしらないんですが
どんな感じでやるんでしょう?
部分的なITEMIDLIST(IEnumIDList::Next()で列挙した奴)と
そのITEMIDLISTの親のIShellFolderから完全なITEMIDLISTを得る方法はないでしょうか?
210デフォルトの名無しさん:04/05/25 06:09
子ウィンドウにDestroyWindowすると親ウィンドウも破棄されてしまうのですが
子ウィンドウだけを破棄する方法はありますか?
子ウィンドウはWS_EX_NOPARENTNOTIFYを指定してます.子ウィンドウを破棄する前に
SetParent(hChild,HWND_DESKTOP)として親を変えてもだめでした
破棄されないよ
212210:04/05/25 07:01
すいませんあほでした
子ウィンドウのWndProcのWM_DESTROYの中でも
PostQuitMessage(0)していました。。。。。。
>>209
自力で結合させる以外の方法はなかったはず
これの下の方
ttp://www.kab-studio.biz/Programing/Codian/ShellExtension/06.html
とある拡張子に関連付けられたアイコンがあるファイル名と
インデックスを取得するだけのAPIってないでしょうか?

シェル拡張でIExtractIconを利用してるんですが、そこで上書きする
アイコンのロードに失敗した時に、元の奴を表示したいのです。
ExtractAssociatedIconだと、その中でさらにIExtractIconのメンバ関数を
呼び出してStackOverFlowになってしまうみたいで、Explorerが落ちちゃいます。

やっぱり、レジストリを検索するしかないのでしょうか?
>>214
そうですね。
シェルエクステンションを使うということは、しごく当然ですが、シェルからの取得も
そのエクステンションを使用するわけなので、、、

もっとも、アイコンのロードに失敗するという状況自体がおかしいという考えもありますが。
>>214
漏れと同じ事をしようとしている希ガス・・・
>>215
レスありがとうございます。

> アイコンのロードに失敗するという(略
上書きするアイコンは、外部ファイルを利用してアイコンをロードするって
ことをやってるので、一応失敗する可能性もあるかな〜と思いまして。

前の書き込み後、色々調べてSHGetFileInfo()でSHGFI_ICONLOCATIONを
指定する方法も試してみたんですが、バグなのか呼び出し方に問題が
あるのか、どうやっても取得できませんでした。

他に方法もなさそうなので、レジストリ検索にしときます…(´・ω・`)
ファイルがショートカットかどうか判別するAPIはありますか?
拡張子がLnkやUrlで判別するしかない?
>>218
IShellLink Interfaceを使う
C言語なら俺に聞けのスレでおなじ質問をしたんですがスレ違いとのことでこのスレを紹介されてきました

C言語でWindowsを再起動させるプログラムを作りたいんですけどどうすればいいですか?
221デフォルトの名無しさん:04/05/25 23:45
とあるウィンドウのハンドルを取得できたとして、
そのプロセスのコールバック関数から
ウィンドウの一番下にメモかリストボックスを追加して
その上にリサイズ用のバー(スプリッター)を追加したいのですが、
そのようなことは可能でしょうか。
また、それを行う場合どういった方法でやればいいのでしょうか。
>>220
ExitWindowsEx
>>221
よくわからんのだが、既存のウィンドウの下部に外部のプログラムからそういうウィンドウをつけたい、ということかな。
>>223
>既存のウィンドウの下部にそういうウィンドウをつけたい
これはその通りです。

>外部のプログラムから
プラグインのようなものから、ということです。
プロセス・スレッド的にはウィンドウのメッセージループと(たぶん)同一です。
225デフォルトの名無しさん:04/05/26 00:58
不特定多数のエディット
(数が状況によって変化するようなコントロール)
を作成するプロシージャがある場合に
また別のウィンドウのプロシージャで
任意のエディットに入力された文字列を受け取るには
どうしたらいいでしょうか?
外部のHWND型配列にそのエディットのハンドルを格納しておいて
そのハンドルを使ってGetWindowTextで呼び出すという
安っぽい方法なら思いつくのですが・・外部変数使ってるし・・
外部変数に頼らないまたは一般的な方法ありましたら教えてください
おねがいします。
>>225
俺なら共用データクラスを作るが。MFCならCDocumentにつっこむ。
HWNDではなく、文字列そのものを。
てか、スレ違い。
227デフォルトの名無しさん:04/05/26 01:22
即レスどもです

共有データクラスってなんですか?
ググッってみたのですがヒットしませんでした
ちなみにMFCもまだ
使えませんT T
Win32APIもCも猫やら本やらで勉強中の身で。

てかスレ違いですか!
このような問題に対処する方法は
Win32APIに限られたものじゃないから ってことですか?
>>225
文字列を受け取りたいエディットコントロールのIDがわかるなら
GetDlgItemText()を使えばHWNDの配列なんて必要ないよ。
229225:04/05/26 12:25
>>228さん ありがとうございます
なんだか前よりずっと綺麗にまとまりそうです

そこでまたまた初心者質問で申し訳ないのですが
親ウィンドウのWM_COMMAND以外にmenuIDが参照されるタイミングを
知らないので思ったのですが
兄弟ウィンドウの中でかぶらなければ
menuIDはどんな値にしてしまってもいいんでしょうか
多くのコントロールを必要とするプログラムの場合
その値を普通はどうやって決めるのでしょうか
兄弟ウィンドウでかぶらなければ適当に決めてよい
231225:04/05/26 12:53
そうですか!
ありがとうございました
Win32API 直でPG組んでる人って、まだ多いん?
もうとかまだとかいう話じゃねーと思うんだが。
あながち多いん?
ぞんがい多いよ
オブジェクト思考とか、イベント駆動型についていけない人達と思っていいか?
Win32APIの窓プログラミングを非イベント駆動で組む方法を教えてください。
そうやって優越感に浸っているのがいいよ。
オブジェクト指向と何の関係が...
自分は進んでいると思っているキチガイの中の人か?
イベント駆動ってメッセージ処理そのものなんじゃ…
236は無知でド低脳な人だと思っていいか?
直の方がプログラムの流れが一目瞭然で良いが、
MFCを覚えてからは、こっちの方が楽で良いな。
でも旧来のやり方が好きな人もいるでしょうし、人それぞれで。
Win32API直PGを経験してる方が、MFCなどに移ってもなにかと有利だと思う。
243236:04/05/26 14:15
大量(プゲラ
大漁ね
245236:04/05/26 14:18
また釣れた(プゲラッチョ
釣りって事にしないとやってられないよな
無能な奴にかぎって変なプライド持ってたりするからな。
ウチの会社にも居るんだけど何とかして欲しい…
こういう馬鹿話はマ板でやってくれんか
>>247
どうにもなりません。
無能なヤツは自分が無能であることに気づく能力も
自分の無能さを認める能力もありませんので。
質問させてください。

任意のタイミングで、フォーカスされているコントロールの HWND を
取得したいのですが、これは可能でしょうか?

既存のプログラム(ソース無し)を外部から操作したいと考えているため、
フォーカスイベント発生時にそのコントロールの HWND をグローバル変数に
保存しておくという方法が使えません。

素人ながら調べているのですが解決策へたどりつけていません。
可能か/不可能か、可能ならば参考情報へのポインタを教えていただけ
ませんでしょうか。宜しくお願いいたします。
GetFocus・・・。
まちがい・・・。
>>250
GetForegroundWindow()って違うかな?
今MSDNで調べて知ったばっかりだから自信ない。
>>251-252
いろいろ試したのですが、GetFocus だと「トップウィンドウ」レベルの
HWND しか取得することができませんでした。
なにか妙案がありますでしょうか?

もう少し書くと ListView/TreeView コントロールが複数あり、その中のどの
ListView/TreeView コントロールがフォーカスされているか、もしくは
いずれもフォーカスされていないかを調べたいと試行錯誤しています。
>>254
EnumChildWindowsで列挙してGetFocusと比較する。
ただし君の言っている仕様が曖昧なので、これだけでは満たしていない可能性もあるが...。

>>254
GetWindowThreadProccessIDでスレッドID取得して、
AttachThreadInput すれば、子WNDまで調べられる。
>>251-253 >>255
GetFocus と解をいただいたので、再度試行錯誤したところ、
GetFocus で目的の HWND を取得することができました。

今まで失敗していたのは、フォーカスのある HWND を調べようと
している手続きの中で、自分でフォーカスのある HWND を変更して
しまっていたためでした。。

こんな単純なことにお手を煩わせてしまい申し訳ございませんでした。
258251=252:04/05/26 17:06
なんだ、あってたのか
SetWindowsHookExで他プロセスにフックかけたいんですけど、
特定のアプリひとつ(電卓一個限定とか)に対するフックでもdll要りますか?
要る
WM_GETTEXTを SendMessage してやるとテキストが取れるのに、
GetWindowText だと取れないことがあるのは仕様ですか?
どんな時に取れないんだ?具体例を出してくれ。
msdnを参照しないのも仕様ですか?
仕様です、あきらめてください。
>>261
同じプロセスで?
>>261
もし違うプロセスなら、>>256調べてみ。
267261:04/05/26 23:28
違うプロセスが開いたダイアログのEditControlの文字列を取ろうとしたんですが、
EnumChildWindows、WindowFromPoint、spy++のプロパティのどれで取得したhWndでも
WM_GETTEXTだと取得できて、GetWindowTextだと取れませんでした。
ダイアログのEditコントロールで再現性が高いです。
Platform SDK - GetWindowText Fucntion

>The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer.
>If the specified window is a control, the text of the control is copied.

>However, GetWindowText cannot retrieve the text of a control in another application.

ついでに、
Remarks

>To retrieve the text of a control in another process,
>send a WM_GETTEXT message directly instead of calling GetWindowText.

というか、なぜリファレンスを当たらないのか理解に苦しむ。
271216:04/05/27 00:08
あ、あれ…?

Remarks
This function causes a WM_GETTEXT message to be sent to the specified window or control.

漏れのはここまでしか書いてない…
素直にmsdn最新版入れてきます…スマソ
>>270
> というか、なぜリファレンスを当たらないのか理解に苦しむ。
∵仕様だから
273デフォルトの名無しさん:04/05/27 02:09
C++相談室から移動してきました。

VC++をコンパイラに使って、簡単な実験プログラムをMFC使用せずに
ネットのソースや猫でもわかるを見て試行錯誤してるのですが。
現在作ろうとしてるのが初めてDialogをメインでCreateWindowなどを使わない方法なのですが、
どうもDialogリソースにクラス名を入れると起動後すぐに終了したり、
WM_KEYUPなどのウィンドウメッセージが反応しないなどの壁にぶつかってます。
特に後者はどのようにしたら解決出来るでしょうか?WM_COMMANDなどは正常に反応します。

Window生成したソースだとちゃんとWM_KEYUPなど動いてくれます。
いまいち生成されたWindowとリソースエディタで作ったDialogの違いが分かってないようです。
Dialogを、この生成されたWindowのようには扱えないのでしょうか。
どうかご教授よろしくお願いします。
WM_INITDIALOG
ダイアログ自体がWM_KEYxxを処理してどうしようと。
フォーカス持たないのに。
「Windowsゲームプログラミング」
http://www.amazon.co.jp/exec/obidos/ASIN/4797325453/

“ゲームプログラミング”と銘打っているが、実はれっきとした
Win32 API入門書。著者は↓の作者。
http://black.sakura.ne.jp/~third/system/winapi/win.html
277デフォルトの名無しさん:04/05/27 11:26
ウィンドウの最大化ボタンや×ボタンを動的に付けたり消したりする事はできますか?
>>277
できる。
279277:04/05/27 13:32
よかったらそのAPIを教えてくれませんか?
>>279
SetWindowLong
281273:04/05/27 15:34
試行錯誤してて遅れました。。
確かに一旦Dialogから他のコントロールにフォーカスの移動(?)したらWM_KEYxxは働きませんでした。
>>276 にある「ダイアログウィンドウ」という項目の通りにウィンドウのようなクラス登録をしたら、
WM_KEYxxは初期状態では働きましたが、どれかのコントロールをクリックしてフォーカス移動(?)したら働きませんでした。

具体的には、ショートカットキーやEscで終了、、などをしたいんですが・・・。
1.普通にコントロールをサブクラス化する。
2.メッセージループでコントロールのメッセージを横取り
283273:04/05/27 18:29
サブクラス化を調べて、実際にやってみたところ、
WM_CREATEのところで、OLEの登録の後にサブクラス化をやったのですが、
どうも GetDlgItem 関数でのハンドルの取得が上手く行かないようです。(NULLが返って来る)

どのコントロールを指摘してもダメだったのですが、ダイアログウィンドウにすると、
別の関数でやるか、あるいは最初から一つずつCreateWindowでコントロールの生成しなければならないんでしょうか?
ダイアログウィンドウではなく、そのままにして WM_INITDIALOGのところでサブクラス化したら上手く行きました。
これで、コントロール一つずつサブクラス化すれば WM_KEYxx は拾えそうですが、結構長くなってしまいそうです。
284273:04/05/27 19:20
追記。
resource.h を見て、for文で一つずつサブクラス化してみたりしたのですが、
どうもリストボックス以外をサブクラス化したり、その順序によっては、
それぞれのコントロールが消えたり無効状態になってしまいます。。。
例えばリストボックス→その他のコントロールにすると、リストボックスが灰色になります。
ただし、クリックしてWM_KEYxxメッセージはちゃんと受け取るようです。
お客様の中に、無駄に親切な超能力者の方はいらっしゃいませんか?
286デフォルトの名無しさん:04/05/27 19:51
>>285
はいっ! 曲げたスプーンを元に戻すことが出来ます。
>>273
何か根本的なコーディングミスを犯している気がする。
2重投稿がここだけ無い…
すげー さすがWin32APIスレ…
289デフォルトの名無しさん:04/05/28 09:49
VC++アプリからVBアプリが起動しているかどうかをFindWindowで探す方法はありますか?
VBアプリだとみんな同じクラス名になってしまうようですが。
ちなみにVBはV6です。
VBアプリが起動している事を検出するだけなんだから、
みんなおなじクラスでも問題ないと思いますが?
与えられたパスがフォルダかファイルかを知るには
どうしたらいいんですか?
おすぃえてー
>>291
オープンできたらファイル
>>291
APIでやるなら、GetFileInformationByHandleだろうな
Cランタイムも入れると_statあたりが楽かと
>>292
それダウト。
使う関数にもよるけど、CreateFileはディレクトリでもオープン可能。
GetFileAttributesでいいじょん
GetFileAttributesは?
297293:04/05/28 11:15
>>295-296
む、すっかり忘れてた。
なんで、面倒な>>293のしか出て来なかったんだろう…(´д`;)
同等のCランタイム関数まで出てるのに orz
>>292-297
みんなみんなサンキュー
デスクトップやスタートメニューのパスを取得するにはどうすればいいですか?
SHGetSpecialFolderLocation
CSIDL_DESKTOPDIRECTORY
CSIDL_STARTMENU
>>293
賢い俺ならPathIsDirectory()けどな
>>299
SHGetSpecialFolderPath()
Path系のファンクションって
あまり知られていないのな
shlwapi。。。普及面からいえば、ほぼ間違いなく使えるはずだけど、
使えないかもしれないとかいろいろ考える。
>>303
IE4とかが必要だから、敬遠しててそれっきりだな。
95とかNT4以下を切り捨てればいい
もうとっくに切り捨ててはいるけど、なんか使いたいと思わないんだよな。
IE依存というのが、気分的にイヤ
気分でオナニー出来る奴はいいなぁ
Path系ファンクションっつーと、どしてもBegiPathとかそっちの方面を思い出す漏れ。
MAX_PATH 縛りがあるから却下<path系
Path系APIってlocale考慮してくれるの?
>>312
システムロケール固定だけど。
fopenしてNULLが帰ってきたらディレクトリ。
315314:04/05/28 19:12
スマソ。リロードしてなかったよ・・・
ちゅうか一応 API スレだし…
317デフォルトの名無しさん:04/05/28 23:16
こんばんは、質問よろしいでしょうか。
画像を何十個と表示したい場合、初期化関数などを別に作って、WndProcの中
のWM_CREATEなどでは、初期化関数を呼び出すだけにしたいのですが、
初期化関数で作ったビットマップハンドルを、自作描画関数で使おうと思うと
するとうまくいきません。
みなさんはどうしてるのでしょうか?
やはりグローバル変数を使用するしかないのでしょうか。
いろいろなハンドルがごちゃごちゃになって、手に負えません。。。
C言語で質問に上がろうと思いましたが、一応ウインドウの話題だと思い
こちらに質問させていただきました。
>うまくいきません。
うまくいかないとは、いったいどのような結果になり、
それがどのように問題なのかという、、
一番重要な部分を書かずに質問するのは何故ですか?
>>318
初心者だから。

知らない人間は何が悪いかさえわからないので
質問するときは、自分で判断せずにあらゆる情報を書き込むべきだと思う。
まずは住所氏名年齢電話番号好きな歌手好きな言語嫌いな言語好きな板嫌いな板ぐらいは書くべきだよな。
いま好きな人がいるかどうか、が抜けてるぞ、おい。
>>317
WndProcの中で同じ種類のハンドルだけを集めて配列または構造体として定義して、
各関数へはその配列または構造体へのポインタを渡すようにすればいいのでは?
この場合、ビットマップハンドルってことだから…
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 static HBITMAP hBitmap[N_BITMAPS];
 …
 switch (uMsg) {
 case WM_CREATE:
  InitMyBitmaps(hBitmap);
  …
 }
 …
}
ってな具合。
質問の意図とは的外れの答えだったらスマソ。
オーナードローとかで描画する際、
ウィンドウ内の全部のコントロールの描画が終わったことって
どうやったらわかりますか?
wm_createの時点だとまだ形が無くて、
wm_drawitemだと一つ一つかいてる状態で・・・
終わったときにおくられるメッセージとかあったら
教えてください
>>321
いや名前も要る
バカジャネーノ( ´,_ゝ`)
>>323
描画の終わりって何よ?
今あるコントロールを全部一度描画したよ、みたいなことを
言ってるつもりなんですが
そういうのはメッセージで来ませんか?
来ません
んじゃ、ウィンドウ全体の画像を自動で保存したいときには
どのタイミングで取り込めばいいんですか?
cpu君の手が空いたとき
起動して1時間経過後のタイミングでお願いします。
たぶん描画が終わってます。
一時間だと暇だったので、別のウインドウを開いていたら、それが取り込まれました。
残念な結果です。
1時間経過後、スクリーンセーバーが立ちあがっていた罠
掃除のおばさんがコンセントを抜いてた。
>>329
自前でビットマップに描画してやればいいんじゃね?

自動でないのなら、キーボードの入力などをトリガーにすればいいと思うけど。
自前でビットマップにボタンとか描画ってのは
オーナードローで描画するってことですか?
それとも、createwindowでつくったやつらを
自前でビットマップに描画することとかできるんですか?
ツリービューでトップレベルのアイテムが表示される際に、
テキスト(またはアイコン)の左側にちょこっとスペースを空けることって
簡単にできないでしょうか?
何にもしないと、ツリービューの左端にくっついた感じになるんですが。
WM_NCCALCSIZEだっけな。
こいつで左端をずらしてやればいい。
OnIdle
340デフォルトの名無しさん:04/05/30 02:07
ListViewでLVS_EX_CHECKBOXESのスタイルを設定すればチェックボックス
付きの行ができますが、このチェックボックスをオン・オフしたときに
なんらかの反応をさせたい(コールバックなど)場合はどうすれば
よろしいでしょうか?

ご教授お願いします

LVN_ITEMCHANGED
適当にどんな順番でコントロールに対して
WM_DRAWITEMが発行されてるのか見てみたら
createwindowしたのとは逆順だったんですが、
(最初にcreatewindowしたやつが最後にwm_drawitemメッセージ出されてた)
これって絶対そうなんですか?
それともたまたま?
>>342
たまたま
>>342
きんたま
ω
(´・ω・`)
347デフォルトの名無しさん:04/05/30 17:07
WININETでWebページの読み込みを行っています。
ユーザが「読み込み中止」ボタンを押したら、読み込み処理を中断する方法はあるでしょうか?
348347:04/05/30 17:10
あ、InternetOpenUrlやInternetReadFileがいつまでたっても戻ってこないような状況を
想定しています。
349340:04/05/30 17:13
>>341
ヒントありがとうございます
そのまわりを調べてテスト実装してみたのですが、
そもそもチェックボックスのオン、オフ操作でNotifyメッセージにも飛んでいないようです。
何か最初に設定しておくべきフラグとかあるのでしょうか?

GetDeviceCapsをつかって、Bitbltが使えるかどうかを調べたんですが
XPでは返値が0で98seだと260になりました。
これってどういうことですか?
すみません、使い方間違ってました。。。
orz
352デフォルトの名無しさん:04/05/30 19:45
矢印やファンクションキー等、2バイト文字のWM_...を教えてください。
1バイトはWM_CHARで、wParamに文字が入っているのでできるのですが。
wParamはいつから1バイトになったんだ?
354352:04/05/30 20:16
>>353
そう意味ではないです。wParamはたぶん4バイトだと思います。
1バイト文字を押した時、WM_CHARメッセージが発行され、
wParamに文字が入りますが、
2バイト文字を押してもWM_CHARは発行されず、
当然wParamを調べる意味はありません。
WM_WIDECHARみたいなメッセージを探しても無いですし。
imechar
356353:04/05/30 20:27
WM_KEYDOWN
357352:04/05/30 20:42
>>355
WM_IME_CHARは文字列?のですかね。
調べたのですが、難しくて分かりませんでした。
ただ、調べているとき、WM_KEYDOWN + VK_... で出来ることが分かりました。

お二方どうもありがとうございました。
358352:04/05/30 20:56
>>356
すいません。リロードされていなくて。
まさしくそれでできました。ありがとうございました。
359347:04/05/30 21:02
>>347ですが、非同期アクセス時のINTERNET_STATUS_CALLBACKの解説で、

INTERNET_STATUS_HANDLE_CREATED
Used by InternetConnect to indicate it has created the new handle.
This lets the application call InternetCloseHandle from another thread,
if the connect is taking too long. The lpvStatusInformation parameter
contains the address of an INTERNET_ASYNC_RESULT structure.

という記述があり、ハンドルを別スレッドからクローズしてしまえばいけるんじゃないかと予想。
ので、そこらへんを試してみます。でわ。
ふと思ったのですが、
メッセージキューってスレッドセーフなのでしょうか?
複数のスレッドから特定のウィンドウにPostMessageするプログラムを書いてて思いました。
スレッドセーフだよ。
だからキューが一杯だと PostMessage は失敗する。
送る方はね。

受ける方はスレッド単位にキュー持ってるので、
そもそも他のスレッドのキューは見れない。
>>361
レスありがとうございます。
PostMessageの戻り値だけ意識すればよいので、楽でよかったです。
windows.hで定義されているTCHARは
UNICODEが定義されていればWCHARで、
そうでなければcharでtypedefされていますが

ソースファイル上、windows.hより上には大抵何も記述していないし
何もインクルードしていないはずですが
コンパイル時にプリプロセス処理される時
このUNICODEというマクロはどこで定義されているんでしょうか?
コンパイラオプションじゃねーかー
365362:04/05/31 08:17
レスさんくす。

ぐぐったら自己解決しました
コンパイラの事前定義マクロだったんすね
事前定義マクロっていうと、__FILE__とか__LINE__とかみたいで紛らわしいからヤメレ。
367デフォルトの名無しさん:04/05/31 13:26
>>341
ヒントありがとうございます
そのまわりを調べてテスト実装してみたのですが、
そもそもチェックボックスのオン、オフ操作でNotifyメッセージにも飛んでいないようです。
何か最初に設定しておくべきフラグとかあるのでしょうか?
368デフォルトの名無しさん:04/05/31 15:01

あるスレッド( たとえば、GetCurrentThread で取得したスレッドハンドル が指しているスレッド)が、プライマリスレッドかどうかを知るにはどの API を利用すればいいでしょう?
Windows2000で、ユーザー補助のシリアルキーデバイスの設定情報を取得したり、
設定したりするにはどうすればいいのでしょうか?

SystemParametersInfo関数の、SPI_GETSERIALKEYSや、SPI_SETSERIALKEYSは、
WindowsNT/2000では未サポートとMSDNに書いてあったのですが、コントロールパネル
からシリアルキーデバイスの設定を行う事は可能なので、、何か別の手段があると思うん
ですが…
>>368
そのスレッドに結び付けられたWindowハンドルを取得してみれば判断できると思うが。
371370:04/05/31 15:35
GUIアプリに限るか。
プロセスのスレッド一覧を調べて、1番最初のだったら、でも判断できるかな。
372368:04/05/31 17:57
>>370 に言われたとおり、
CreateToolhelp32Snapshot で、スレッドの一覧を取得し、
現在のプロセスで検索してみました。
確かに、先頭にプライマリスレッドがきます。
ありがとうございます。

ところで、実験していて気がついたのですが、
::GetCurrentThread() でスレッドのハンドルを取得すると、常に -2 が
帰ってきているようなのですが、これはなぜなのでしょう?
>>372
MSDN嫁ばわかるが、定数が返るそうだ。
>>369
あの文面を見ると、おそらくAPIとしては無くなってるんじゃない?
直接レジストリ操作しか無い気がする。
LoadImageとかCreateDIBSectionとかした後に
GetLastErrorをすると、8が返ってきて
で、8の意味が記憶領域が足りないってことみたいなのに
ちゃんと画像はうつるのは何で?
このエラーはどういうことなの?
>>374
なにー

コントロールパネルの[ユーザー補助]-[全般]-[シリアルキーデバイス]の
設定をちまちま弄って[適用]ボタンを押しても再起動を要求されないから
レジストリじゃないと思ったんだけどな(´・ω・`)

レジストリを比較してみるよ…(´・ω・`)
377368:04/05/31 19:25
>>373
確かに書いてありますね。見落としていました。
擬似ハンドルを API に渡すと、ハンドルとして理解されるという部分は面白いですね。

ということは、プライマリスレッドで取得した擬似ハンドルをグローバル変数に保存しておいて、
ワーカースレッドからそれを参照すれば、その擬似ハンドルはワーカースレッドとして解釈されるわけか。
知らないとエライ目にあいそうだ。
>>375
MSDN引けば分かるが、"全てのAPIが成功時にSetLastError(0)を呼ぶわけではない"から。
基本的にAPIが失敗したときに情報を伝えるためなのがSetLastError/GetLastError。
>>378
じゃあ、あまり神経質に気にすることでもないってことですね
エラーが出てないのにGetLastErrorをするなということだ
なんだったか、返り値でエラーになってるんでGetLastErrorしたら分けわからんコードが出て、
不審に思ってAPI呼び出し直前にSetLastError(0)を入れたら案の定エラーコードが0になって
結局そのAPIがエラーコードセットしてないだけじゃねぇか、ってのはあった気がするな。

あとまぁ、Win9xで16bit側に実体があるAPIはそもそもエラーコードをセットしないとか。
382デフォルトの名無しさん:04/05/31 20:36
こんにちは、C++初心者です。
私はC言語を少しかじった程度で、Win32APIでダイヤログベースのアプリを勉強中です。

ダイヤログのテキストBOX(?)に、例えば、LANカードのデバイスマネージャーのリソースの
一つであるI/Oポートアドレスを表示させたいと思っています。
しかし、レジストリエディタで探してもI/Oポートアドレスが何処にあるのか分かりません。

RegOpenKeyEx等で取得出来るものでしょうか?
何かの本に、Win95・98系はiniファイルに格納され、NT・2000・XPはレジストリに
格納されるとか書いてあったような気がしますが自信がありません。

どなたか初心者の私でも分かるように、アドバイスをお願いします。
383デフォルトの名無しさん:04/05/31 22:45
VBで、APIを使ってFTPからダウンロードするソフトを作ってるんだけど、
FTPに何個ファイルがあって、フォルダ構造もどうなっているか分からない
状態で、1ファイルずつすべてのファイルをダウンロードしていくことって
できますか?
>>383
そのようにプログラミングすればできます。
385 :04/05/31 22:46
>>384
383じゃないが糞レスするくらいなら書き込むな。
>>385
384じゃないが可能か不可能かを聞いてるんだろ?
384じゃないが、脳味噌の代わりに糞が詰まってる385は氏ね
ローカルのディスク上のファイルをFindFirstFile()から列挙する方法を知っていれば、
FtpFindFirstFile()とかまんまな名前のAPIがあるんでそれでいける。
>>383
とりあえずFTPについて勉強し直せ。
これって WIN32API の話か?
APIを使って出来るか、という質問だからオケだろ。
ちなみに388の方法でも必ず出来るとは限らないわけだが、
出来ない場合にはどうやっても出来ないのでしょうがない。
http://www.kumei.ne.jp/c_lang/index.html
ここいろんなところで紹介されてるけど、なんかすごく読みにくいな。
プログラムソースを全部示して、そこにコメント文を挿入すればいいのに
余計な親切で、プログラムをぶちぎっていろいろ書き込んでるからプログラムの
全体構成とかつながりがわかりづらい。
そんな感想文を書くスレじゃないんだよここは。
ここは私の日記帳。
タスクトレイに常駐するアプリで、何か知らせたいことがあるときに
黄色いポップアップヘルプ?(htmlでいうimg alt="hogehoge"のような)
を出すものがあるんですが、こういうの出すにはどうすればいいんでしょうか?
WinHelp()を使うよーなそうでもないようなことをちらほら見るのですがいまいちわからず…。
NIN_BALLOONSHOW
GetMessage()は、メッセージキューにメッセージが無い場合
・メッセージを取得するまで内部でループ(待機)しつづけるのか
・メッセージが無ければ、終了してリターンするのか
どちらで実装されているんでしょうか?
スレッドサスペンドしてメッセージがくるまで寝てる
レスさんくす。
要するに上のレスなら前者が近いということですね
>要するに上のレスなら前者が近いということですね

寝てるのとループでアイドルしてるのとは大違い
402デフォルトの名無しさん:04/06/01 13:10
誰か367の問いにも答えてやれyo
困り果てているじゃないか
367=402
404デフォルトの名無しさん:04/06/01 13:51
システムフックでキー入力の特定の"文字列"だけを奪い取る事ってできますか?

たとえば"ABCDE"という文字列の場合は奪ってしまい、それ以外の文字列は
本来のソフトに素直に渡すという動作です。
#1文字だけでの判断は問題ありませんが、前後数文字の組み合わせで
#比較しなければならない状況のことです

USBに付けた装置が、不定期に数種類のパターンをキー入力扱いで送ってくるので、
これを調べて上記動作をさせたかったのです。キーフックだと1文字ずつの処理に
なるため、'E'を受け取るまで"ABCD"の処理を遅延したいと考えましたが、
次に'E'が来ない場合は速やかに"ABCD"を本来のアプリに送らなければなりません。

WH_KEYBOARD意外に適切な方法がありますか?
かなりはまってます。どなたか指針だけでも示してもらえると大変助かります。

>>367
もれだったらさー,いろいろ文献漁るの面倒臭いんで
メッセージループの部分で
 while (GetMessage(&msg) > 0) {
  catch_message(&msg); // これな
  DispatchMessage(&msg);
 }
みてーな関数挟むんだよ。
この catch_message() の中では WM_MOUSEMOVE とか WM_NCHITTEST とか
眠てーメッセージは全部無視して,あんま見かけないメッセージだけを
リストアップするわけよ。
結構いいヒントが出てきたり,そうでなくてもマジ勉強になったりするからよー。

つーかもれもListViewの事あんまよく分かってねーです。スマソ。
何故Spy++使わないのだ…。
>>404
その「USBに付けた装置が送ってくるキー」の間隔の最大時間を計って、
キーが入力されなかった時間が、その最大時間を超えた場合、タイムアウトとして
今まで横取りした文字を本来のアプリに送れば良いんじゃないの?
408404:04/06/01 14:48
>>407
その方法だとアプリ起動中は、他のアプリへのキー入力も
微妙なタイムラグが生じるようになりますよね?

でも、装置からの受信はせいぜい1秒程度だと思う(未計測)ので
一応その方針で実装してみます。

# キー入力時にどのキーボードから入力されたかを知る方法って
# ないんですかね。。。もしあれば一発なんですが。

レスありがとうございました。
spyでWM_NOTIFYの情報展開してくれるとうれしいんだけどなー。
ただでさえコモンコントロールって多機能なんだし。
410デフォルトの名無しさん:04/06/01 16:21
>>407の手順だと、途中の文字のHook時点では、基本的に
CallNextHookExしないでreturn TRUEすることになるよな

ということは、他にKeyboardHookしているソフトが存在した場合
そのソフトへのHookを殺すことにならないか?
>>409
もまいSPY++の作者知ってて言ってるのか?
Spy++ copyleft Microsoft Corp. 1995
Control Spyというのが昔あった気がするが。
DirectDrawを使用せず
オフスクリーンサーフェイスのアドレスを取得し直接描画をしたいのですが
どのようにすればいいのでしょうか
>>408
特定の USB デバイスからのキー入力の処理だったら、
「Raw Input」の関数群を使えば出来そうな気がするが…

使ったこと無いけど、なんとなくそれっぽい関数があるよ。

GetRawInputDeviceInfo
GetRawInputDeviceList
GetRegisteredRawInputDevices
RegisterRawInputDevices

ただ…面倒くさそうだw
>>413
MSJにあったやつだな。あれはかなり参考になった。
ダイアログボックス(hWnd)のコンボボックス(COMBO)に"+","−","×","÷"と入れたくて
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"+");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"−");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"×");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"÷");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_SETCURSEL,0,0);
という風に書いたんですが、うまく入りませんでした。

どうすればいいんでしょうか?
文字列とは何かを考える
自称エスパーの父が「WM_INITDIALOGに書け」と申しております。
>>414
CreateDIBSection() のことかい?
>>417
>>418, >>419とは別の視点でいくと…
コンボボックスの高さのサイズを、小さく設定しすぎてる。
昔、これではまったことがある。
つーか、よくそんな長ったらしい行を4回も書く気になるなぁ。
>>420
ありがとうございます
調べて使ってみます
>>414
WinG を使ってみるとか。
>>424
ググってもよく分かりませんでした
DIBSectionと同じものと考えてよいのでしょうか
426デフォルトの名無しさん:04/06/02 00:58
GetUserName()で取得できるユーザー名ですが、
WindowsXPでコントロールパネルから「ユーザー名の変更」を行っても、
変更前の名前が出てきます。
ログオン時に入力する名前や、スタートメニューに表示される名前は
変更後のものになっています。
しかし、環境変数 USERNAME も変更前の名前でした。

「ユーザー名の変更」に対応した名前を取得するにはどうすればいいんでしょうか?
>>426
アカウント名、フルネームって知ってるか?
GetUserName()で取得できるのは、アカウント名だろ。
ログオン時に入力する名前や、スタートメニューはフルネームを表示しているだけ。
>>426
GetUserNameExの方を使え
429405:04/06/02 01:06
>>406 spy++でもいいけどさーって書き込もうとしたら
なんか書き込めないままバイトの時間になちゃてよー。

つーわけで >>367 へ。spy++でもいいけどさー。。。
430405:04/06/02 01:15
いやちょと待てよ。SendMessage()されたメッセージは
メッセージキューには溜まんねーんだよな?
じゃあ,405の方法はまったく中途半端じゃねーか。
spy++の方が*断然*いいなー。。。
Spy++知ってたら>>405見たいなレスしないだろ…
432405:04/06/02 01:28
orz...
そう、気を落とすな。

434405:04/06/02 01:34
>>431
言い訳させて言い訳。
もれの spy++ がなぜか起動しなくなちゃたわけよ。
再インスコしても,アタシ全然だめーみたいな。
だからもれいつも405みたいにやってたり
WndProcの中であんなことやこんなことしたりしてる。うへへ。
spy++の事はぜんぜん頭に無くなったね。
>>434
いっぺんレジストリ覗いてspi++関係の設定削除してみろ
436426:04/06/02 01:59
>>427,428
ありがとうございます。早速試してみました。
とりあえず、自分のマシン(Windows2000)で、
EXTENDED_NAME_FORMAT に列挙されている値全てに対して
GetUserNameEx()を呼び出し、結果を画面に出してみました。
すると、
 SamCompatible - 'マシン名\ユーザー名'
 DnsDomain - Error 87
 あと全部 - Error 1332
となりました。
Error 1332 は ERROR_NONE_MAPPED らしいです。

問題のマシンでもテストするつもりですが、
ほとんどエラーになってしまったのが心配です。
テストしたソースを貼らせてもらいますんで、突っ込みあればお願いします。
437426:04/06/02 02:01
#include <stdio.h>
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <Security.h>
struct named_format { EXTENDED_NAME_FORMAT id; char const* name; };
#define NAMED_FORMAT( Symbol ) { Name##Symbol , #Symbol }
struct named_format const formats[] = {
  NAMED_FORMAT( Unknown ),NAMED_FORMAT( FullyQualifiedDN ),
  NAMED_FORMAT( SamCompatible ),NAMED_FORMAT( Display ),
  NAMED_FORMAT( UniqueId ),NAMED_FORMAT( Canonical ),
  NAMED_FORMAT( UserPrincipal ),NAMED_FORMAT( CanonicalEx ),
  NAMED_FORMAT( ServicePrincipal ),NAMED_FORMAT( DnsDomain ),
};
#define NUM_FORMATS ( sizeof( formats ) / sizeof( formats[0] ) )
#define NAME_BUFFER_SIZE 1024
int main()
{
  int i;
  for( i = 0 ; i < NUM_FORMATS ; ++i )
  {
    struct named_format const* const format = &formats[ i ];
    TCHAR username[ NAME_BUFFER_SIZE ];
    ULONG buffer_size = NAME_BUFFER_SIZE;
    if( GetUserNameEx( format->id , username , &buffer_size ) )
      printf( "%s - '%s'\n" , format->name , username );
    else
      printf( "%s - Error %d\n" , format->name , GetLastError() );
  }
  return 0;
}
438デフォルトの名無しさん:04/06/02 04:16
インターネットの接続時間(継続時間)を取得したいんですが
どうやれば出来ますでしょうか?
レジストリとかから取得するんですかね?
まず、「インターネットの接続時間」とやらを定義してみろ。
440438:04/06/02 05:21
>>439
え〜と、ネットに繋いでいる時にタスクトレイのアイコンから
状態確認した時に「継続時間」と表示されているものが自分で取得したいんです。
取得できるAPI関数とかありますか?
>>438
てか、>>439の質問の答えがわかれば、どうすりゃいいか分かるんじゃねーか?
442438:04/06/02 10:42
>>441
さっぱりです。。。
一体どういう事なんでしょう?
>>438
Win32_NetworkAdapterで検索してみな
444デフォルトの名無しさん:04/06/02 15:17
2つのレジストリハンドルが同じキーを参照しているかどうかを
チェック判断する方法を探しています。

とりあえず、ハンドルからキーのフルパスを取得して文字列を比較すれば
いいかなと思い RegXXX 系の API を調べてみたのですが、完全キー名を
取得できる API は見つかりませんでした。

何か良い方法は無いでしょうか?
RegQueryInfoKeyで得られるすべての情報を比較するとか、
ハンドルを比較するという設計を見直すとか。
int WINAPI WinMain(ry
{
  //LoadLibrary("user32.dll");
  ATOM atom = GlobalAddAtom("null po");
  if (atom != 0) GlobalDeleteAtom(atom);
  return nAtom;
}

user32.dllをロードしないとGlobalAddAtomが成功しないのは仕様なのでしょうか?
447446:04/06/02 16:56
×return nAtom;
○return atom;
え?
>>446の環境では、user32.dllをロードすると、
そのコードでも行けるん??
>>436
亀レス、スマソ。
NetUserGetInfo()を使えばおけ。USER_INFO_10のusri10_full_nameあたり。
GetUserNameEx()だとドメイン認証していないとだめだったね。
451デフォルトの名無しさん:04/06/03 03:33
今、半透明ウィンドウのコードを書いているんですが
一旦、半透明スタイルを設定していまうと
スタイルをもとに戻しても、重いままになってしまいます。
実際タスクマネージャーで見ると、設定前のCPU使用率より上がってしまったままになってます…
何か解決策はないでしょうか?

以下がコードです。

//半透明設定
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0, 128, 2);

//半透明解除
SetLayeredWindowAttributes(hWnd, 0, 255, 2);
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
>>451
MSDNの例示では、解除の時にRedrawWindowを呼んでるけど、
それでもダメ?
スタイルを変更した後はSetWindowLong等を遣うべき
っていうかAPIでそれ以外に何か方法あるの?
CWnd::ModifyStyleとかでなくて?
455デフォルトの名無しさん:04/06/03 11:55
XPて標準でZIP圧縮できますが、これを自分のソフトでDLL無しでやる方法を教えてください
>>455
zip圧縮のロジックを実装するだけ。
どこかからパチってきてもいいけど。
>>455
zlibにzip圧縮・伸張のサンプルが付いてる
というか、そのままzlibを使えばいいんじゃ・・・
あの辺のライブラリって日本語ファイル名とか大丈夫だったか?
>>460
ライブラリ側でパスの分割とかするわけじゃないから問題ないんでないの?
とりあえず、トラブッたことないなあ。

心配なら「表」とかの\を含むファイル名でテストしてみればいい。
462458:04/06/03 13:24
>>459
だからzlibの使い方のサンプルがあると言ってるんだが
>>455がzip圧縮をしたいのか、単に圧縮をしたいのかは微妙。
464451:04/06/03 14:08
>>452
原因が分かりました。
裏DCバックバッファを使ってウィンドウにビットマップを描画してたのが原因らしいです。
どうやら、一旦裏DCに描画した後、表DCに転送する処理をして尚且つ、
半透明ウィンドウ設定をすると、いっきにCPU使用率が上がってしまうみたいです…
半透明設定をした場合でも、いきなり表DCに描画した場合は殆どCPU使用率は上がりませんでした。

裏画面使用時 :13〜16%
裏画面不使用時:0〜2%

みたいな感じになってました。
でも、処理の関係上どうしても裏DCを使って描画しないと
ちらついてしまうので、いきなり表には描画出来ないんですよね…
ものにもよるが子ウィンドウとか張ってないならUpdateLayerdWindowで
裏DC(DibSection)から転送かければいいと思うが。
まぁ、メインメモリの転送速度とかでいろいろ負荷はあるが。
スレッドの切り替えについて聞きたいんですが
現在のスレッドから、別のプロセスのスレッドに切り替わるのは
内部的にはプロセスの切り替えが行われているんですよね?
>>466
なんでそんなこと聞くんだろうと思ったけど、
もしかして「プロセスは切り替わるけどスレッドは切り替わらない」可
能性を考えてる?
>>467
いや、単純に
同一プロセス内のスレッドの切り替え⇒スレッドの切り替え(オーバーヘッド低い)
別プロセス間のスレッドの切り替え⇒プロセスの切り替え(オーバヘッド高い)

これで当ってますでしょうか?
>>468
同一プロセスかどうかにかかわりなく、オーバーヘッドは同じ。
>>469
マジっすか?
論理メモリ空間が変われば
いろいろとコンテキストに関わるデータを
レジスタに退避させたりして、忙しそうですが?
>>470
スレッドが切り替わる場合、スケジューラ(スレッド管理する人)というプロセスに
切り替わるわけだから、

スレッドA→スレッドB ではなく、
スレッドA→スケジューラ→スレッドB だから、
スレッドが切り替わる時にはプロセスの切り替えが常に2回発生している。
スレッドAとBのプロセスが同じかどうかなんて関係なしに、手間は一緒。
>>471
参考になりました。ありがとう
うむ、Windows みたいな 1:1 スレッドだとスレッド切り替えもプロセ
ス切り替えも差はないかもね。

NetBSD や Solaris の N:M スレッドだと、同一プロセス間のスレッド
切り替えのほうが異プロセス間の切り替えより一般的に速くなります。

ダイアログボックスのエディトボックスとコンボボックスから値を取得したいんですけどうまくいかないんです。
ソースは以下のような感じです。

long no1,no2;
int com;
省略
GetDlgItemText(hWnd,IDC_EDIT1,(char*)no1,sizeof((char*)no1));
GetDlgItemText(hWnd,IDC_EDIT2,(char*)no2,sizeof((char*)no2));
com = SendDlgItemMessage(hWnd,IDC_COMBO,CB_GETCURSEL,0,0);

一応グーグルトかで調べてみたんですけど、大体のところはこれと同じような書き方でした。
どこがおかしいんでしょうか?
>>474
ようソースとMSDN見ろ。
long を char* にキャストした時点で変だと思わんか?
>>474
値を取得したいなら、GetDlgItemIntを使え

まぁ、それ以前の問題という説もありそうだが・・・
478デフォルトの名無しさん:04/06/03 17:33
CreateProcessやShellExecuteで作成したプロセスを終了させるにはどうすればいいのでしょうか?
プライマリスレッドを殺そう
CPUは逐次スレッドを読み込むだけだから
異なるアプリの論理空間のコードを読み込むには
OSがいろいろ動いて、実行環境をスイッチするわけなんですよね?

このOSが実行環境を整えるのに掛かるオーバーヘッドは、
同プロセスのスレッド切り替えと比較しても無視できるほどそんなに小さいものなんでしょうか?
>>469>>471のレスを読んでると、そう読み取れたんですが
グーグルト
>>478
まずプロセスにどうにかして終了してもらうようにお願いする。
(例えばGUIアプリならWM_ENDSESSIONとか)
それでもだめならTerminateProcess(素人にはオススメできない)
>>478
TerminateProcess()で思いっきり終了させて下さい
>>478
起動したプロセスのウィンドウハンドルを
つかまえてWM_CLOSE投げるとか。
485446:04/06/03 17:59
>>449 遅くなってすみません。
動的、静的を問わず user32.dllがロードされていれば成功します。
2K SP4 と XP SP1 で試してみました。

それはさて置き

dll内で、グローバルオブジェクトのコンストラクタ中に
自身のリソースにアクセスしたいんですけど
そのdll名が変化する場合、GetModuleHandleでは無理ですよね。
VirtualQueryで取得したアドレスとかは保証されてないだろうし…
他に何か方法は無いでしょうか。
>>480
何を知りたいのか、何を心配してるのかようわからんが、
そもそもスレッドの切り替えに要する時間そのものが無視できるほど微々たるもの。
スレッドの切り替えを大げさに考えすぎじゃないか?
基本的には数十個のCPUレジスタのロード,ストアだけで実行環境は切り替わる。
それでも単純にスレッド切り替えをしているとGDIパフォーマンスが足りなかったので
NTではカーネルモードの高速スレッドスイッチングを実装してたような
GDIがユーザモードからカーネルモードに移動した時には、
いろいろ問題あったなぁ。
490478:04/06/03 18:08
TerminateProcessはうまくいきました。
# ShellExecuteのハンドルでは駄目でしたが…

もうひとつの方はこんな流れでいいのでしょうか。
1. CreateProcessでプロセスを生成(hProcessを取得)
2. hProcessの持つウィンドウを検索(hWndを取得)
3. hWndに対してSendMessage(WM_ENDSESSION or WM_CLOSE)する
4. WaitForSingleObject(hProcess)で終了待ち。

それで2.はどうすればいいのでしょうか。
ウィンドウのキャプションで検索するのは不確実ですよね。
タイムスライスの10msに比べれば、微々たるものだが、
頻繁にスレッド切り替えが発生するような設計なら無視できなくなるかも。
というか、その設計自体に問題がありそうだが。
>>490
ShellExecuteではなくShellExecuteExを使う
>>490
EnumWindows()とGetWindowThreadProcessId()の組み合わせでどうじゃろ
スレッドやプロセスの切り替えオーバヘッドが気になるようなら、
Fiber を使いませう。

495446:04/06/03 18:25
>>489
すいません、レス頂いて恐縮ですけど

MFC嫌いなんで使ってません。
496480:04/06/03 18:31
みなさんレスありがとうございます。オーバーヘッド云々は
どうも、マルチプロセス環境のプロセス切り替えと
マルチスレッド環境のプロセス切り替えとを混同してたっぽい
>>446
お前がどうやって成功しないと判断したのかかけ
>>485
とりあえずGetLastErrorしてみたら?
>>495
DLLのリソース取得するのに自分自身のHMODULEが必要だってんなら
DllMainの引数にあるやつどっかにとっとけば?
500446 & 485:04/06/03 19:22
>>497
GlobalAddAtomとGetLastErrorの戻り値を MessageBoxで表示したときと
OutputDebugStringで表示したときと違ったから。
確かに user32.dllと決めつるのはマズイですね。

>>499
グローバルなオブジェクトのコンストラクタは
DllMainより前に呼ばれるんですよ。
>>500
んじゃ素直に初期化をDllMainでやれ。
502478:04/06/03 19:31
無事成功しました。皆さんありがとうございます。
せっかくなのでソースを貼っておきます。

CreateProcessやShellExecuteで作成したプロセスを終了させるサンプル
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1086258254&res=2
動画ファイルからBMP形式で特定のフレームを取り出したいのですが、
AVI以外の形式の場合の取り出し方がわかりません。
OSにインストールされているコーデックを利用出来れば
取り出せるようになると思うのですが、
自作アプリからそれらのコーデックはどうやったら呼び出せるのでしょうか?
>>502
ざっと見て気になったところ
・WM_CLOSEでメインウィンドウが閉じられたからといってプロセスが終了するとは限らない。
 WM_QUERYENDSESSION/WM_ENDSESSION(Windows終了/ログオフ時のメッセージ)
 のほうがより確実だと思う。
・対象プロセスが死んでると道連れになるからWaitForでINFINITE待機はやめれ
>>503
DirectShowでできるんでない?
>>500
>グローバルなオブジェクトのコンストラクタは
>DllMainより前に呼ばれるんですよ。

その DllMain は偽者ですよ。
リンカの設定で本物が指定してあるはずなんで、
それを書き換えるなりしてください。
>>502
ThreadのHANDLEもCloseしておけよ。
509503:04/06/03 22:38
>>505
レスありがとうございます。
DirectShowで検索してDXSDKのGrabBitmapsにたどり着きました。
これがやりたい事そのものみたいです。

しかしこのサンプルを実行してみると、
hr = pGraph->Connect( pSourcePin, pGrabPin );
の行で必ずVFW_S_PARTIAL_RENDERが戻ってきており、
またcallbackも呼ばれません。
どなたかこのエラーの回避法をご存じ有りませんでしょうか?
510Earthquake:04/06/03 22:52
はじめまして。Earthquakeと申します。
Windows2000サーバのActiveDirectoryを使用している環境でのフォルダリダイレクトの設定を出力したいのですが、Win32APIでそんな関数ないですか?
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

/*----------------------------------------------------------------------------*/
namespace hoge
{
AnsiString LonToStr(unsigned long x)
{
int r;
AnsiString tmp;

r = x % 16;
x = x / 16;
if (x > 0) {
tmp = tmp + uLongToStr(x);
}
switch (r){
case 0: tmp = tmp + "0"; break;
case 1: tmp = tmp + "1"; break;
case 2: tmp = tmp + "2"; break;
case 3: tmp = tmp + "3"; break;
case 4: tmp = tmp + "4"; break;
case 5: tmp = tmp + "5"; break;
case 6: tmp = tmp + "6"; break;
case 7: tmp = tmp + "7"; break;
case 8: tmp = tmp + "8"; break;
case 9: tmp = tmp + "9"; break;
case 10: tmp = tmp + "a"; break;
case 11: tmp = tmp + "b"; break;
case 12: tmp = tmp + "c"; break;
case 13: tmp = tmp + "d"; break;
case 14: tmp = tmp + "e"; break;
case 15: tmp = tmp + "f"; break;
}
return tmp;
}
}


int main()
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
BOOL bResult;
BYTE Buf[] = "今日は良い天気です";
BYTE Signature[100];
DWORD SignLen;

/* デフォルト鍵コンテナの取得 */
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);

/* ハッシュ値の生成 */
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, Buf, lstrlen(Buf)+1, 0);

printf("%s\n", hoge::LonToStr(hHash));
/* 後処理 */
CryptDestroyKey(hKey);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
}

これをコンパイルすると
C:\cpp>bcc32 hash.cpp
Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
hash.cpp:
エラー E2141 hash.cpp 8: 宣言の構文エラー
エラー E2190 hash.cpp 38: 不要な }
エラー E2316 hash.cpp 58: 'LonToStr' は 'TET_YAS' のメンバーではない(関数 main()
)
*** 3 errors in Compile ***
となっちゃうんですけど、原因がよくわかりません。教えてください。
bcc32でつか・・・

単にAnsiStringが定義されていないだけでは・・・?
よくわからないけど
#include <vcl.h>
とかそれっぽいのをincludeすればいいんじゃない?
515451:04/06/04 04:08
>>465
どうも、レス遅くなってすみません!
言われましたとうりに、UpdateLayeredWindow()を使う事で
描画効率が格段に良くなりました!!

どうやら、自分で色々調べてみた結果
更新頻度の多いアプリでは、SetLayeredWindowAttributes()より
UpdateLayeredWindow()を使う方が推奨されているようですね。

本当にありがとうございました!!
516デフォルトの名無しさん:04/06/04 11:08
以下のように独自の構造化例外ハンドラをセットして、
その中から C++ 例外を創出するような以下のコードは危険でしょうか?

// カスタム例外ハンドラ
void _OnW32SEH( UINT code, _EXCEPTION_POINTERS * ep )
{
 _EXCEPTION_RECORD * er = ep->ExceptionRecord;
 throw MyCppException( code, er->ExceptionInformation );
}

// カスタム例外ハンドラを有効にする
void EnableSEtoCPPException()
{
 _set_se_translator( OnW32SEH );
}
517516:04/06/04 11:53
すいません。
MSDNみたら、OKって書いてありました。
ユーザ名とドメイン名とパスワードを渡して正規のユーザかどうかをチェックするにはどうしたらいいのでしょう?

MSDNまで漁ったけど漠然とし過ぎてるのか見付けられない…orz
適当なプログラムをrunasで呼ばせて成功すれば認証OKってのはだめ?
520518:04/06/04 12:49
>>519
いや、もっとスマートなやり方がきっとある筈なので…orz
ActiveDirectory なら、LDAP使うとか。
522デフォルトの名無しさん:04/06/04 15:12
IHTMLDocument2のwriteを使ってIEコンポにHTMLを表示しました。
しかし、2度目writeすると現在の表示されているものに追加されて表示されてしまいます。
そこで一旦HTMLを全消去したいのですが方法が分かりません。
clear()とかやってみましたが駄目でした。
about:blank開け!
>>523
IHTMLDocumentは使ったこと無い者だが、それ面白いな。

まさか、それがMS推奨の手順ではないよな??
>>522
とりあえず、MSDNのIHTMLDocument2::clearの項目を読め
全てはそこにある
526デフォルトの名無しさん:04/06/04 17:54
リストビューをカスタムドローして文字色を変更させているのですが、
特定の色:RGB(0,0,255)を指定した場合のみ変更されず困っています。
RGB(0,0,254)やRGB(0,1,255)の場合は問題ありません。
背景色の場合は問題ないようです。

どなたか原因または対処法をご存知ないでしょうか。
Win2000 VC6.0です。
>>526
見た目気づかないから(0,1,255)でいいんじゃね?
528526:04/06/04 18:39
どうも環境依存のようです。
実行環境のみ他のPCへ移してテストしたところ
WinXP NT4では問題ありませんでしたが、
他のWin2000では再現しました。

>>527
最終的に解決しない場合はそうします。

>>528
ウチじゃ問題ないよ。
ディスプレイの色数とかじゃないのか?
>>>527
>最終的に解決しない場合はそうします。

仕事でこの手の問題にぶつかったときに
あまり悩まずに >>527のような処置で
済ませてしまうオレはダメダメでしょうか・・・。
>>530
R/G/Bの原色が出ないカラーディスプレイは
たぶん存在しないだろう。
>>531=kuzu
534デフォルトの名無しさん:04/06/04 20:00
IEのツールメニューに独自のメニューを追加するにはどうすればいいですか?
>>531
damedame
536531:04/06/04 21:24
辞表出してきます
おうよ。後は俺が就職してやるから安心してくれ。
>>534
ttp://www.codeproject.com/atl/popupblocker2.asp
このページをCToolsMenuで検索。
でももっと簡単な方法があるような気がしないでもないが。
SDKで数値データを出力する方法を教えて下さい。
具体的にはreadfile関数などで読み込んだ文字列を
16進数で表示したいのです。
出力ってどういう意味?
wsprintf
>>541
それはここに書き込む前に使ってみたんですが
デバック画面出て強制終了してしまいます。他に方法ないですか?
ぬるぽしないようにちゃんとメモリ確保したか?
>>542
お前のプログラムがへたれなだけ。
>>543
どうやらそれっぽいのでもっかいやってみます
>>545
ちゃんとガッしとけ
>>543
とりあえず ガッ
ヒントをやって叩かれるとは世知辛い世の中じゃ
549545:04/06/04 23:26
強制落ちしないで起動しますた。なんとかできそうです。どうもですた
これ(>>539-548)で解決したのか orz
>>518
Net系のAPI使え
オフスクリーンのピクセルデータをDIBにコピーするにはどうしたらいいでしょうか
BitBltじゃ遅くて...
GetDIBits
>>504
WM_CLOSEなら終了するけど
WM_*ENDSESSIONは無視する奴も結構あるぞ
>>553
ありがとうございます
やってみたところあまり変わりませんでした
逆に少し遅くなってしまいました
DIBは遅いもの、それはしょうがない気が。
αブレンドとかしたいのなら標準関数でDDBのままやるのがいいと思う
ttp://www.sun-inet.or.jp/~yaneurao/intensive/diw1.html

まー、一応参考になるか?
>>556
その通りでαブレンドがしたいのですが
DDBだとどうやってピクセルデータを弄るのかが分かりません

>>557
ありがとうございます
参考にさせていただきます
AlphaBlend
>>559
ありがとうございます
こんなAPIがあったとは!
αブレンドはこれで解決出来たと思います
サブクラス化をして欲しい機能を実現したいのだけど、
ウインドウプロシージャを取り替えた後、そのウインドウが
終了するときは元のプロシージャに戻す必要があるのでしょうか?
また、戻すタイミングはいつがいいのでしょうか?
WM_DESTROYに返事をするときかな

WM_CHARとかWM_KEYDOWNとかでちょっと横取りして
あとはオリジナルにまかせっぱなしをしてるくらいだから
別に元に戻さなくてもいいような…
562デフォルトの名無しさん:04/06/05 11:43
hProcess->pid変換ってどうやるの。
逆だった。hProcess<-pidね。
>>563
OpenProcess
タスクマネージャに出てくるプロセスの優先度を変更したいのですが、
どうすればいいのかさっぱり分かりません。
プライマリスレッドの優先度を低くしても、タスクマネージャの表示は標準のままなのですが・・・
プロセスの優先度とスレッドの優先度は違うぞ。
どういう計算になるのか知らんけど。
SetPriorityClass
568562:04/06/05 14:55
>>564
それを使ってみたけどうまくいかないです。
タスクマネージャで表示されているプロセス(winhlp32.exe pid:3308)を指定して以下のコードを実行するとみると
for(;;){ printf("%d\n", OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3308)); Sleep(1000); }
2024
2036
2012
2008
2004
2000
1996
...

こんな結果が返ってきてしまいます。使い方はこれしかないですよね。
でも、毎回結果が違うってありえないonz...
>>568
藻前の脳味噌のほうがありえない
ハンドルってどういうものだか分かってるのか
>>568
・・・とんでもないな。
OpenしたものはちゃんとCloseしろとかいう以前の問題。
>>568
やりとりのふいんきが昨日の>>539と似てるんだが
OpenProcessの返値を出力するために>>539
質問をしたわけじゃないよな?

ちょっとお茶目すぎ
下らないことかもしれませんが。
Sleep(INFINITE)を実行したスレッドを復帰させるにはどうすればいいですか?
>>572
イベントなりセマフォと WaitForSingleObject を使え。
>>572
はは、ほんとくだらないねーw
やったことないけど、ResumeThread じゃ起きないかな?
無理
DebugBreakProcess
ジョイパッドはDirectXを使わないと使えませんか?
joy
>>578
ありがとう、出来ました
580デフォルトの名無しさん:04/06/05 19:48
リストボックスに何も文字入れていない状態なのに、一番上が点線で選択できるようになっているんですけど、
どうやった回避できますか?
一応プロパティあたりは見たつもりなんですが、無かったようですし、、、。
>>580
何も無いときは真っ白なウィンドウを被せるとか
hackyカコイイ
583デフォルトの名無しさん:04/06/06 03:21
CreateWindowに"MDICLIENT"を指定して作ったクライアントウィンドウ上で
右クリックメニューを出すにはどうしたらいいですか?
>>583
あいにくと俺は超能力者ではないので喪前さんが言ってることが良く分からんのだが
ttp://black.sakura.ne.jp/~third/system/winapi/win78.html
ここに書いてあることで分かりそうかい?
ハズしてたらもうちょっと分かりやすく質問してくれ。
585デフォルトの名無しさん:04/06/06 04:04
>>584
すいません、分かりにくいですよね。

一応、通常の右クリックメニューの出し方は分かるんですが、
MDIアプリケーションにしようとして、
クライアントウィンドウを作ると右クリックメニューが出なくなってしまうので、
どうしたらいいでしょうか? という質問です。

口下手で申し訳ない…_| ̄|○
口が下手なら、下の口で満足させてくれればOK
やらにゃいか
バラライカ
>>585
MDICLIENTのウィンドウをサブクラス化したらできたような気がする。
バナナ烏賊
臭そうだ

KSASO

OSASK
   ト、 , ---- 、
   H /::(/、^^, :゙i
(( (ヨb |::l,,・  ・,,{:K〉 ))
   \`l:ト、(フ_ノ:」/   < ぉまぇら 全員 学習ルーム来いヤ!☆
    ゙、 ヾ〃 /
     〉 ネヴァダ|
593585:04/06/06 20:08
>>589
ありがとうございます。出来ました。
ttp://black.sakura.ne.jp/~third/system/winapi/win64.html
で、ウィンドウプロシージャの切り替えが出来ることが分かったので、
"MDICLIENT"を指定したCreateWindowでhClientWindowを作った直後に、
SetWindowLong(hClientWindow, GWL_WNDPROC, (LONG)ClientWindowProc);
として、ウィンドウプロシージャを切り替えることでできました。

サンプルが必要な方は、アプロダ指定してくれれば、うpします。
それでは、本当にありがとうございました。
>>592
不謹慎!(@u@ .:;)ノシ
595デフォルトの名無しさん:04/06/07 10:08
データの移行ツールを作ってます。
Win2K+SP4で使ってたOutlook2000のデータ(メールデータ,振り分け,アカウント,他)を
別PCのWinXPでOutlook2002に移行したいんですが、どーやれば良いんでしょう?

Outlookのメニューからエクスポート/インポートを実行すれば大体は移行できるんですが...
コレをプログラム上で行いたいんです。
市販の移行ツールではこの様なコトが可能になっているので
何らかの手段はあると思うのですが自分にはさっぱり判りません。

移行する方法を知っていたらご教授をお願いします。

追加。
 Outlook相談室とそこで紹介されたトコにも投げてしまったんで、
 マルチになってしまいました。<(_ _)>
>>594
なによその顔文字は。ふざけてるの?
>>595
調べてもわかんねえやつがそういうツール作るなよ。
>>595
COMのインターフェース調べてそういった機能があれば使う。
なければOutlookのバイナリ解析して自力でやる。
あるいはMSと契約してコンバートツールを作らせてもらう。
599デフォルトの名無しさん:04/06/07 11:45
>>597
調べて判ったんなら、ココで聞かずに作ってますよ。
ヒントぐらい...くれ
む。ヒントが...
ここで具体的な情報が出てくるわけないだろ
pstファイルをコピペすれば?
移行するだけなら、それで良くね?
>>595
俺はOutlook使った事はないが Documents and Settings からファイル探して、
コピーすれば出来ると思うぞ。
CreateProcessと同じようにして自プロセス内の新規スレッドとして他プロセスを起動する事の出来るAPIはありますか?
あれば教えてください
ないだろ。情報やり取りしたいなら
普通にCreateProcessしてプロセス間通信するなりデバッグ系API使うなりするしかない。
pstファイルだけ上書きするとメール本文(一覧?)は移行できても
そのあとの動作がなんかおかしくなるねん。
Outlook2000 → 2002だからかもしれんが

もちっと四苦八苦してみるか..._| ̄|○
>>606
>Win2K+SP4で使ってたOutlook2000のデータ(メールデータ,振り分け,アカウント,他)を
>別PCのWinXPでOutlook2002に移行したいんですが、どーやれば良いんでしょう?
>Outlookのメニューからエクスポート/インポートを実行すれば大体は移行できるんですが...

「大体」ってのがどの程度なのか分からないのであれだが、

大体でいいのであれば、インポートとエクスポートのマクロ書けば
いいんじゃないの? これが一番楽な気がするけど。

移行ツールなんだから、どちらのPCにもOutlookが入ってる訳でしょ?
>>605
ありがとうございます。他の方法でがんばってみます。
>>595
プロファイルはMAPIで読み書きしてみるとか
610デフォルトの名無しさん:04/06/08 12:01
親Windowの上に子Windowが何個かついたものを作りました。
子Windowの配置をGetDialogBaseUnit()でおこなっています。

親Windowのフォントの大きさを変える事ってできるのでしょうか?

子WindowにはSendMessage(chWnd,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0));
でできるのですが、親にSendMessage(hWnd,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0));
しても変わりません。何かよい方法があるのでしょうか?
宜しくお願いします。
>>610
何を期待してるのか知らないけど、親Windowのフォントの大きさを変えても
GetDialogBaseUnitの返す値は変わらないよ。「画面のプロパティー」で
設定されるシステムフォントのサイズを変えない限り
612610:04/06/08 12:16
>>611
うう・・有難うございます。
期待していたのは、Borlandのリソースエディタで、親Dialogのフォント
の大きさを変えると、子コントロールの大きさや位置がそれなりに変わって
くれるから、同じことをやりたかったんです。

ああ・・・
>>610
親ウィンドウをダイアログで作るか、座標モードをキャラクタ単位にするとかどうよ。
MapDialogRectは使えんのだっけ?
615デフォルトの名無しさん:04/06/08 13:24
CreateFileMappingで作ったマッピングファイルを複数のプロセスが共有していまして、
このマッピングファイルに変更があれば感知したいのです。
WaitForSingleObjectみたいな感じで、イベントを取るためには何を使えばいいのでしょうか?
>>615
別途イベントかなんかで通知するのが良いと思う。
617610:04/06/08 14:19
>>613
なりがとうございます。
とりあえず、関数作りました。みてください。

void MoveChildWnd2(HWND handle,HFONT font,int x,int y,int w,int h)
{
 HDC hdc  =  GetDC(handle);
 
 ::SelectObject(hdc,font);

 int font_height;
 int font_width;

 TEXTMETRIC tm;
 GetTextMetrics(hdc,&tm);

 font_height = tm.tmHeight;
 font_width = tm.tmAveCharWidth;
618610:04/06/08 14:20

 DeleteDC(handle,hdc);

 ::SendMessage(handle,WM_SETFONT,(WPARAM)font,MAKELPARAM(TRUE,0));

 RECT r;
 r.left = MulDiv(x,font_width,4);
 r.top = MulDiv(y,font_height,8);
 r.right = MulDiv(w,font_width,4);
 r.bottom = MulDiv(h,font_height,8);

 window_x  = r.left; //ウィンドウのX位置
 window_y  = r.top; //ウィンドウのY位置
 window_width = r.right - r.left; //ウィンドウの幅
 window_height = r.bottom - r.top; //ウィンドウの高さ

 ::MoveWindow(handle,r.left,r.top,r.right,r.bottom,TRUE);

}
>>610
えーと。フォントのサイズでモニョモニョするっていうんじゃないんだ。
ダイアログは普通のウィンドウと違って、そのサイズはフォント文字のサイズを元に決められてるんだ。
試したことないからうまくいくか知らんけど、SetMapModeとかでウィンドウのサイズ単位を買えてやればいいんじゃないかと思ったのよ。
620610:04/06/08 15:58

>>619
そうです。これだと解像度がかわっても子Windowの位置関係は保持されそうでしょ?

case WM_CREATE:
   HWND hEdit1  = CreateWindow("EDIT",・・略
   HWND hEdit2  = CreateWindow("EDIT",・・略
   HWND hButton = CreateWindow("BUTTON",・・略

   HFONT font = CreateFont(・・・略
  
   MoveChildWnd2(hEdit1,font,10,20,60,30);
   MoveChildWnd2(hEdit2,font,10,60,60,30);
   MoveChildWnd2(hButton,font,10,100,60,30);
   break;
>>620
うまくいきそうだけど、もし親ウィンドウのサイズも変えるのなら、
単純にそれにあわせて拡大・縮小すれば良いような気もしないでもない。
あとドロップダウンコンボボックスで不都合が出るので、もしあるなら対応すべし。
622デフォルトの名無しさん:04/06/08 19:18
はやく615の質問も答えてやれよ
みんなわからないのかい?
うん。わからない。
じゃあね。
>>622
>>616 が答えてるだろ。
マップするファイルで Notify オブジェクトが作れるなら
WaitFor〜 で待てるかも知らんが、君やってみてくれる?
そんなもんがあったらものすごいオーバーヘッドだろうな
翼くん並のものすごいオーバーヘッドだな。
627デフォルトの名無しさん:04/06/09 13:49
Cでの非MFCウィンドウズアプリ製作で、
一つのウィンドウにWndProcを複数作る事は出来るのでしょうか。
ゲームを作っていて、今のやり方は

LRESULT CALLBACK WndProc(...)
{
static int gameRoutine = Title;
if(gameRoutine == Title) HandleTitle();
else if(gameRoutine == InputName) HandleInputName();
}

みたいにやっているのですが、

LRESULT CALLBACK HandleTitle(...)
LRESULT CALLBACK HandleInputName(...)

と複数作って、タイトルの処理をしている時は、
WinMainのGetMessage()でイベントを受けたときHandleTitle()に行くようにして、
名前入力のときはHandleInputName()に行くようにしたいのです。
元のメッセージループの直前で分岐すればいいんじゃないの。
そのゲーム用のWndProcで取りこぼしたメッセージを元のWndProcで処理する必要もあるだろうし。
>>627
無理。一つのWinProcとして登録できるのは一個だけ。
二種類扱いたいならWinProcを設定しなおすしかないが、
結局は今やってるのとあまり変わらんように思う。

if文を無くしたいだけなら関数テーブルを使ってみたら?
630627:04/06/09 14:05
コンソールプログラムでは、タイトルの処理の時は、他のゲームルーチンを
まったく触らずに処理できますが、そういう感じにしたいのです。

int HandleTitle()
{
while(1)
{if(oo) {afterRoutine = InputName;break;}}
}

HandleInputName()
{
while(1){}
}

>>628
PeekMessageInputという事ですか?
これはCPU率とかありますし、スレッドも難しくて分かりません。
取りこぼしについては、個々のゲームルーチンで全部書くようにします。

>>629
無理ですか。ChangeWndProc(hWnd, HandleInputName);
とかは考えてみたのですが。関数テーブルは調べて見ます。
631627:04/06/09 14:07
>>630
>HandleTitle()
afterRoutineを返します。

>PeekMessageInput
PeekMessageに修正します。
632627:04/06/09 14:14
>>629
あっ、関数ポインタですか。それでやってみます。

御二方、どうもありがとうございました。
>>630
WndProc変えるならSetWindowLongで
634627:04/06/09 14:29
>>633
ありがとうございました。やってみます。
635デフォルトの名無しさん:04/06/09 14:52
マウスの移動に関する情報として
マウスポインタの位置ではなく(コントロールパネルの
マウスから設定できるポインタ速度に左右されず)
マウス自体の移動量を得る方法はないでしょうか?
APIでは無理なのでしょうか?
設定速度をかけられてるから、レジストリからその値を取得して割る
637635:04/06/09 15:07
>>636
なるほど
レジストリの値は
同じ速度ならどのマウスデバイスも同じ値なのでしょうか?
またレジストリキーも名前はいっしょなのでしょうか?
名前は同じはず。以前調べたけど忘れた
マウスの設定アプレットをRegmonで監視すれば簡単に分かるはず

速度とマウス移動量の関係っつーのは一概に言えないね
経験上だけど普通のボール式PS2マウス・光学式PS2マウス・タブレットに付属してる電磁誘導マウス
同じくらい動かしても全部全く違う操作感だから。つまり、移動量を得られたところで環境に依存するから
あまり意味が無いんじゃないかと
HKCU\Control Panel\Mouse\MouseSensitivityかな
640635:04/06/09 15:22
>>638
ありがとうございマウス(´・ω・`)ショボ-ン
>>635
GetMouseMovePointsEx で GMMP_USE_HIGH_RESOLUTION_POINTS 指定するのって、
マウスだと意味無いんだっけ?
意味無い
643デフォルトの名無しさん:04/06/09 20:11
モーダルダイアログが別のメッセージループから再帰的に呼ばれて
2つ出現してしまうことがありますが、皆さんどうやって対策していますか?
そんな状態にならないようにする。
それは設計が悪いよ。
646643:04/06/09 20:35
>>644 >>645
他のアプリから呼ばれるDLLなんでつ。。。
if (まだでてなかったら) {
ダイアログを表示する
}
とかやれば?
システム全体に対してフックするようなものだったら恐らく>>647のやり方でもダイアログ表示している間に更に他のプロセスから
呼ばれて二重呼び出しされるんじゃないかねー。こういう時はどうするもんなんだろ。
看湯兎手楠
>>648
その場合は
まだ表示されてなかったら
の内容が単なるフラグチェックや何かではすまないだけ
で、別に同じでしょ
>>649
のようにmutex使うとかすればいいのであって
651デフォルトの名無しさん:04/06/09 21:59
フォルダの新規作成を検知することは可能ですか?
コピー/移動/削除/名前の変更はICopyHookで実装済みです。
FindFirstChangeNotificationで通知前と後の比較を考えたんですが、
これだとコピー/移動との区別ができません。
何か良い方法はないでしょうか。
>>651
ものすごく基本的なことだが
ディレクトリは作成と削除しかできない、んじゃないか?
そういうはなしではない?
653651:04/06/09 22:33
>>652
言葉足らずですみません。
現在シェル拡張DLLを作成しているんですが、ある特定のフォルダをエクスプローラで
コピー/移動/削除/名前の変更の操作を行った後にそれぞれ異なる処理を行っています。
上記4つはICopyHookのコールバック関数内で区別することができます。
さらに、新規にフォルダを作成した後にまた異なる処理を行いたいのです。
そのため、新規作成を検知する必要があるのです。
(フォルダの操作はエクスプローラで行われることが前提です)
いつの話だよMS-DOSじゃあるまいし
移動できるよ
655デフォルトの名無しさん:04/06/09 22:37
こんばんわ

OPENFILENAME ofn;
と宣言したのですが、
「OPENFILENAMEは定義されていません。」とエラーが出ます。

何かincludeするヘッダがあるのでしょうか?
MSDN引いた?
思いっきり載ってますが何か?
includeするだけで済む環境がうらやましい(´・ω・`)
MSDNって何ですか?
たのむ少しはググッってくれ
ググッってって何ですか? 隠語を使わないでください。
('A`)
>>660
おお、新しい反撃パターンだ。
これでは、伝家の宝刀の「ググれ!!」が使えないでないか...。






まあ、君にはインターネットは向いてないから、早めに回線切って引きこもった方がいいよ。
663デフォルトの名無しさん:04/06/09 23:30
引き篭もりですがいつもGoogleで検索してますがなにか?
おっさん、おばさんの間でも一部には通じるぞ、「ググる」
665デフォルトの名無しさん:04/06/09 23:50
ヲタに通じてもね┐(´д`)┌
うちの母親はぐぐってGIMPをマスターしたぞ
>>654
いや「OSレベルでは」というか「ファイルシステムレベルでは」
ディレクトリは作成と削除しかないでしょ
フォルダ単位の移動やコピーを「アプリケーションレベルで」(shellapiも
ふくむ)実装はできるけど、OSレベルではフォルダごとの移動は
ディレクトリの作成→そこにファイル群を移動→元ディレクトリの削除
という形になるでしょ

>>653
という理由によってディレクトリだけ見ても「区別できない」んじゃないかと
思ったのだけど、見当違い?
668デフォルトの名無しさん:04/06/10 00:38
コンボボックス内の項目がどれでもいいので選択されているか、選択されていないのかを
判定したい場合どうすればいいでしょうか。お願いします。
MoveFileExにディレクトリを指定するときの制限を見る限り、667のいうような形では無いと思われ。
ただ単にディレクトリエントリの書き換えだけだろ。
***_GETCURSEL 系のメッセージ使えば大丈夫
>>669
ごめんわたしがばかでした
逝ってくるよママン
672デフォルトの名無しさん:04/06/10 05:21
Win32APIのオフィシャルな情報ってのは、一体どこに?
MSDN
>>655
知っているが「こんばんわ」が気に入らないので教えない
現在のスレッドのHANDLEを取得するにはどうすればいいですか?
getcurrentthread
現在のスレッドのIDを取得するにはどうすればいいですか?
getcurrentthreadid
つーかMSDN引け ぐぐれ ヴォケ
>>677
この板ではどのスレッドもIDは表示されない。
>>667
>OSレベルではフォルダごとの移動は
>ディレクトリの作成→そこにファイル群を移動→元ディレクトリの削除
>という形になるでしょ

それはドライブが異なる場合だけだろ。普通は親ディレクトリのinodeの
書き換えだけ。
>>680
上手いな。ネタで>>677書いたのは俺だが
まさかそう返されるとは思わなかったぞ。
こうして、徐々に簡単な質問はスルーされていくようになるのだった
>>681
inode(に対応するWindowsでの概念)を書き換える必要あるの? 名前だけでしょ?
スクリーンセーバーが発動するまでの時間や
モニタの電源を切るまでの時間を、それぞれ
取得したり再設定したりするにはどうするのでしょうか?
>>685
画面のプロパティを開いて読んだり書き換えたりすればOK
687685:04/06/10 23:14
>>686
Win32APIの質問でした。
言葉足らずでごめんなさい。
該当するAPIはなんでしょうか?
>>687

>>686は、わかってて言ってるんだと思うぞ。
要は君に遠回しに 「 ぐ ぐ れ っ ! 」 と言いたいのではないかと。












もしググる気になったら、「スクリーンセーバー SystemParametersInfo」あたりで
ググってみると幸せになれるんじゃないかな。
689685:04/06/10 23:48
検索しました
少し幸せになりました
ありがとうございました

このAPIについてもっと調べてもっと幸せになります
690デフォルトの名無しさん:04/06/11 00:06
やさしいな
>>687-688
Win32APIのスレだしなぁ。ここ。
png画像を読み込んで1pixelの色を取り出したいんだけどGetPixelでおけ?
画像を読み込んだだけでGetPixel出来る時代になったのか。有難や。
694デフォルトの名無しさん:04/06/11 05:20
waveOutGetPositionという命令がありますが、
これは現在位置を取得するものですが、
逆に現在位置を変更するようなものは無いのでしょうか?

簡単に言えばwaveOut系で途中から再生をしたいのですが
解説しているサイトやヒント等ありましたら、おしえてください。
>>692
pngを読み込んで展開して、
デバイスコンテキストに描画したら、
GetPixelで色を取り出せるよ
>デバイスコンテキストに描画したら
697デフォルトの名無しさん:04/06/11 12:46
つか、ググれしか言えない厨房はレスするな、ウザイし邪魔
698デフォルトの名無しさん:04/06/11 12:49
同意。あとマニュアル読め厨も。
俺は最適な解を回答すべきだと思っている。
それが検索しろであったりマニュアル嫁であったりするのは、それが最適だと思っているからだ。
697は来るな。ウザイし邪魔
697=698=厨だろ
>>694
ありません。自分で制御する必要があります。
waveOut系はリングバッファ作ってwriteで垂れ流したことしかないから
偉そうなことは言えんが、ぱっとググってみた感じ、waveOutGetPositionも
結構色々と問題があるような感じなんで位置情報は自分でタイミング取って
見た方がよいのかも。
waveOutGetPosition で常に0を返す論外なドライバとか…
>>702-704
返答ありがとうございます。自前でやるしかないみたいですね。
そうなると、無圧縮なPCMであれば位置判定は簡単だと思いますが
圧縮されたデータ(MP3等)の場合、難しいですね。
一旦、無圧縮なPCMに展開する必要があるという事でしょうか?
706初心者です:04/06/11 19:25
InstallShieldにてインストーラを作っているのですが、ラジオボタンの表示/非表示
(visible? hide?)を切り替えることってできますか?
ライセンスを下までスクロールしないとライセンス同意ボタンを押せないようにしたいのかな
ちゅーかスレ違いだしなー
>>705
圧縮データ?

そうか、waveOut は 圧縮形式の WAVEFORMATEX ヘッダも
処理できたか。使ったこと無いから PCM 以外でどうなるか分
からないけど、少なくとも mp3 の場合は自分でヘッダ作らない
と(WAVE MP3)処理できないだろう。

俺は WAVE ファイルの場合はあらかじめ ACM の API
で無圧縮 PCM に変換してから waveOut API に渡してたからな。

mp3 は独自にデコーダ用意する必要がある。(APIは無い)

なんか、あなたの場合は DirectShow を
使った方が良いんじゃないかな?
手っ取り早くやりたいなら、そっちの方が早いよ。
710692:04/06/11 20:45
>>695
ありがとう
描画しなきゃだめっすか…何百枚の画像を処理しなくちゃならんのだけど…
何かアドバイス頂けると嬉しいです。
自前で解析した方が早いんじゃないか?
>>692
libpngとかImageMagickでも使ってロードして、後は適当に解析汁。
713名無し@沢村:04/06/11 23:57
ちっ、ここはザコが立てたスレか?
Windowsプログラムとは可愛いやっちゃ♪
こっちはメインウィンドウ完成間近だというのによ…♪もうすぐメインウィンドウできるよ〜♪
といってもCとかアセンブラとかでメインウィンドウ組むんじゃないぞ。それじゃまるでザコだ。
こっちは、メインウィンドウがつくれるプログラムつくってるのよ〜♪つまりVisual E++だ。
そうです、みなさんもうすぐVisual E++はメインウィンドウがつくれる本格的なプログラミングソフトに進化します♪
いまやっとVisual E++に補助的にバイナリエディタつかってメインウィンドウつくるのに成功したところ。
補助的にバイナリエディタつかわないで、Visual E++のみでメインウィンドウつくれるよになるには、あと修正個所が1、2個所…
みなさんもうすぐでっせ〜♪
714名無し@沢村:04/06/11 23:58
ちっ、ここはザコが立てたスレか?
Windowsプログラムとは可愛いやっちゃ♪
こっちはメインウィンドウ完成間近だというのによ…♪もうすぐメインウィンドウできるよ〜♪
といってもCとかアセンブラとかでメインウィンドウ組むんじゃないぞ。それじゃまるでザコだ。
こっちは、メインウィンドウがつくれるプログラムつくってるのよ〜♪つまりVisual E++だ。
そうです、みなさんもうすぐVisual E++はメインウィンドウがつくれる本格的なプログラミングソフトに進化します♪
いまやっとVisual E++に補助的にバイナリエディタつかってメインウィンドウつくるのに成功したところ。
補助的にバイナリエディタつかわないで、Visual E++のみでメインウィンドウつくれるよになるには、あと修正個所が1、2個所…
みなさんもうすぐでっせ〜♪
>>713-714
スレ違い。
http://pc5.2ch.net/test/read.cgi/tech/1085915001/
こっちでどうぞ。
沢村こんなとこにもくるのか。

ところで、IEのお気に入りの中から一定期間アクセスがなかったら削除するツール作ろうと思ったんだけど、
最終アクセス日(ファイルアクセスにあらず)ってAPIがらみで取得できませんかねえ。
調べたところ「履歴」フォルダにしか残っていないので履歴削除したら無理ぽなんだよねえ。
>>709
返答ありがとうございます。
圧縮データとは、MP3(not *.mp3ファイル)とか
ADPCM等です。(*.wavファイル)

何も考えずに、waveOutOpen -> waveOutPrepareHeader
-> waveOutWriteで再生できるので、今はそのままですが
求めている事は

・メモリにあるデータから再生
・ボリュームコントロール
・シーク可能
・Win98(無印)の何も入れてない状態で動く

…という事なのです。DirectShowでの機能は
Win98(無印)に標準で入っているのでしょうか?

>ACM の API
とりあえず、この方向で展開して自前でシークしたいと
思います。ありがとうございました。
>>717
> ・メモリにあるデータから再生
あー DirectShow でメモリからだと自前でソースフィルター
かかないかんね。サンプルもあるけど、
この場合はフィルター書いてまでも DirectShow を
使う意味は無いね。

>>ACM の API
>とりあえず、この方向で展開して自前でシークしたいと
まあ、もっともオーソドックスな手法だけど、長年使われていた
手法でもあるし、頑張ってみるしか。
719デフォルトの名無しさん:04/06/12 03:00
初心者質問でスマソ

SetMapMode(hdc,MM_LOMETRIC);

rect.left=100;
rect.top=-300;
rect.right=500;
rect.bottom=-100;

DrawText(hdc,Text1,-1,&rect,DT_CALCRECT | DT_WORDBREAK);
DrawText(hdc,Text1,-1,&rect,DT_WORDBREAK);
DrawText(hdc,Text1,-1,&rect,DT_CALCRECT | DT_WORDBREAK);
DrawText(hdc,Text1,-1,&rect,DT_WORDBREAK);

としてプリンタで印刷したところ
一回目のText1と2回目のText1が続けて縦一列に印刷されたのですが
なぜなのでしょうか
ステップしてもrectの内容が変わる事はなかったので
同じ場所に二重に印刷される物だと思ってたのですが
DT_CALCRECTをちゃんと理解しないで使ってる気がするので
やはりこれのせいなのでしょうか
分かる方おねがいします
>>692
GDI+のBitmapクラス使ってPNG画像を読み込んで、GetPixcelメソッドを呼ぶ。
721デフォルトの名無しさん:04/06/12 17:04
FindWindowを使ってクラスやタイトルが部分一致するウィンドウを探すのは無理
ですか?
クラスとタイトルはそれぞれ必ず完全に一致する必要があるのでしょうか.
EnumWindows()使え
>>722
了解
724デフォルトの名無しさん:04/06/13 22:25
こんばんわ
RebarのIE式メニューを作ろうとしてるんですが
うまくいきません

ソースコードをUPしますので
http://www.geocities.co.jp/SiliconValley-Oakland/3559/rebar.txt
どこが間違ってるのか見ていただけるとありがたいです
よろしくお願いいたします

InitCommonControlsExは処理してあります

呼び出し順番は

hRebar=_createRebar(hWnd,hInst);
_createIEMenu(hRebarIEMenu,hRebar,tbIEMenu);
_sendTextToIEMenu(hRebarIEMenu,"File_desu",tbIEMenu,0);
_sendTextToIEMenu(hRebarIEMenu,"Edit_desu",tbIEMenu,1);
_sendButtonToIEMenu(hRebarIEMenu,2,tbIEMenu);
_attachIEMenuToRebar(hRebarIEMenu,hRebar);
自前のメニューバーに動的に項目を追加したいんですが
すでに、追加したい項目のIDが追加されているかどうか
ってどうやって調べられますか?
AppendMenuつかうと、無節操に追加されるし
EnableMenuItemだと、見えなくならないし、で微妙なので、
助けてください。
GetMenuItemInfo
>>724
10万くらいくれたらデバッグしてやらんでもない
GetMenuItemCount
GetMenuItemID
GetMenuPosFromID

この辺使えば自在だ。
メニューの中に「送る」のように外部のフォルダの中身によって表示される項目がコロコロ変わるサブメニューを作っています。
何を表示すればよいかは簡単に取得できたのですが、これをいつメニューに反映させればよいのかが分かりません。
最初は WM_INITMENU か WM_INITMENUPOPUP で更新すればよいと考えていたのですが
このサブメニューの名前や位置が変化するので、親メニューと位置だけでは、
どのサブメニューが表示されようとしているのかが分かりません。
こういったメニューのアイテムを最新の状態に維持するにはどうすればよいのでしょうか?
あるいは、メニューバーの特定のサブメニューが表示されようとしていることを知る方法はあるでしょうか。
どうかよろしくお願いします。
730725:04/06/14 10:52
>>726,728
サンクス
>>729
メニューの位置が動的に変更しないようにする。

というのはアレなので、ちょうど>>728が書いてるAPIで位置から特定してやればいいんじゃないかと。
それで、>>726のAPIを使用してメニューの情報を得ればいい。
>>731-732
ありがとうございます。
ただ、相手がサブメニューなので ID が無いのですが
そのような場合はどうすればよいのでしょう?
>>733
ポップアップにもIDはつけられる。
>>734
ありがとうございます。
今まで知りませんでした。
これで解決できそうです。
どうもありがとうございました。
736デフォルトの名無しさん:04/06/14 13:09
つか、ググれしか言えない厨房はレスするな、ウザイし邪魔
つか、もう終わった話題に亀レスする奴、ウザイし邪魔
ククれ
王子さま
740デフォルトの名無しさん:04/06/14 13:40
あの〜、質問よろしいでしょうか?
>>740
バーモント
高木ブー





はウクレレか
ハヤシもあるでよ
>740
質問していいかくらい、自分でググって調べろ。
>>734
>ポップアップにもIDはつけられる。
どうやればできるのでしょう。
方法を探したのですが見つかりませんでした。
ホントにできるのか?
>>746
嘘を嘘と見抜けないようだと・・・
メニューアイテム関連のAPIは、コマンドIDじゃなくてインデックスでも使えるから、
インデックスを覚えておくのが良いと思う。
あるいはポップアップのHMENUをそのまま覚えておくか。
ぐぐれはともかく、分かってないならレスしないでくれ
ってのは、たまにあるな。
>>746
MENUEX
> ID が無い
> サブメニューの名前や位置が変化する
無理だ...
753デフォルトの名無しさん:04/06/14 17:09
エクスプローラの左にあるフォルダツリーと同じものを作りたいんですが
あれって全部自前でアイコンとかを取得したりしてるのでしょうか?
754デフォルトの名無しさん:04/06/14 18:36

Windows上のC++(またはC言語)で、pdfファイルをいじる方法ってありますか?
帳票の代わりにpdfファイルを作るとかしてみたいのですが・・・。
宜しくお願いします。
スマートにやりたきゃまずはpdfの仕様を調べて好きにしろ
面倒だったらWordをOLEで制御するなりunix系ツールで変換するなり
>>754
PrimoPDFとか入れて、印刷しろよ。
>>746
試してないがこれではムリか?
MENUITEMINFO mii = { sizeof(MENUITEMINFO), MIIM_SUBMENU | MIIM_TYPE | MIIM_ID,
MFT_STRING, 0, idCmd++, hSubMenu, 0, 0, 0, szMenuText };
InsertMenuItem(hMenu, indexMenu, TRUE, &mii);
メニューの項目が長すぎる場合、
シェブロンにカーソルを持って行ったら
自動的にスクロールするようにするには
どういう設定をすればいい?
>>754
PDFを操作するライブラリがいくつかあるぞ。
ClibPDFなんて使いやすい。
http://www.fastio.com/
USBデバイスの電源が入っているかどうかを知るAPIってありますでしょうか。
探したのですが見つかりません。
電源が入っていない=認識されて無いだから無理だと思うが…。
逆に探してみて、目的の物が無いかどうかで確認するしかないんじゃないか?

それとも、俺が知らないだけで「電源が入って無くても、認識されている」
デバイスがあったりするか?
>>761
バスパワーで、回路だけ動いてれば
「電源が入って無くても、認識されている」
って状況は可能なんじゃないのか?
あるかどうかは、知らないけど。
バスパワーってことは、「常に電源が入っている」ってことでしょう?
バスパワーでかつ電源スイッチがあるようなデバイスでも、電源スイッ
チを切ると認識されなくなるんじゃないかい。

764760:04/06/15 14:14
レスありがとうございます。
たとえば単純に、現在使用可能なデバイスのリストを返してくるようなAPIを探しているんですが。
=電源が切れて認識されなくなったらリストからデバイス名が消える
みたいなことをAPIに期待しています。
>>764
多分DDK方面?
>>764
DDKにusbviewというサンプルがあるから見れ
>>764
昔レジストリで確認してたことある
一覧で探してあったらGetDeviceDiscriptor投げ
この辺の操作もDDKサンプルみれば乗ってたはず
768760:04/06/15 16:46
DDK持ってない(T_T)有料なんですね今は
レジストリの線で探ってみます。ありがとうございました。
プロセスメモリエディタを作成したい(目標はExSTAND)のですが、
サブヒープの情報はどのように取得すればいいのでしょうか?


各ヒープエントリ情報は、

1.CreateToolhelp32Snapshotでプロセスのスナップショット取得
2.Process32First、Process32NextでPROCESSENTRY32取得
3.CreateToolhelp32Snapshotでヒープのスナップショット取得
4.Heap32ListFirst、Heap32ListNextでHEAPLIST32取得
5.HEAPLISTでHEAPENTRY32取得

という流れで取得できたのですが、サブヒープ情報は取得できません。
どのようにすればサブヒープの情報を取得できるのでしょうか?
よろしくお願いします
770769:04/06/15 18:31
>>769
5.Heap32Firstの間違いですm(__)m
771デフォルトの名無しさん:04/06/15 21:11
定期的にキーボード入力を生成するツールを作りたいのですが、
どうもうまくいきません。

PostMessage(WM_KEYDOWN,...), keybd_event, SendInput を使用したものは、
通常のアプリケーション(メモ帳とか)には正常に動作するのですが、
DirectInputを使ったゲームには作用しないようなのです。
(当然といえば当然かもしれませんが(><))

何かよい方法があったらご教授下さい。宜しくお願いします。
>>769-771
ネトゲサロンへお帰りください( ゚,_ゝ゚)
773デフォルトの名無しさん:04/06/16 00:36
ある文字が指定したフォントで表示できるかどうか調べる、というAPIはありませんか?
TextOutで文字を書いたところ他のフォントに置き換わってしまい困っています。
>>773
結構しらべたけどない...orz
JAVAにはcanDisplay()という関数があるみたいだから何らかの
方法で実現はできるみたいだけど。。。
>>773
GetGlyphIndices かな
776名無し@沢村:04/06/16 04:07
おみゃ〜らよ、メニューについていいことを教えてやろう。
それはリソースエディタでメニューをつくるとき、「ファイル(&F)」のように書くだろ?
すると「F」という字にショートカットキーが割り当てられるわけだ。
おみゃ〜らよ、おみゃ〜らは、いままでショートカットキーを割り当てるときの書式は、「ファイル(&F)」というふうでなくてはならないと思っていたはずだ。
どうだ?
だがおみゃ〜らよ、実は「&」の後の文字なら何でもショートカットキーが割り当てられるのよ。
「(&F)」のように「()」で囲む必要もない。
つまり「&ファイル」とすれば「フ」の字にショートカットキーが割り当てられるし、「フ&ァイル」とすれば「ァ」の字にショートカットキーが割り当てられるのよ。
これはおみゃ〜らが、いままで知らなかったことだ。
覚えておくといいぞ。おみゃ〜らよ♪
>>776
それぐらい知っとるわ。
「E&xit」とか良く見るし。
>>776
元々、「&File」だったのが、日本語で「&ファイル」すると
ショートカットが「フ」になるから「ファイル(&F)」にしてんだろ。
そんくらい、誰でも知ってるぞ。

「自分が知らなかった=まわりも知らない」
この図式自体が間違ってる事に気付け>沢村
>>777
>>778

マジレス ハゲカッッコワルイ
沢村くんの文章ではなぜ全角カナと半角カナが混在しているのだろうか。
前前から疑問に思っていたんだよね。
ファイル(\036F\037フ)
782773:04/06/16 10:26
>>775
うまく動作させることに成功しました。
ありがとうございましたm(_ _)m
Win2KPro & VC++6.0でGINAの開発を行なっています。

WlxLoggedOutSAS()のログオン認証まではMsGina.Dllに処理をスルーして、
WlxActivateUserShell()の呼び出し時にさらにある条件で認証を行い
認証できれば、MsGina.DllのWlxActivateUserShell()に処理を渡し、
認証できなければ、FALSEを返してログオンを打ち切るプログラムを
作ろうと思っています。
そこで、WlxActivateUserShell()上でWlxLoggedOutSAS()で認証された
User名を取得したいのですが、方法が分かりませんご存知の方が居られ
ましたらご教授いただきたくお願いいたします。

恐らく引数lpWlxContextに、その辺の情報が入っている構造体のポインタが
渡されているのではないかと思っているのですが、MsGina.Dllでこの部分が
何に使われているのかが調べきれませんでした。

つたない質問で申し訳ありませんが、よろしくお願いいたします。
784771:04/06/16 20:16
>>772
解決しました、ありがと〜
785デフォルトの名無しさん:04/06/17 17:28

TrackPopupMenuで表示させたポップアップメニューを閉じたタイミングを
検出したい場合、どうすればよいのでしょうか?
ご教授よろしくおねがいします

WM_EXITMENULOOPではダメかしら
ところでご教授って人の名前?
>>787
ところで藻前、とてつもないバカ?
うん。教授と教示の違いが分からない奴よりはバカじゃないと思うけどね:-P
質問に答えるやつはちゃんと教授法を学べよ。
(:-P)_| ̄|_
きょうじゅ けう― 【教授】
(名)スル
(1) (ア)児童・生徒に知識・技能を与え、そこからさらに知識への興味を呼び起こすこと。
  (イ)専門的な学問・技芸を教えること。
(2) 大学などの高等教育機関において、専門の学問・技能を教え、また自らは研究に従事する人の職名。助教授・講師の上位。

人の名前?て聞くのはヴァカじゃね?
>>789
ああ、本当にバカだ。底なし。
>>787
ところで難しい質問が来るとしばらくスレが止まって、上げ足レスが付くっていうのは厨の十八番なのか?
判らなければスルーすればよいだけだと思うのだが
>>794
(゚Д゚)ハァ?、もしかして>>783の教えてクンのこと?
そんなの低レベル過ぎて答える気がしないだけだよ、あんなのがお前には難し過ぎる質問だったのかw
あんまり自分のレベルで判断するなよ、今回みたいに大恥かくよw
誰か構ってやれよ
エディットコントロールで文字フォントの大きさを変更したいのですが、
検索してSendMessageと、WM_SETFONTを使うべきと分かったのでやってみました。

SendMessage(hwndEdit, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));

上のコードを親ウィンドウのプロシージャに埋め込んだのですが、フォント自体は変化せず。
文字高さを以前より大きくすると、カーソルが大きくなるだけです。
以前より小さくすると、フォント下部が欠けた状態で表示されるようになりました。
代わりにスタティックコントロールで試すと、この問題は生じません。

どこが間違っているのでしょう?、教えていただけないでしょうか。
環境は VC++.NET です。
一番間違ってるのはこんな状態のこのスレで聞くことだな
799デフォルトの名無しさん:04/06/17 22:59
>>787==>>789 必死だな (激藁
>>796=783
まあ今回は許してやるから、勉強して今度はもうちょっとマシな質問しろやw
それと問題が解決したら情報をレスしろよ。それが礼儀だからな
>>800
全然面白くない。このスレから消えろ
>>801
そういうことは、住人が呆れるような低レベルな質問を、平気でする香具師に言うべきでは?
プ
>>795
…そう捨て台詞を吐いて、結局>>783の解決方法を言わないのか。
もし、>>794に対して文句言いたいなら>>783の答えを示して
「低レベルすぎて回答する気もならなかった」と言えば
>>794は何も言えないと思うのだが…。
>>804
>>795にとって、>>783は低レベルだが
>>794は高レベルな書き込みだったのだろう。
何故なら、レスしてるから。(w
つーかAPIの話しないなら出てけお前ら
807デフォルトの名無しさん:04/06/18 02:23
   ∩___∩      
   | ノ      ヽ/⌒) あばばばばばば
  /⌒) (゚)   (゚) | .|  
 / /   ( _●_)  ミ/   ∩―−、
.(  ヽ  |∪|  /    / (゚) 、_ `ヽ
 \    ヽノ /      /  ( ●  (゚) |つ
  /      /      | /(入__ノ   ミ   あばばっあびゃばびゃばば
 |       /       、 (_/    ノ  
 |  /\ \       \___ ノ゙ ─ー
 | /    )  )       \       _     
 ∪    (  \        \     \
       \_)
>>797
エディットコントロールってフォント変えられるんだっけ?
MSDNで調べてみたら?
もしフォント変えられないっぽいならリッチエディットにする。
809デフォルトの名無しさん:04/06/18 08:51
>>808
WM_SETFONTで変えろ
>>809 ( ゚д゚)ポカーン
>>797
WM_SETFONTでフォントを適用したあと、HFONTをDeleteObjectしてないか?
WM_SETFONTで適用したフォントはそのフォントを使わなくなるまで
(コントロールを削除など)保持しとかないとダメだぞ。

もしそうならスタティックで成功してるってのも、再描画すると元に戻ってると思うんだが…。
811 さん、、おっしゃる通りです。
直後にフォントを破棄していました。
エディットコントロールが既に存在しないフォントにアクセスしたんでしょうね。
スタティックは再描画後もOKでした、フォントをコピーして保持してるのでしょうか?
しくみが違うようです。

どうもありがとうございました。
↑↑↑
失礼、ミスリードしました。
スタティックも再描画したら問題発生しました。

ではでは。w
w
815デフォルトの名無しさん:04/06/18 22:58
以下のようにしてファイルロックの様な物を実装しようとしてるのですが
時々処理がWaitForSingleObjectで固まってしまい困ってます。
何が悪いのでしょうか。
func()はマルチスレッドで山ほど同時に呼ばれます。

void func()
{
HANDLE hMutex = ::CreateMutex(NULL, FALSE, strMutex);
if (::WaitForSingleObject(hMutex, 2000) == WAIT_TIMEOUT)
 TRACE("WAIT_TIMEOUT\n");
// ここで保護したい処理
::ReleaseMutex(hMutex);
::CloseHandle(hMutex);
}
なんでそんなに作りまくるのか
817デフォルトの名無しさん:04/06/18 23:34
実際とは違うけどIriaとかの同時ダウンロードみたいな感じで使用されます。
> 実際とは違う

どう違うのかかけ。
特に、毎回Createしてるのかどうか。
819デフォルトの名無しさん:04/06/18 23:45
実際はIriaのようにファイルのダウンロードではなく
サーバにパケット送信したり受信したりしてます。
>毎回Create
Createとは何をCreateしてると言うことですか?
スレッドなら同時に何十も起動できるようにしてますが。
mutex
>>815
なー、実際に何を保護すんの〜?
func() のどこかで ::Sleep(5); を入れてみたらうまくいくかも。
違ってたらごめんなさい。
823デフォルトの名無しさん:04/06/19 00:08
>>820
ミューテックスなら上に書いたようにスレッドが作成されそのスレッドから
毎回関数が呼ばれた際に作成して関数が終わるときに破棄するようにしています。

>>821
ファイル相手じゃないですがデータを読み込みそれを変更してデータを格納してます。
要はカウンタと同じです。

>>822
駄目でした。
>>823

main()
{
mutex を1つ作成
...
mutex を破棄
}

func()
{
mutex ウエイト

mutex リリース
}

じゃいかんのかえ?
つーかプロセス内でしか使用しないMutexに名前付けるな
>>825
そういやMutexってそのままグローバルに名前が見えちゃうんだっけ?
827デフォルトの名無しさん:04/06/19 00:24
>>824
なるほど、大元で作成してそれを使いまわすみたいな感じですか。
ただ、このプログラムの場合、効率を上げるため幾つかmutexを作成してて
その辺変更するの時間かかりそうなのまた明日にでもやってみようと思います。

>>825
上にも書きましたが効率を上げる為です。
もう少し詳しく書くと以下のようにしてます。
void func(LPCSTR lpName)
{
CString strMutex;
strMutex.Format("ACCESS_%s", lpName);
HANDLE hMutex = ::CreateMutex(NULL, FALSE, strMutex);
...


lpNameはデータ名でこれは幾つか有ります。
AAAと言う名前のファイルにデータを書きこむ際は
BBBと言う名前のファイルは保護する必要は無いので。
>>827
これ以上アホな質問する前にマルチスレッドと同期について書いてある"まともな本"を読んで来い。
829デフォルトの名無しさん:04/06/19 00:28
>>828
どの辺がアホなのか指摘していただけると凄く助かります。
830デフォルトの名無しさん:04/06/19 00:29
>>827
ていうか情報を小出しにするな。前提条件は最初に書かなきゃ、
>>824>>825がレスした事が無駄になっちまう可能性もある訳で。

>>827
それなら保護したいリソースにアクセスするクラスを構築するたびに
Mutexを生成する

struct FILEIO {
 FILEIO { むーってっくす生成 }
 ~FILEIO { むーってっくす棄て }

 HANDLE hmutex;
}

func(FILEIO& aaaaaaaa)
{
aaaaaaaa.hmutexをうえいと

aaaaaaaa.hmutexをりりーす
}
832デフォルトの名無しさん:04/06/19 00:33
>>830
最初に全ての情報を書くと膨大なので必要だと思われるところだけを書いたつもりですが
いかせんアホなのでその辺の取捨選択が間違えてたようで、スミマセン。
>>828
答えを書いておきながら、ちょと同意してしまった。
>>828
まーその意見には同意するがこのスレでそんな身も蓋も無い事言うもんじゃない。
835デフォルトの名無しさん:04/06/19 00:43
>>831
その方法を使わせていただきます。
有難うございました。
>>835
まー、頑張って。
Win32以前に同期のお勉強をしてね。もっといい方法が分かると思うよ。
近所のおねえさんとWin32APIでむっくすしたいので方法を教えてください
>>837
だまってメーラースレにお戻りください。
839837:04/06/19 01:33
は?
>>837 のような書き込みするおまいの頭の方が「は?」だ。
それで、近所のおねえさんとむっくすする方法は…
>>841
speed&power
>>841
looks&money
pokotin&korman
同一プロセス内でしか使わないなら、クリティカルセクションでいいんじゃないの?
処理の重さは、Mutex>クリティカルセクションだよね?
>>845
非NTだとクリティカルセクションはタイムアウトできない
847783:04/06/19 08:18
自己解決しました
なんか荒れる原因つくってしまったみたいで申し訳ありませんでした
コンボボックスについて質問です。
テキストが右揃えなスタイルのコンボボックスを作成すると、ドロップダウンのボタンが左側に配置されてしてしまうのですが
普通のコンボボックスのようにボタンを右側に残したままテキストを右揃えにするにはどうすればよいのでしょうか?
ご存じの方どうか宜しくお願いします。
自己解決しました
849 != 848 です。
この流れだと勘違いされそうなので...
>>848
そのスタイルは、右から左へ文章を表示する言語のためのもの。
自分で描画汁。
>>847
>>849
ヲイヲイ、「解決しまつた」だけじゃ何の意味もないだろうが
きちんとどうやって解決したのか報告しろ
そうじゃないと質問に答えてくれた人に失礼だろうが、お子様
じゃないんだから、それくらいの事は言われなくても分かって
くれよ…
自己解決しました
>>852
ねたにまj
2ちゃんでマナー語る香具師も珍しいな
852じゃないが2ch云々の問題じゃない。
スレの流れも悪くなるし、簡単でいいから内容を
書くべきだ。というか何も書かない椰子よりは
いいが。。。
2chとひと括りにするの自体が間違ってる。厨板・技術板・雑談板それぞれに特色があって
それぞれに異なった住人層(と表現しとく)があるんだから。なんかその辺を分かってない奴が最近あちこちの
板に激増してる気がする。空気が読めてないというか何と言うか。
自己完結しました。
セルフセックスですか
気になりますな。
遅そうとはいえ、>>815 で機能上は問題はないように見えるし。
>>851
そのようにさせていただきます。
既製の方法はありませんでしたか。
旧版が番号スタイルのエディットボックス(自動的に右揃え)を使っていたので
見た目を揃えたかっただけなのですが。
>>856
まあ、283=247は厨に絡まれまくっただけで技術的な支援はまったく
なかったしねえ、とてもレポート書く気にはならないと思われ
↑847=783ね
864デフォルトの名無しさん:04/06/19 16:25
CHOOSEFONTでフォントダイアログを出した後、フォントサイズのところに任意の数字
を入れるにはどうすればいいのですか?
例えば、初めにフォントサイズ40を設定しておいて次回開いたときに40が入っている
って事がしたいのです。
865デフォルトの名無しさん:04/06/19 20:20
こんばんは!一つ質問させてください。
320×240のウインドウを表示したいのですが、タイトルバーが含まれてしまうので
うまく作れないのですが、どうすれば良いのでしょうか?
(320×240の画像を表示したいのです)
よろしくお願いします!
>>865
WM_NCCALCSIZE を拾うでつ
>>865
1 適当なサイズでウインドウを作る
2 320-クライアントの幅 を現在のウインドウ幅に足してリサイズ
3 240-クライアントの高 を現在のウインドウ高に足してリサイズ

の2ステップが必要。
ウインドウメニューが無い場合は、AdjustWindowRect(Ex)を使っても良い。
868デフォルトの名無しさん:04/06/20 00:26
質問です。
MacのDockをマネたのがWinにもあるけど、
あんな感じでアルファチャンネルを持った
画像を表示したいんです。

画像のアルファチャンネルでウィンドウを
透明にする方法を教えて下さい。

レイヤードウィンドウみたいに全体が
同じアルファ値じゃなくて、ピクセル
単位でアルファ値を変える方法が
しりたいです。

よろしくお願いします。
UpdateLayeredWindow()
>>869
MSDN読み直したら、「ピクセル単位のアルファ情報を含むこともできます」
と書いてありました。恐縮です。
ありがとうございました。m( _ _ )m
>>846
NTだとできるの?
872デフォルトの名無しさん:04/06/20 11:11
エクスプローラで指定のフォルダが既に開いていないか取得する方法って無いですかね?
とりあえずエクスプローラのウィンドウはFindWindowでクラス名をCabinetWClassにすれば
取れるんですけどキャプションは設定によって変わりますからそこで判断は出来ませんし。
どこかからかそのフォルダのCLSIDでも取得出来るなら良いんですが。
堅実で確実な方法としては、シェル拡張で潜り込むしかないかな。
875872:04/06/20 11:36
>>874
おお、コリャ良い。
サンクスコ。

ってか、CLSIDじゃ無くてITEMIDLISTだったな。オオボケでした。
……この情報がどこから出てきたかは秘密です。

流出ソースだろ、ヤバくないか?
877365:04/06/20 12:30
>>366
>>367
できました、有難うございました〜
>>876
これAvesta作者だよね・・・。なんかやばそう。
自作のダイアログを半透明にしようとして、WM_INITDIALOGに以下の様に
処理を書いてみたのですが、ダイアログが完全に透明になってしまいます。

いったいどこがおかしいのでしょうか?

BLENDFUNCTION bl;
BOOL bb;

SetWindowLong(hDlgWnd, GWL_EXSTYLE, GetWindowLong(hDlgWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

bl.BlendOp = AC_SRC_OVER;
bl.BlendFlags = 0;
bl.AlphaFormat = 0;
bl.SourceConstantAlpha = 200;

bb = UpdateLayeredWindow(hDlgWnd, NULL, NULL, NULL, NULL, NULL, NULL, &bl, ULW_ALPHA);
SetLayeredWindowAttributes使え
カーソルをリソースからではなく
(メモリダイアログテンプレートのように)
コードで組み立てる(orコードに埋め込む)
にはどうすればよいのでしょう。
よろしくお願いします。
>881 CreateCursor
883デフォルトの名無しさん:04/06/21 18:50
40バイトあるファイルをReadFileで10バイトずつ違う変数に代入したい
場合はどうすればいいのでしょうか。お願い申しage
10バイトずつ読む
リードしたバッファのアドレスをポインタで保持するだけでいいじゃん

886デフォルトの名無しさん:04/06/21 19:53
>>885
こんな感じですか?
static char String[40];
char *p;

ReadFile(hFile,String, 40, &Read, NULL);
p = String;
w = atoi(p+0);
x= atoi(p+10);
y= atoi(p+20)
z atoi(p+30)
(・∀・)・・・?
変数に代入、という時点で気付くべきだったな。
構造体に読み込みなさい
ここはAPIスレだからそれでもいいけど
一般にはストリームから直接構造体に読み込むのは
移植性無さ過ぎるぞ
891デフォルトの名無しさん:04/06/21 23:27
構造体に読む込むってのは、どうやって
かるく例を書いてもらえるとありがたいんですが
BITMAPFILEHEADER f;
fread(&f, sizeof f, 1, fp);

みたいなことだろ
pretty hackey wayですね(hackyだっけ)
Google先生にお伺いを立ててみたところ
hackyジャネーノ? と言われますた
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=hackey
別スレで質問したのですが、そのスレが終わってしまったのでこちらで質問します。

マイコンピューターの、ドライブ名の一覧を取得するにはどうすればよいのでしょう。
デジカメなどのマスストレージなども含めて取得したいです。
OSで開いた場合の「マイコンピュータ」フォルダと同じ内容が得られれば目的を果たせるのですが。
OSはXP、言語はDelphiです。
>>895
IShellFolder::EnumObjects
897デフォルトの名無しさん:04/06/22 10:32
フォントダイアログの「文字飾り-色」だけを非表示にするAPIってありますか?
文字飾りグループを全部消せるのは知っています。
CFHookProcでフォントダイアログにフックを引っ掛けて
その中で目的のコントロールを非表示でよいんじゃないのか?
>>897
ShowWindow
>>896
できますたありがとうございます
901デフォルトの名無しさん:04/06/22 15:54
CreateProcessを使って立ち上げたexeの標準出力&エラーを
元で取得するにはどうしたらよいでしょうか。
よろしくお願いします。
>>901
パイプ
パイプ(名無し)は WaitFor ができないのが難点。
>>904
CreateProcessするんだからプロセスハンドルじゃだめか?
906904:04/06/22 16:58
>>905
プロセス終了後にまとめて読むんだったらそれでよいけど、
子プロの吐く内容をリアルタイムで取得したい場合もあるから。
たとえば対話式コマンドとか。
それはスレッド使うのが定石。
908904:04/06/22 17:09
スレッド使ったところで、ReadとWaitのループで待つわけだから、
パフォーマンスとレスポンスのトレードオフになる。
てか、名前憑きは使えないんだっけ?
>>908
>ReadとWaitのループで待つわけだから、
ReadFile自体がブロックするからWaitは不要。
レスポンスも悪くないよ。

>>901
>190351 - HOWTO: Spawn Console Processes with Redirected Standard Handles
http://support.microsoft.com/?id=190351
ユーザー名から、そのユーザーのユーザーグループ(アドミニとかパワーユーザー)を
知りたいんですがそんなAPIありませんでしょうか?
WM_INITDIALOGの中でSetTimer(hDlg, NULL, 1000, NULL)すると
何かダイアログを操作するまでWM_TIMERがこないんですが、何故でしょうか?
設定したダイアログに対して何か操作をすると
それからは設定した時間ごとにWM_TIMERが飛んでくるんですが・・・
タイマIDって0よかったっけ?
>>910
NetUserGetLocalGroups
914911:04/06/23 00:13
>>912
MSDNにはダメとは書いてないですし、SetTimer()の戻り値も正常なので大丈夫かと。
一応適当な数値でやってみましたが、症状変わらずです・・・
>>911
モーダルとモードレスがわかっていない阿寒
916911:04/06/23 00:28
あー単純なモーダルダイアログでやってみたらきちんと来ました。
何かミスってるぽいですね。

>>915
解決法をご存知でしたら教えていただきたいんですが、
モードレスダイアログの場合CreateWindow()で作ったWindowのように
PeekMessage()した後にIsDialogMessage()を呼ぶのではダメなんでしょうか?
>>916
どんなメッセージループを書いたのか、書いてみ?
918911:04/06/23 01:09
>>917
/* ダイアログ作ったり */

while( hDlg || hMainWnd )
{
  while ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
  {
    if ( hDlg && ::IsDialogMessage( hDlg, &msg ) )
      continue;
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
  /* 毎回呼びたい関数とか */
}

こんな感じです。よろしくお願いします
919911:04/06/23 03:09
よく分かりませんが、主要部分は全部クラス化してたので
GUIの部分だけ書き直したら正常に動作しました。
正直意味不明です。コード内容ほとんど変わってないのに・・・orz
お騒がせしました。
RGBで色を指定するときボタンの色とかのWindowsのシステムカラーを指定するのってどうすればいいんですか?
GetSysColor
>>921
R:00 G:00 B:01ならボタンの色とかRGB値で直接指定できたりはしないの?
>>922
できません。それだと RGB=(0,0,1) の色が使えなくなっちゃうじゃん。
ブラシ (HBRUSH) を取る関数なら、 (HBRUSH) (COLOR_BACKGROUND+1) とかで
いけるんだけどね。
何いってんの?256カラーモードで使えば?
>>923
それは本来GetSysColorBrush(COLOR_BACKGROUND)とするべきではないのか。
>>923
補足で蛇足。先方が OCX コントロールだったりして、OLE_COLOR 型で色指定する場合には、
OleTranslateColor の説明に出てくるいろんな方法 (0x80000000 | COLOR_BACKGROUND とか)が使えます。
927デフォルトの名無しさん:04/06/23 13:44
>>901
パイプで解決しました。
ありがとうございます。
自分以外のウインドウのサイズ変更を制限することは可能でしょうか?
自分のウインドウのサイズを制限する場合はウインドウプロシージャで
WM_GETMINMAXINFOメッセージを処理すれば出来るらしいので、
DLL作ってフックプロシージャで制限したいウインドウのメッセージを
処理しようとしているのですがうまくいきません。

LRESULT CALLBACK MsgProc( int nCode, WPARAM wParam, LPARAM lParam )
{
 CWPSTRUCT *pCWP;
 MINMAXINFO *lpmmi;
 if( nCode == HC_ACTION ) {
  pCWP = (CWPSTRUCT *)lParam;
  if( pCWP->hwnd == hWnd ) { //hWndはサイズ変更を制限したいウインドウのハンドル
   switch( pCWP->message ) {
   case WM_GETMINMAXINFO:
    lpmmi = (MINMAXINFO *) pCWP->lParam;
    lpmmi->ptMinTrackSize.x = 600;
    lpmmi->ptMinTrackSize.y = 480;
    lpmmi->ptMaxTrackSize.x = 1024;
    lpmmi->ptMaxTrackSize.y = 768;
    return 0;
   }
  }
 }
 return CallNextHookEx( Msg, nCode, wParam, lParam );
}

lpmmi = (MINMAXINFO *) pCWP->lParam;
のところを
lpmmi = (MINMAXINFO *) lParam;
に変えてみても出来ませんでした。
ご存知の方いらっしゃいましたらご教授下さい。
>>928
>return 0;
これじゃあ、ターゲットのウインドウまでWM_GETMINMAXINFOが届かない。
メッセージをいじった場合でも、メッセージをブロックする場合以外は
Call〜()を呼ぶ。
あ、ごめん。
この場合これでいいのか。929は忘れてくれ。
単純にグローバルフックになってないとか。
>>931
WM_GETMINMAXINFO以外にもメッセージをフックしていますが、
そちらは正常に動いていますのでグローバルフックにはなっていると思います。
念のためreturn 0;の前にメッセージボックスを入れて確認しましたが、
サイズを変更しようとするときちんと表示されています。
それなのに600*480よりも小さくなってしまうんです…。
MSDNより
> CallWndProc フックプロシージャはメッセージを調べることはできますが、
> 変更することはできません。
>>933
そういうことでしたか…
勉強不足でした。ありがとうございました。
>>934
フックで先方のプロセスに入り込んだ後でサブクラス化(Window Proc の付け替え)すればOKだと思うよ。
>>935
結構雑事が多いから整合取るの大変だけどね
937デフォルトの名無しさん:04/06/23 20:07
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?
>>928
サブクラス化により無事制限出来ました。
どうもありがとうございました。
>>919
???