Win32API質問箱 Build41

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
2デフォルトの名無しさん:2006/03/03(金) 22:24:18
3デフォルトの名無しさん:2006/03/03(金) 22:25:00
32 ttp://pc8.2ch.net/test/read.cgi/tech/1117271829/
31 ttp://pc8.2ch.net/test/read.cgi/tech/1114762194/
30 ttp://pc8.2ch.net/test/read.cgi/tech/1112345886/
29 ttp://pc8.2ch.net/test/read.cgi/tech/1110281860/
28 ttp://pc5.2ch.net/test/read.cgi/tech/1108199304/
27 ttp://pc5.2ch.net/test/read.cgi/tech/1106103119/
26 ttp://pc5.2ch.net/test/read.cgi/tech/1104109858/
25 ttp://pc5.2ch.net/test/read.cgi/tech/1101393155/
24 ttp://pc5.2ch.net/test/read.cgi/tech/1098967135/
23 ttp://pc5.2ch.net/test/read.cgi/tech/1095534704/
22 ttp://pc5.2ch.net/test/read.cgi/tech/1092524669/
21 ttp://pc5.2ch.net/test/read.cgi/tech/1090422324/
20 ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/
19 ttp://pc5.2ch.net/test/read.cgi/tech/1084697545/
18 ttp://pc5.2ch.net/test/read.cgi/tech/1081702990/
17 ttp://pc5.2ch.net/test/read.cgi/tech/1077470361/
16 ttp://pc2.2ch.net/test/read.cgi/tech/1073830065/
15 ttp://pc2.2ch.net/test/read.cgi/tech/1069339866/
14 ttp://pc5.2ch.net/tech/kako/1065/10653/1065328397.html
13 ttp://pc5.2ch.net/tech/kako/1059/10595/1059549320.html
12 ttp://pc5.2ch.net/tech/kako/1056/10560/1056033645.html
11 ttp://pc5.2ch.net/tech/kako/1052/10526/1052651750.html
10 ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html
ttp://pc5.2ch.net/tech/kako/1044/10449/1044929160.html
ttp://pc5.2ch.net/tech/kako/1040/10409/1040964626.html
ttp://pc3.2ch.net/tech/kako/1036/10366/1036654893.html
ttp://pc3.2ch.net/tech/kako/1032/10325/1032548635.html
ttp://pc3.2ch.net/tech/kako/1028/10285/1028580373.html
ttp://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
ttp://pc.2ch.net/tech/kako/1017/10170/1017072275.html
ttp://pc.2ch.net/tech/kako/1006/10067/1006783012.html
ttp://pc.2ch.net/tech/kako/991/991576947.html
4デフォルトの名無しさん:2006/03/03(金) 22:27:00
5デフォルトの名無しさん:2006/03/03(金) 22:30:04
最近気になっていたんだけど、Platform SDK UpdateのURLへ行くと「This page has moved.」と出て、
Webインストーラのページへリダイレクトされるようになっている。
この状態で果たして>>4にPlatform SDK UpdateのURLを載せる必要があるのか?

それともまさかそうなるのは俺だけ?
6デフォルトの名無しさん:2006/03/03(金) 23:16:27
質問です。
ディスプレイの出力先で内蔵グラフや外部CRTやS-VIDEOといった
出力先を選択することが出来ますがこれってAPI的に切り替え可能ですか?
ニッチな問題なので適当なページが見つからなくて…。
7デフォルトの名無しさん:2006/03/04(土) 00:00:35
それはそのデバイス特有の問題なので、Win32APIでは如何ともしがたい。
8デフォルトの名無しさん:2006/03/04(土) 02:21:31
質問があります。
Wordのための、検索ダイアログのようなものを作りたいのです。
Wordの上に検索ダイアログを表示して、
検索ダイアログのエディットコントロールに文字列を入力すると、
Wordのメインウインドウの文書が検索され(Officeオートメーションを使うつもりです)、
該当文字列が、反転表示される、といったものです。
こういう検索ダイアログを、Wordとは別のアプリ(プロセス)で作りたいのです。

Wordのウインドウを親ウインドウに指定してポップアップウインドウでダイアログを表示させるまでは簡単ですが、
文字列入力のために、ダイアログのエディットにフォーカスを設定すると、
Wordの方はフォーカスが失われるので、反転表示が消えてしまいます。

当たり前ですが、なにか他のウインドウにフォーカスがあたったら、
いままでアクティブだったウインドウにはWM_KILLFOCUSメッセージが行くでしょうから、それを受けてWordが
反転表示を消してしまうのだと思います。しかし、それを消さないようにしたいのです。

Wordのオリジナルの検索ダイアログでは、ダイアログウインドウにフォーカスが当たっているのに、
メインウインドウは非アクティブ表示にならず、反転表示されたままです。
こんなことを、別アプリが作った検索ダイアログでも、できないものでしょうか?

以上、ご存知でしたら、ぜひ、ヒントなりとも、お教えいただければ幸いです。よろしくお願いします。
9デフォルトの名無しさん:2006/03/04(土) 06:34:34
C:\WINNT\SYSTEM32などのシステムフォルダ内のファイルには書き換えたり名前変更したりできないものがありますよね?
これを書き換えたり名前変更したりするのは、どの関数を使えばいいのでしょうか?
10デフォルトの名無しさん:2006/03/04(土) 06:41:00
前スレの続きだけど、MultiByteToWideCharのコードページって
何を指定するのがいいの?CP_ACP, CP_OEMCPの違いって何?
11デフォルトの名無しさん:2006/03/04(土) 07:44:26
>>10
ケースバイケース。MSDN見れ。
12デフォルトの名無しさん:2006/03/04(土) 07:55:27
>>9
ウィルスの作者さん、こんなところで質問しないで。
13デフォルトの名無しさん:2006/03/04(土) 08:07:14
>>9
対象のファイルを使用してるプログラムをすべて終了してから
MoveFile OpenFile WriteFile等
14デフォルトの名無しさん:2006/03/04(土) 08:31:08
>>10
迷ったらCP_ACP、将来的に国際化対応を考慮する気があるならCP_THREAD_ACPも悪くない。
OEMコードページというのはDOSが使っていたコードページ。だからCP_OEMCPはあまり出番がないと思う。
15デフォルトの名無しさん:2006/03/04(土) 08:37:04
>>14
ということは、コマンドプロンプトに出力する場合とかは
CP_OEMCP を使う、という理解でOK?
16デフォルトの名無しさん:2006/03/04(土) 10:32:03
コマンドプロンプト≠DOS
17デフォルトの名無しさん:2006/03/04(土) 12:58:51
常駐ソフトを作っています。
システムトレイ上のアイコンが右クリックされると
TrackPopupMenuでポップアップメニューを表示しているのですが、
このときキーボードによるメニューの選択がうまくいきません。
(いくときもあるし、いかないときもある)
具体的には、Exit(&E)というポップアップメニューを表示しているのですが、
このときキーボードでEを入力しても終了したりしなかったりでうまくいきません。
いろいろ検索したり過去ログを読んだりしましたが、どうしても解決できなかったので
ここで質問させていただきました。どうすれば解決できるかどうかよろしくお願いします。
ちなみにソースコードは
http://homepage3.nifty.com/catfood/up/src/up2656.zip
です。
18デフォルトの名無しさん:2006/03/04(土) 13:15:54
たぶんキーボードフォーカスが自ウィンドウにないんだろう。
19デフォルトの名無しさん:2006/03/04(土) 13:28:29
それがTrackPopupMenuの直前にSetForegroundWindowや
SetFocusを入れてもうまくいかないんです・・
20デフォルトの名無しさん:2006/03/04(土) 13:52:14
AttachThreadInput + SetForegroundWindowで強制的にフォアグラウンドにしたらどう?
21デフォルトの名無しさん:2006/03/04(土) 14:20:18
void forceForegrounded(HWND window)
{
    const HWND fw = GetForegroundWindow();
    const DWORD idfw = GetWindowThreadProcessId(fw, 0);
    const DWORD id = GetCurrentThreadId();

    AttachThreadInput(id, idfw, TRUE);
    SetForegroundWindow(window);
    SetFocus(window);
    AttachThreadInput(id, idfw, FALSE);
}
として、SetForegroundWindowをforceForegroundedに置き換えてもうまくいきませんでした
22デフォルトの名無しさん:2006/03/04(土) 14:35:46
   \  __  /
   _ (m) _ピコーン
      |ミ|
   /  .`´  \
     ('A`) そうだ諦めよう!
     ノヽノヽ
       くく
23デフォルトの名無しさん:2006/03/04(土) 15:21:51
少し進歩しました。
アイコンが左クリックされた時にメニューを表示するようにしたらうまくいくようです。
右クリックしたときにこちらが表示するポップアップメニューに少し遅れて、
タスクバーを右クリックしたときにでるポップアップメニューがたまに表示されるので、
なんだかこいつが原因のような気がします。
24デフォルトの名無しさん:2006/03/04(土) 18:41:59
explorerに先に余計なポップアップメニューしてもらうように
forceWindowedの直前にSleep(100)を入れると
だいぶキーボードによる選択がききやすくなりました。
しかしこの方法は逃げてるようで納得いかないです。。
25デフォルトの名無しさん:2006/03/04(土) 18:42:32
s/forceWindowed/forceForegrounded
26デフォルトの名無しさん:2006/03/04(土) 18:43:57
背景色とツールバーとの関係について質問です。
CreateToolbarExでTBSTYLE_FLATを指定してフラットツールバーを作ろうとすると、
ボタン背景がWNDCLASSで指定した背景色と同じになってしまいます。

フラット指定をはずすと、グレイ?っぽいシステムカラーになるのですが、
フラットのときでもシステムカラーを背景色にするのは無理なんでしょうか。
27デフォルトの名無しさん:2006/03/04(土) 18:50:55
ヴァカはファイルハンドルをクローズしない
28デフォルトの名無しさん:2006/03/04(土) 18:54:29
>>23
右クリックでもちゃんとできますがね
キミの作り方が悪いだけかと
29デフォルトの名無しさん:2006/03/04(土) 18:57:32
リージョンをCreateRectRgn()関数とSetWindowRgn()関数を使って作って、非長方形のウィンドウをつくったのですが
全画面表示するとDOSプロンプトと同じような灰色のバーのものが出来上がりました。
下記のように、灰色の部分を省いた訳なんですが、これだとデスクトップの上端にピッタリと張り付きません。
ウィンドウをつまんで動かせるスペースを考慮してずれるのですが、助けてください。。

case WM_CREATE:
hRgn = CreateRectRgn( 0, 25, 400, 800);
SetWindowRgn(hWnd, hRgn, TRUE);
break;
3029:2006/03/04(土) 19:02:47
何かいい方法ってないでしょうか?
31デフォルトの名無しさん:2006/03/04(土) 19:49:08
>>28
その通りです。
ほかの常駐アプリではちゃんと出来ているみみです。
それで、私の作りのどこが悪いのかが分からないんです(´・ω・`)
32デフォルトの名無しさん:2006/03/04(土) 19:52:25
>>31
それはもう自分で調べろよ。
作り方が悪いってわかっただけでも収穫だ。

はい、次の人。
33デフォルトの名無しさん:2006/03/04(土) 19:54:31
解決策が分からなければ詰まった意味が・・・
まあもう少しがんがってみます
34デフォルトの名無しさん:2006/03/04(土) 20:10:26
>>26
作成後に SetWindowLong() で TBSTYLE_FLAT を指定すればいい、
…と、どこかで見たような気が。
35デフォルトの名無しさん:2006/03/05(日) 00:14:04
もし自分で作るアプリケーションをナチュラルインプットに対応させるとしたら
一体どんなことをすることになるんだろう?と気になって調べてみたら、
Text Services Frameworkというのが一番怪しかった。

しかしそれ以上はよく分からなかった。
36デフォルトの名無しさん:2006/03/05(日) 01:47:58
>>4
Advanced Windows 入れないほうがいいよ絶対
37デフォルトの名無しさん:2006/03/05(日) 01:49:31
- 猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
- Platform SDK Update
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

この流れだとプログラミングwindowsがくるとはずだと思うが。。
38デフォルトの名無しさん:2006/03/05(日) 01:49:51
>>36
なんで?
39デフォルトの名無しさん:2006/03/05(日) 01:54:44
>>38
Advancedって、SDKの本じゃない気がするんだよ。。
40デフォルトの名無しさん:2006/03/05(日) 01:59:29
>>39
プ
41デフォルトの名無しさん:2006/03/05(日) 04:31:18
本当に読んでその台詞ならテメエはもう何も書くな有害だから
42デフォルトの名無しさん:2006/03/05(日) 04:39:45
おまえには言ってない
43デフォルトの名無しさん:2006/03/05(日) 04:42:23
>>41
本当に読んでその台詞なら、はやく上の質問に答えてやれよw
44デフォルトの名無しさん:2006/03/05(日) 04:43:10
>>41
邪魔するな。おまえは有害だから
45デフォルトの名無しさん:2006/03/05(日) 04:45:13
↓ 基地外
46デフォルトの名無しさん:2006/03/05(日) 04:50:34
俺かよ!!!
47デフォルトの名無しさん:2006/03/05(日) 04:51:22
人と折り合いを付けながらの会話ができない、Windowsプログラマのスレはここですか?

48デフォルトの名無しさん:2006/03/05(日) 04:55:56
>>34
ありがとうございます。
CreateToolbarExでWS_CHILD | WS_VISIBLEを指定して、
できたハンドルにSetWindowLongでWS_VISIBLE | TBSTYLE_FLATを指定するとうまくできました。
ただ、WS_CHILDまで含めて指定するとツールバーが下につくようです。
なんかの本でWS_CHILDは必ず指定しろとかなんとか。

もう少し試してみます。
49デフォルトの名無しさん:2006/03/05(日) 06:27:39
っ[MoveWindow]
50デフォルトの名無しさん:2006/03/05(日) 15:04:32
>>29
WS_BORDERとかWS_CAPTIONとかWS_EX_THICKFRAMEとかを使わないで
CreateRectRgnのtopを0のまま
WM_NCHITTESTに応じて下のようにしてウインドウをつまむ領域を指定する
 if(GET_Y_LPARAM(lParam)<25) return HTCAPTION;
WM_NCCALCSIZEに応じてクライアント領域の位置を指定
ぐらいかな?
51デフォルトの名無しさん:2006/03/05(日) 18:58:04
>>29 ぶっちゃけRectの意味が分かってないと思う
52デフォルトの名無しさん:2006/03/05(日) 20:35:08
自分で作ったGUIアプリケーションにビジュアルスタイルを適用できると聞いたのですが
本当でしょうか?
53デフォルトの名無しさん:2006/03/05(日) 20:49:35
テーマ使いたいんならリソースエディタでやるんじゃないの?ソースコードに書くなよ
54・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 20:50:49 BE:552841496-
プログラム名.manifestだろ
55デフォルトの名無しさん:2006/03/05(日) 20:53:33
それとも自作のコントロールをビジュアルスタイルに対応させたいということか?
56デフォルトの名無しさん:2006/03/05(日) 20:55:31
5752:2006/03/05(日) 21:42:09
>>53-56
ありがとうございます。
難しそうですが、ちょっくらやってみます。
58デフォルトの名無しさん:2006/03/05(日) 23:51:56
>>26>>48
IE3に初めてフラットツールバーが導入されたときには背景に画像ファイルを充てることが出来たからその名残だと思うが,
英語版MSDNのToolbar Control and Button Styles に対策が書いてあると思う.
マニュアルどおり素直にやるならTBSTYLE_CUSTOMERASEを指定してParentWindowがNM_CUSTOMDRAWに応じて背景を消去する.
59デフォルトの名無しさん:2006/03/06(月) 04:34:27
>>15
そもそも日本語はどっちもCP932なんであまり関係ない。
関係あるのはOEM CPとANSI CPが違ってた欧米。
もちろん国際化対応のプログラムを書くなら考慮する必要もあり得るが。
ちなみにコマンドプロンプト≠DOSだがコマンドプロンプトでもOEM CPを使う。
60デフォルトの名無しさん:2006/03/06(月) 13:20:14
APIでウインドウの可視状態を求める関数って何でしょうか?
フォームのウインドウハンドルを指定すると表示・非表示を
返してくるものとか。
61デフォルトの名無しさん:2006/03/06(月) 13:22:46
(´-`)/ IsWindowVisible()
62デフォルトの名無しさん:2006/03/06(月) 13:26:51
>>61
ありがとう!!
63デフォルトの名無しさん:2006/03/07(火) 02:46:28
SAFEARRAYとかVARIANTとかなんであんなに使いにくいんですか?
64デフォルトの名無しさん:2006/03/07(火) 03:13:44
ここはおまいが愚痴を言うスレッドじゃないんだよ
チラシの裏にでも書いてろ
65デフォルトの名無しさん:2006/03/07(火) 07:55:58
>>63
VBからなら普通に使える。
それはともかく、VARIANTならATL::CComVariantとか_variant_tを使えばだいぶ楽だと思うが。
66デフォルトの名無しさん:2006/03/07(火) 08:00:36
>>63
VBの内部データ構造そのままだから。
そのまま使うようにはできていない。

COMには3つの大きな欠点がある
・引数違いのオーバーロードを認めない
・VARIANT
・IDispatch
すべてこいつらはVBが癌なのだよ。
67デフォルトの名無しさん:2006/03/07(火) 12:58:18
>66
COMの本質がわかってないなぁ。

スクリプトの透過性をたもったまま
バイナリレベルの実行時インターフェィス互換のためには必要だろ?


オーバーロードはコンパイル時のバインド解決だし・・・
68デフォルトの名無しさん:2006/03/07(火) 15:07:50
ぶっちゃけ、VARIANTやIDispatchは、COMの上に構築されたものであって、狭義のCOMには含まれない。

VARIANTに関してはVBの問題だし、
IDispatchに関してはVBScriptの問題。

本来はコンポーネント側がケアする問題ではないのだけど、
安直に、コンポーネント側がなんとかしてね、というのはマイクロソフトらしい解決法だと言える。

IDispatchに至ってはインタフェースという概念を台無しにしているよな。

あるコンポーネントがIFooとIBarを持つとき、
IFoo->Kick()
IBar->Kick()
は当然違う意味を持つのだけど、
このコンポーネントにIDispatchを付けた時、困ったことになる。
69デフォルトの名無しさん:2006/03/07(火) 15:10:05
SendMessageのLPARAMで文字列を送ろうとしてるんだけど、受信側ではポインターのアドレスは同じだけどメモリーダンプを見るとあったはずの文字列が存在していない。
プロセスの保護による問題のような気がするけど、回避するにはどうしたらいいですか?
70デフォルトの名無しさん:2006/03/07(火) 15:10:27
VBScriptからIDispatchを使わずに、
任意のインタフェースのメソッドを呼ぶためのラッパーを見かけたよ。

どうしてマイクロソフトはそれを、VBScriptに標準搭載しなかったのかと、小一時間。
71デフォルトの名無しさん:2006/03/07(火) 15:11:56
>>69
LPARAMで送ることができるのは、void*な値だけです。
文字列を送ることはできません。
72デフォルトの名無しさん:2006/03/07(火) 15:18:31
>>69
どーしてもSendMessageで別プロセスに文字列を渡したいなら、
VirtualAllocExで相手のプロセス空間にメモリを確保し、
そこにWriteProcessMemoryで文字列を書き込み、
そのアドレスをSendMessageで渡し、
SendMessageが戻ってきたら、VirtualFreeExでメモリを解放する。

素直にプロセス間通信のための道具を使ったほうがいいと思うけどね。
73デフォルトの名無しさん:2006/03/07(火) 15:18:51
アドレスは物理アドレスを示している訳じゃないんだから、
別のプロセスで読めなくて当然。
7469:2006/03/07(火) 15:20:05
>71
レスどうもです。
>LPARAMで送ることができるのは、void*な値だけです。
>文字列を送ることはできません。
って事は、1文字ずつ小分けにして送らなくてはダメって事?
7569:2006/03/07(火) 15:25:02
>72
>73
レスありがとうございます。
簡単にはいかないんですね。
プロセス間通信ついてですが、検索キーワードになりそうなヒント教えてくれませんでしょうか
よろしくお願いします。
76デフォルトの名無しさん:2006/03/07(火) 15:26:54
SetWindowTextでダミーウィンドウに送ってやれば?
7769:2006/03/07(火) 15:27:46
プロセス間通信って「WM_COPYDATA」の事になるんですかね?
78デフォルトの名無しさん:2006/03/07(火) 16:03:03
>>74
そもそも、何をやりたいの?
それによって、何を選ぶか、変ってくると思うよ。

>>75
セキュリティ的な問題がなければ、難しくはないよ。
mallocの代わりにVirtualAllocEx
memcpyの代わりにWriteProcessMemory
freeの代わりにVirtualFreeEx
を使うだけなんだから。

検索キーワードは「プロセス間通信」
79デフォルトの名無しさん:2006/03/07(火) 16:22:18
VirtualAllocExとか言ってる人って
WM_COPYDATAを知らないの?
8069:2006/03/07(火) 16:40:21
「WM_COPYDATA」でできました。
ありがとうございます。
81デフォルトの名無しさん:2006/03/07(火) 16:42:13
検索キーワードは「WM_COPYDATA」であってるよ。
82デフォルトの名無しさん:2006/03/07(火) 16:53:01
>>79
何をやりたいのか書いてないから、
メッセージを受け取る側をいじって良いかどうかすら書いてないから、
もっとも汎用的な方法を書いたのよ。




83デフォルトの名無しさん:2006/03/07(火) 16:55:42
WM_COPYDATAすげー
84デフォルトの名無しさん:2006/03/07(火) 16:56:32
ていうか、>>69とに対しては>>72が妥当でしょ。

受け取り側プロセスで有効なポインタの取得のしかた
という質問なんだからさ。
85デフォルトの名無しさん:2006/03/07(火) 17:00:25
>82
>SendMessageのLPARAMで文字列を送ろうとしてるんだけど、受信側ではポインターのアドレスは同じだけどメモリーダンプを見るとあったはずの文字列が存在していない。
>プロセスの保護による問題のような気がするけど、回避するにはどうしたらいいですか?
文字列を送りたいって書いてあるがな。
86デフォルトの名無しさん:2006/03/07(火) 17:37:58
受け取り側の仕様を変更していいかどうか、書いてないし。
87デフォルトの名無しさん:2006/03/07(火) 18:04:12
VirtualAllocExはWin98で使えないから注意だ
88デフォルトの名無しさん:2006/03/07(火) 19:19:49
たとえば送る相手も今自分で作っているのならWM_COPYDATAも使えるが、
もし相手は変更できないのならVirtualAllocExを使う必要がある。
さらに9xでも動かしたければメモリマップドファイルを併用する必要もある。
89デフォルトの名無しさん:2006/03/07(火) 19:32:53
面白そうだったから調べてみたんだが、WM_COPYDATAって
COPYDATASTRUCT構造体を介して、ダブルワードのデータと
データへのポインタの2つを同時に受け渡しできるって認識でOK?
90デフォルトの名無しさん:2006/03/07(火) 19:47:30
ok
91デフォルトの名無しさん:2006/03/07(火) 19:48:38
ULONG_PTR 1つ と 任意の長さのバイナリ 1かたまり

sizeof(ULONG_PTR)は、32ビットプロセスでは4だが、64ビットプロセスでは8になることに注意。
相手に渡すのはポインタの値ではなく、ポインタのさす先のメモリの内容。
92デフォルトの名無しさん:2006/03/07(火) 19:50:17
>>90
お前もかよ、ポインタを渡すと、ポインタのさす先の中身まで一緒に渡ると思ってるのは。
93デフォルトの名無しさん:2006/03/07(火) 19:52:42
あー古いSDKやドキュメントだと、COPYDATASTRUCT構造体は
DWORD dwData
DWORD cbData
PVOID lpData
と定義されているかも。

だいぶ前に64ビット対応のために、
ULONG_PTR dwData
DWORD cbData
PVOID lpData
に変更されました。
94デフォルトの名無しさん:2006/03/07(火) 19:59:00
>>93
型定義見忘れてた
ってことはポインタ2つを渡せるって事か

つーか型と変数名・説明が食い違ってないか?>MSDN-en
ハンガリアン記法の欠点だな
95デフォルトの名無しさん:2006/03/07(火) 20:29:17
メンバ名まで変えるわけにはいかんだろう。
あと、たぶんポインタ二つは無理だぞ。
dwDataにポインタ入れても>>69と同じことになるかと。
96デフォルトの名無しさん:2006/03/07(火) 21:29:33
ULONG_PTRはポインタを格納できるサイズの符号なし整数であってポインタじゃないぞ
97デフォルトの名無しさん:2006/03/07(火) 23:28:33
COPYDATASTRUCTの使い方、わかってない人いるのかな。

渡したいデータへのポインタをPVOID lpDataにセット。
そのデータの長さをバイト数でDWORD cbDataにセット。

ULONG_PTR dwDataは、何に使ってもいいのだけど、たとえば、
WM_COPYDATAで渡すデータを振り分けるためのIDに使う。
98デフォルトの名無しさん:2006/03/08(水) 00:01:17
んな情報はlpDataの内容に入れとけばいいじゃんと思ったり思わなかったり。
99デフォルトの名無しさん:2006/03/08(水) 07:11:26
>>98
そうなんですよ、川崎さん。

でもね、そんなこといったら、
関数の引数は1つで十分ですよ、わかってくださいよ
になってしまうんですよ。
100デフォルトの名無しさん:2006/03/08(水) 09:07:36
アドレス違反が発生するリスクを軽減させるためのものでしょ。
lpDataがヌルなどの不正なアドレス値だった場合、
必要な情報があるはずのオフセット位置へ飛ぶことさえできないわけで。
dwDataのようなユーザ定義値がない場合、信頼できないプロセスからWM_COPYDATAが送信されてきた時に(ry
101デフォルトの名無しさん:2006/03/08(水) 09:42:48
lpDataからcbDataバイトが有効なのはOSが保証してくれるんじゃないの?
102デフォルトの名無しさん:2006/03/08(水) 09:45:16
ていうか、
送信側のプロセスがlpDataにセットした値が、
そのまま受信側のプロセスに渡されるわけじゃないよ。
103デフォルトの名無しさん:2006/03/08(水) 10:26:33
盛り上がってますね
104デフォルトの名無しさん:2006/03/08(水) 14:29:42
アニメーションカーソルについて教えてください。

いまマウスカーソルをDirect3D8のサーフェスに対してソフトウェア描画する
必要性があり、GetCursor()→GetIconInfo()→GetObject()でカーソルの
マスクとビットマップを取得しています。

普通のカーソルに対してはこれでうまくいっていますが、これではアニメーション
カーソルが動いてくれません。

GetCursor()で取得したカーソルのハンドルが、アニメーションカーソルかどうか
判定する方法や、そこからビットマップ情報を取得する方法をご存知の方
いませんか?
105デフォルトの名無しさん:2006/03/08(水) 19:27:44
>>104
VC++6.0 のサンプルに aniEdit, imageEdit というのがある。
これ以外に説明書はないみたい。(.NET, VC++200X では未確認)
時計の針が廻る cursor を .ani ファイルで作って、WINDOWS の Cursor dir に
入れ、砂時計の代わりにこのファイルを指定すると動くのは確認した。
上記のサンプルに timer で動かす手順はある。
106デフォルトの名無しさん:2006/03/08(水) 19:51:53
Windows標準コントロール(Buttonクラスとか)からテキストを
抽出するのはWM_GETTEXTを送ればできますが、標準じゃないクラス
から文字列を得るにはどうすればいいのでしょうか?


107デフォルトの名無しさん:2006/03/08(水) 19:52:52
それぞれのクラスに応じて。
108デフォルトの名無しさん:2006/03/08(水) 19:54:12
ウィンドウであるならGetWindowTextでもしとけ
109デフォルトの名無しさん:2006/03/08(水) 20:58:48
>>108
WM_GETTEXTで取れないテキストはGetWindowTextで
取れないぞぇ。
110デフォルトの名無しさん:2006/03/08(水) 21:03:24
>>107
>>108
>>109
WM_GETTEXTをメモ帳に送れば編集中のテキストが抽出されますが、
同じことを秀丸でやろうとするとできないんですよね。。。
なんかいい方法ないでしょうか?
111デフォルトの名無しさん:2006/03/08(水) 21:05:19
標準コントロールじゃないって言うと、コモンコントロールとかか?
だったらそれぞれにメッセージやマクロが用意されとるよ
112106:2006/03/08(水) 21:05:57
書き忘れました。110は私です。
110はウィンドウメッセージの実験上やったことなので、
こぴぺすればいいとかそういうことじゃないです。
いちお念のため
113デフォルトの名無しさん:2006/03/08(水) 21:07:35
>>110
それぞれの相手に応じてやるしかない。
「それぞれのやり方」は自分で調べろ。少なくともAPIレベルでは決まっていない。
114デフォルトの名無しさん:2006/03/08(水) 21:07:52
だって秀丸はエディットコントロールでもリッチテキストでもないからな
諦めろ
115デフォルトの名無しさん:2006/03/08(水) 21:19:51
Delphiスレから誘導されました

Windows Media Playerで再生してる曲の曲名を取得する方法ありませんか?
116デフォルトの名無しさん:2006/03/08(水) 21:24:55
Delphiスレに行ってください^^
117デフォルトの名無しさん:2006/03/08(水) 21:25:56
再生している曲名を広報するプラグインでも作れば?
メッセンジャーはそうしていたような。
118デフォルトの名無しさん:2006/03/08(水) 21:39:07
WMP SDKってのがあるから、とりあえずそれ見てみれば?
119デフォルトの名無しさん:2006/03/09(木) 00:05:44
>>117
なるほど
>>118
調べてみます.
120デフォルトの名無しさん:2006/03/09(木) 12:31:31
NtSetInformationFileを直接使えばFILE_FLAG_DELETE_ON_CLOSEを取り消せることが
分かりましたが、これを公開APIだけで行う方法はありませんか?
121120:2006/03/09(木) 12:37:39
自己レス
VistaだとSetFileInformationByHandleでできるようです。
122デフォルトの名無しさん:2006/03/09(木) 16:17:02
スレ違いだったらすみません。
スレを間違えてしまったような気がするので、恐縮ながら紹介だけさせていただきます。
http://pc8.2ch.net/test/read.cgi/tech/1140269442/401-402
宜しくお願い申し上げます。
123デフォルトの名無しさん:2006/03/09(木) 16:19:57
>>122
どこにWin32APIが関わっているのかと(ry
124デフォルトの名無しさん:2006/03/09(木) 18:24:42
>>122
VB.NETスレへどうぞ
125デフォルトの名無しさん:2006/03/09(木) 18:39:33
C♯じゃね?
126デフォルトの名無しさん:2006/03/09(木) 18:45:56
その関数を実行すると即時に、あらゆる終了コードの実行をさせずに
プロセスを終了させる関数はありますか?
TerminateProcessはその後まだコードが動いているようなんですが。
127デフォルトの名無しさん:2006/03/09(木) 18:55:39
ダイアログリソースでダイアログと、そのコントロールを作って、
コントロールに"〜のコントロールにマウスが乗った・外れた""フォーカスが入った"
などを調べたいとき、どうしたらいいですか?

最初、素直にダイアログプロシージャのWM_NCHITTESTやWM_MOUSEMOVEメッセージから来るマウスの位置から調べようと思ったのですが、
Static Text以外のEdit Control上とか、Radio Button上とかではWM_MOUSEMOVEメッセージが来ないので…
128デフォルトの名無しさん:2006/03/09(木) 18:59:26
>>127
サブクラス化
129デフォルトの名無しさん:2006/03/09(木) 19:09:31
おいおい、わざわざあっちで解答書いてやったのに、そのままコピペかよ・・・
130デフォルトの名無しさん:2006/03/09(木) 19:51:39
>>128
ありがとう。
何とかなりそうです。

>>129
マジすまんです。
WM_NCHITTESTの方に目が行っていて。
サブクラス化のところが盲点に入ってた…orz
131デフォルトの名無しさん:2006/03/09(木) 20:05:17
> TerminateProcessはその後まだコードが動いているようなんですが。
なんでそう思ったの?
132106:2006/03/09(木) 21:03:13
>>113
>>114
レスありがとうございます。
あきらめることにします
133127:2006/03/09(木) 21:03:39
追加で質問なんですけど

Static TextやEdit Control、Radio Buttonなどがそれぞれいくつもあって、
どれにも共通の(マウスを右クリックすると、そのコントロールに応じてテキストを表示)動作をさせる場合、
すべてのウインドウに対してそれぞれサブクラス化させるのではなくて、
まとめて処理させる上手い方法はありませんか?

ちょっとWin32APIと話がずれてしまいそうですけど…
134デフォルトの名無しさん:2006/03/09(木) 21:12:49
サブクラス化したらいいと思うが。プロシージャは1つで済むわけだし。
135デフォルトの名無しさん:2006/03/09(木) 21:13:43
まさかサブクラス化するのに、ひとつずつプロシージャが要るとか思ってるわけじゃ・・・さすがにないよな・・・
136デフォルトの名無しさん:2006/03/09(木) 21:14:57
>>133
NM_RCLICK?
137デフォルトの名無しさん:2006/03/09(木) 21:17:24
>>135
ごめんなさい…
そのまさかですorz

そこら辺学べる手頃なサイトあります…?
説明して頂ければなおうれしいですけど…
(うわぁC超初心者丸出しですわ)
138137:2006/03/09(木) 21:49:57
ちゃんと分かってない時点でナンですけど、
例えば、

OldProc1 = (WNDPROC)SetWindowLong(hCtrl1, GWL_WNDPROC, (LONG)NewProc);
OldProc2 = (WNDPROC)SetWindowLong(hCtrl2, GWL_WNDPROC, (LONG)NewProc);
OldProc3 = (WNDPROC)SetWindowLong(hCtrl3, GWL_WNDPROC, (LONG)NewProc);
OldProc4 = (WNDPROC)SetWindowLong(hCtrl4, GWL_WNDPROC, (LONG)NewProc);
……

LRESULT CALLBACK NewProc(HWND hEdit, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg) {
        case NM_RCRICK:
            switch (hEdit) {
                case hCtrl1:
                    //どーたらこーたら
                break;
                case hCtrl2:
                    //どーたらこーたら
                break;
                〜中略〜
            }
        break;
    }
    return CallWindowProc((WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC), hEdit, msg, wp, lp);
}
みたいにすればいい、てな考え方で大丈夫ですか?
139デフォルトの名無しさん:2006/03/09(木) 21:50:17
>>136
それコモンコントロール
140デフォルトの名無しさん:2006/03/09(木) 22:04:27
質問です。

タスクマネージャのように起動中のアプリケーションの
「応答なし」、「実行中」という状態を知るには
どうすればいいのでしょうか?
何か参考になる情報など頂ければと思います。
よろしくお願いします。
141デフォルトの名無しさん:2006/03/09(木) 22:09:29
>>140
半公開APIだがIsHungAppWindowというそのまんまの関数がある
142デフォルトの名無しさん:2006/03/09(木) 22:10:30
ウィンドウのあるプロセスならSendMessageTimeoutで適当なメッセージ投げて反応をみる
143デフォルトの名無しさん:2006/03/09(木) 22:18:32
おおお!素早いご回答ありがとうございます。

>>141
そんな関数があったのですね。
試してみます。

>>142
なるほど、そんなやり方もあるわけですね。

基本的にタスクマネージャと同じように起動時に、
ウィンドウを列挙して応答の有無を表示したいので、
時間がかからなそう?な IsHungAppWindow() を試してみたいと思います。
まだまだ猫でも分かる〜で勉強中の初心者なもんで、とても勉強になります。
ありがとうございます。
144デフォルトの名無しさん:2006/03/09(木) 22:26:28
>>138
その状態ではGetWindowLong(hEdit, GWL_WNDPROC)は当然NewProcを返す。

SetProp/GetPropなどを使って独自に元のウィンドウプロシージャを管理すべき。
あとGet/SetWindowLongよりもWin64対応のためにGet/SetWindowLongPtrを使うべき。
145デフォルトの名無しさん:2006/03/09(木) 22:49:20
>>143
ハングアップしていたら、ウィンドウは列挙できない。
146デフォルトの名無しさん:2006/03/09(木) 23:10:12
ごめん>>139の突っ込みの意味がわからない。誰か教えて。
147デフォルトの名無しさん:2006/03/09(木) 23:11:14
>>145
じゃあタスクマネージャはどうやってるの?
148デフォルトの名無しさん:2006/03/09(木) 23:14:04
>>145
マジすか・・・
ウィンドウクラス名とかタイトル名とかも取れないのかな。
単純にタスクマネージャと同じ様なウィンドウのリストを作りたいのですが
何か特別なやり方が要るのでしょうか。
149デフォルトの名無しさん:2006/03/09(木) 23:19:20
>>148
いやふつうに嘘だから
150デフォルトの名無しさん:2006/03/09(木) 23:20:33
> ウィンドウクラス名とかタイトル名とかも取れないのかな。
クラス名は取れるけどタイトルは(WM_GETTEXTから帰ってこないので)
取れない場合がある。
151デフォルトの名無しさん:2006/03/09(木) 23:21:06
少なくともウィンドウタイトルを取得するには該当ウィンドウがWM_GETTEXTに反応する必要があると思うが。
152デフォルトの名無しさん:2006/03/09(木) 23:29:18
>>144
ありがとうございます。
確かにSetWindowLongで変更したら当然GetWindowLongは変わりますね…orz
>>138で言えば、予めhCtrlxとOldProcxを対応させて管理しておけばいいんですね?
153138:2006/03/09(木) 23:57:47
今更だが、switchのcaseに変数使ってる事に気付いた。

不便だなぁ…
154デフォルトの名無しさん:2006/03/10(金) 07:57:19
>150
WM_GETTEXTは帰ってこないけど、GetWindowTextは帰ってくる。
詳細はThe Old New Thingを読んで熟知すべし。
155デフォルトの名無しさん:2006/03/10(金) 07:58:23
156デフォルトの名無しさん:2006/03/10(金) 12:28:21
UNICODE_STRINGのLengthが文字数ではなくバイト長なのはなんで?
157デフォルトの名無しさん:2006/03/10(金) 13:06:41
>>156
どのAPIで?
158デフォルトの名無しさん:2006/03/10(金) 14:08:16
そういう名前の構造体の話だぞ。
159デフォルトの名無しさん:2006/03/10(金) 14:39:47
>>156
UNICODE_STRINGが低レベルな世界のものだからだと思う。
160デフォルトの名無しさん:2006/03/10(金) 14:44:11
Win32APIでやってんなら2で割ってやりゃいいだけじゃん
161デフォルトの名無しさん:2006/03/10(金) 18:29:39
解決法は聞いていない。
162デフォルトの名無しさん:2006/03/11(土) 03:33:40
ウィンドウハンドル渡してスクリーン上?のZオーダーとる関数教えてください。
163デフォルトの名無しさん:2006/03/11(土) 05:19:25
みんな、サブクラス化とかいってるけど、Editなどの登録済みクラスはWindows的には
サブクラス化は推奨されていないんだな。で、スーパークラス化を使うべきなんだな。

164デフォルトの名無しさん:2006/03/11(土) 06:23:04
ウィンドウのドラッグの開始と終了を検知するために、
WM_ENTERSIZEMOVE と WM_EXITSIZEMOVE を追っているんだけど、
システムメニューから [移動] を選択して、
そのままウィンドウをドラッグせずに他のウィンドウをクリックすると、
WM_EXITSIZEMOVE が発行されないままサイジングが終了してしまうらしい。
何かいい対処法はない?
165デフォルトの名無しさん:2006/03/11(土) 07:32:55
WM_CANCELMODEは?
166デフォルトの名無しさん:2006/03/11(土) 09:58:43
>>163
無知な俺にソースを教えてください。
167デフォルトの名無しさん:2006/03/11(土) 11:07:18
「スーパークラス化」でぐぐれば即出てくる
168デフォルトの名無しさん:2006/03/11(土) 11:22:19
Google開いて2分で答え
169デフォルトの名無しさん:2006/03/11(土) 11:45:13
玄関開けたら2分でご飯
170デフォルトの名無しさん:2006/03/11(土) 11:55:16
スーパークラス化とサブクラス化は目的で使い分けるもんで、どちらかを推奨っておかしくない?
171デフォルトの名無しさん:2006/03/11(土) 12:45:57
やってはいけないのは、システムグローバルなクラスに対する
グローバルなサブクラス化じゃないの?
SetClassLong()でサブクラス化するやつ。

SetWindowLong()でサブクラス化するのはインスタンス単位だから
何も問題無いはずだが。
172デフォルトの名無しさん:2006/03/11(土) 13:56:28
ユーザーからの入力をいち早く処理するには
どうしたらいいんでしょうか?
具体的には、マウス動作をキーボードで実現したいんですが。
例:カーソル移動を上下左右キーでで、クリックをエンターキーとか。
173デフォルトの名無しさん:2006/03/11(土) 14:22:46
>>172
UserAssistanceだっけ? OSの標準機能にありますが。
174デフォルトの名無しさん:2006/03/11(土) 16:21:44
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win116.html
の下のほうに記述してある

>1行のバイト数を取得するには、次の数式を利用しています
>
>4 * ((bmpCoreHeader.bcWidth * bmpCoreHeader.bcBitCount + 31)/ 32);

この数式の意味を教えてください。
+31とは何なのでしょうか??
175デフォルトの名無しさん:2006/03/11(土) 16:31:20
32-1
176デフォルトの名無しさん:2006/03/11(土) 16:33:37
>>174
DIBの1行のサイズは常に4バイト=32bit単位でなければいけないから。

x + (y - 1) / yってのは端数切り上げのx/y。
177デフォルトの名無しさん:2006/03/11(土) 16:37:54
プッシュボタンの文字色を変更しようとWM_CTLCOLORBTNに行き着きましたが
ttp://support.microsoft.com/default.aspx?scid=kb%3Bja%3B130952
95以降は何も効果がないようです。(実際変更できませんでした)
オーナードローするしかないんでしょうか?
178デフォルトの名無しさん:2006/03/11(土) 16:40:29
>>174
DIBは必ず1ラインが4の倍数のバイト数になっている。(DWORDアライメント)
そのための端数を繰り上げる計算をしている。
179デフォルトの名無しさん:2006/03/11(土) 16:44:54
>>177
そのリンク先に効果が無いって書いてあるじゃないか。
そこまで来たなら、今度はWM_CTLCOLORBTNでググれ。
180174:2006/03/11(土) 17:04:38
>>175
>>176
>>178
ありがとうございます。
ちょっとだけ分かってきました。
しかし、その場合、横4pixelの24biフルカラー画像の場合、1行が15Byteになってしまいませんか?
横3pixelの場合は12Byteで4の倍数ですけど・・・
181デフォルトの名無しさん:2006/03/11(土) 17:07:24
>>179
あれ?見つかった。一応検索したんだけど
WM_CTLCOLORSTATICとかでも検索してたから、ごっちゃになってたかな…
オナドローが一般的らしいです。
182デフォルトの名無しさん:2006/03/11(土) 17:08:35
>>180
ヒント: 整数同士の演算は小数点以下が切り捨てられる。
183デフォルトの名無しさん:2006/03/11(土) 18:52:41
式見てわからないなら、実際にいくつかの値で試してみればいいのに。
184デフォルトの名無しさん:2006/03/11(土) 19:27:50
はじめまして、UpdateLayeredWindowを使って描写しているんですが、
部分的に再描写したいとき、どこかでBitBlt等を使って描写することは出来ないのでしょうか。
やってみましたがうまくいきませんでした。
再度UpdateLayeredWindowを呼び、全画面を書き換えるしかないのでしょうか。
185デフォルトの名無しさん:2006/03/11(土) 20:32:50
そんな貧乏くさいことを考えてはいかん
富豪になれ
186174:2006/03/11(土) 21:14:04
>>182
それは分かっています。
>>183
実際計算して>>180のような疑問がおきました。

例えば、横4pixelの24bitフルカラー画像の場合、
4 * (( 4 * 24 + 31 ) / 32 ) = 15.875 [ Byte ]
これをint型の変数に代入しているので、
その変数には小数点以下が切り捨てられた15バイトが入ることになります。
これは4バイトの整数倍ではありません。
187174:2006/03/11(土) 21:15:07
あ、すみません、12になりますね。
間違えました。
188174:2006/03/11(土) 21:29:02
たしかに
4 * 整数
であれば4の倍数になるのですが、
どのような考え方でこの式が導かれるのか教えてください m(_ _)m
189174:2006/03/11(土) 21:39:51
分かってきたのですが、どうも>>176の部分の理屈が解せません。
ですが、これは数学の問題になってくるので、別スレで聞いてみることにします。
ありがとうございました m(_ _)m
190174:2006/03/11(土) 21:48:30
理解できました!
感動です!
ありがとうございました!
191デフォルトの名無しさん:2006/03/11(土) 21:57:50
>>188
そこの説明で式の過程が飛ばされているから ややこしくなってるだけなんじゃ

n byte アラインするだけなら
 (A + n-1) / n * n
こういうことになる

bit数→ byte数換算 と 4byte アラインとを複合して 4*8 bit でアラインしたいってことになるから
 (bpp*w + 31) / 32 * 32    // bit数
 (bpp*w + 31) / 32 * 32 / 8 // byte数
 → (bpp*w + 31) / 32 * 4
192174:2006/03/11(土) 23:47:17
>>191
なるほど。
ありがとうございます!

別の質問なんですが、
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win116.html

char * chPixelBit;
というchar型のポインタに
ReadFile(hFile , chPixelBit , bmpFileHeader.bfSize - bmpFileHeader.bfOffBits , &dwBytes , NULL);
というカタチでピクセルビットを格納しているのですが、
なぜ*chPixelBitはchar型なんでしょうか??
また、ピクセルビットが記述されるところまで、ファイルポインタを移動させるなどの所作が
見られませんが、なぜキレイに格納されるのでしょうか??
193デフォルトの名無しさん:2006/03/12(日) 00:02:22
誰か暇なひと、一緒にデバッグしましょう。して下さい(__)
1941:2006/03/12(日) 00:05:05
// 自由曲線を描くプログラム

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

void DrawCurve(int sx, int sy ,int x1,int y1, int x2, int y2,
int ex, int ey, int len);
int CmpLine(int xs, int ys, int xe, int ye, int len);

char szClassName[] = "graphics02";//ウィンドウクラス
HDC hdc;
195デフォルトの名無しさん:2006/03/12(日) 00:05:31
>>192
ReadFileはファイルポインタを進める。
1962:2006/03/12(日) 00:06:08
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
197デフォルトの名無しさん:2006/03/12(日) 00:06:39
//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;//プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = NULL;
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; // メニュー名
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = NULL;

return (RegisterClassEx(&wc));
}
1984:2006/03/12(日) 00:07:24
//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;

hWnd = CreateWindow(szClassName,
"自由曲線を描くプログラム",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,//X座標
CW_USEDEFAULT,//Y座標
CW_USEDEFAULT,//幅
CW_USEDEFAULT,//高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
1995:2006/03/12(日) 00:09:06
/*再帰的処理*/
/*DrawCurve関数*/
void DrawCurve(int sx, int sy ,int x1,int y1, int x2, int y2,
int ex, int ey, int len)
{
int p1x,p1y,p2x,p2y,p3x,p3y;
int p4x,p4y,p5x,p5y,p6x,p6y;

if (CmpLine(sx, sy ,x1, y1, len) &&
CmpLine(x1,y1,x2,y2,len) &&
CmpLine(x2,y2,ex,ey,len)){
MoveToEx(hdc,sx,sy,NULL); LineTo(hdc,x1,y1);
LineTo(hdc,x2,y2); LineTo(hdc,ex,ey);
return ;
}

p1x = (sx+x1)/2; p1y = (sy+y1)/2;
p2x = (x1+x2)/2; p2y = (y1+y2)/2;
p3x = (x2+ex)/2; p3y = (y2+ey)/2;
p4x = (p1x+p2x)/2; p4y = (p1y+p2y)/2;
p5x = (p2x+p3y)/2; p5y = (p2y+p3y)/2;
p6x = (p4x+p5x)/2; p6y = (p4y+p5y)/2;

DrawCurve(sx,sy,p1x,p1y,p4x,p4y,p6x,p6y,len);
DrawCurve(p6x,p6y,p5x,p5y,p3x,p3y,ex,ey,len);
return ;
}
2006:2006/03/12(日) 00:12:07
//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HPEN hPen1;

switch (msg) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hPen1 = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
SelectObject(hdc, hPen1);
/*再帰的な関数DrawCurveの呼び出し*/
DrawCurve(2, 2, 3, 6, 10, 10, 25, 3, 4);
DeleteObject(hPen1);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
2017:2006/03/12(日) 00:12:49
int CmpLine(int xs, int ys, int xe, int ye, int len)
{
int len1 = xe - xs;
int len2 = ye - ys;

if (len1<0) len1 = -len1;
if (len2<0) len2 = -len2;

if((len1<len)&&(len2<len))
return 1;
return 0;
}
202デフォルトの名無しさん:2006/03/12(日) 00:14:06
↑ ここまでです(__)
203デフォルトの名無しさん:2006/03/12(日) 00:15:17
どういう動作を期待していて、実際にはどうなるのかが書かれてないと話にならない。
204デフォルトの名無しさん:2006/03/12(日) 00:16:41
猫のソースに、
DrawCurve関数と CmpLine関数を付け加えただけです。
眠いので寝まつ
205デフォルトの名無しさん:2006/03/12(日) 00:29:09
俺も暇だけど寝まつ。
206デフォルトの名無しさん:2006/03/12(日) 00:36:35
長いソースはアプロダにうpしろと言いたい。
207デフォルトの名無しさん:2006/03/12(日) 00:40:25
>>193
氏ねや
208デフォルトの名無しさん:2006/03/12(日) 00:53:22
やる気なしにも程がある
209デフォルトの名無しさん:2006/03/12(日) 01:10:17
>>202
名前に番号を書かないでくれ
210192:2006/03/12(日) 01:15:38
>>195
ということは、ReadFile関数はchPixelBitがchar型であることを頼りにファイルポインタを
進めるということでよろしいでしょうか?
この場合、ビットマップファイルのピクセルビット部はchar型で認識されることが前提ですが。
211デフォルトの名無しさん:2006/03/12(日) 01:21:11
chPixelBitが何型だろうと、
bmpFileHeader.bfSize - bmpFileHeader.bfOffBitsバイト進めるだけだろ…
212192:2006/03/12(日) 01:24:53
>>211
ピクセルビットの位置に進めるならば、
bmpFileHeader.bfSize - bmpFileHeader.bfOffBits
ではなくて
bmpFileHeader.bfOffBits
ではないのでしょうか?
前者はピクセルビット部のバイトサイズですよね?
213デフォルトの名無しさん:2006/03/12(日) 01:27:03
>>210
型情報なんぞは渡してない。
単純にその次の引数で読み込みBYTE数を渡してるだけ。
そしてそのBYTE数分を読みこみ、渡されたアドレスへセットしつつファイルポインタも進める。
ReadFile() ≒ fread()
214デフォルトの名無しさん:2006/03/12(日) 01:30:57
>>203->>208
こんばんわ。気になったので覗いてみました^^;

コールバック関数のWM_PAINTメッセージからの処理がおかしいです。

Drawcurveは
座標を4つ指定してA(sx,sy) B(x1,x2) C(x2,y2) D(ex,ey)で
A→B→C→Dの経路で通っていきます。

曲線になるように、それぞれの中間地点を決めてそちらをなぞる曲線に変わります。

そこから、、、
215デフォルトの名無しさん:2006/03/12(日) 01:38:03
>>214
で、俺らに何をして欲しいんだ?
216192:2006/03/12(日) 01:39:53
>>213
>そしてそのBYTE数分を読みこみ
これは、どこからスタートするのでしょうか?
ファイルの先頭から読んでしまうと、ファイルヘッダ、情報ヘッダが含まれてしまい、
しかも、ピクセルビット分しか容量を指定していないので、肝心のピクセルビットが
すべて格納できなくなってしまうことになると思うのですが。
そんなことはなく、ちゃんとピクセルビット部の先頭から読み込んでいるようですが、
どの情報をもとにピクセルビット部の先頭を得ているのか分かりません。
217デフォルトの名無しさん:2006/03/12(日) 01:42:47
>>216
>>192の行より前にあるReadFileでヘッダー分だけ読み込んであるから。
218デフォルトの名無しさん:2006/03/12(日) 01:42:50
デバッグをステップ実行していくと、途中まで線が描かれてゆくと思います。
動作がおかしいのはWM_PAITメッセージ内のみです。

難しいので一筋縄でいきません。なので助けてちょ^^ノ
219デフォルトの名無しさん:2006/03/12(日) 01:43:06
>>216

>ReadFile(hFile , &bmpFileHeader , sizeof (BITMAPFILEHEADER) , &dwBytes , NULL);
ここでファイルの先頭からへっだを読み、

>ReadFile(hFile , &bmpCoreHeader , sizeof (BITMAPCOREHEADER) , &dwBytes , NULL);
ここでその続きからピクセルビットを読んでる
220192:2006/03/12(日) 01:45:36
>>217
>>219
ああー!!分かりましたー!!
感動です!!
ありがとうございましたぁ!!
221デフォルトの名無しさん:2006/03/12(日) 01:49:51
222デフォルトの名無しさん:2006/03/12(日) 01:53:39
明日写真撮るから、熊を取っておきたいからもう寝なきゃいけない。。
223デフォルトの名無しさん:2006/03/12(日) 01:55:45
>>222

>p5x = (p2x+p3y)/2; p5y = (p2y+p3y)/2;

→p5x = (p2x+p3x)/2; p5y = (p2y+p3y)/2;
224デフォルトの名無しさん:2006/03/12(日) 02:00:12
アクティブなウインドウが自分以外のアプリの場合、
フォーカスのあるコントロールのウインドウハンドルを取得したいのですが、
どうしたらいいのでしょうか。
具体的には、ホットキーが入力されたときに、
例えばメモ帳などで反転表示された文字列を拾いたいのです。
その場合、メモ帳のエディットコントロールのウインドウハンドルが
分かれば、SendMessageで選択文字列の場所を知ることができる
と思うのですが、ウインドウハンドルの取得方法が分かりません。

GetForegroundWindow()で、親ウインドウのハンドルを取得した後、
フォーカスのある子ウインドウを知るにはどうしたらいいのでしょうか。
225デフォルトの名無しさん:2006/03/12(日) 02:02:49
>>223
Good job ^^b
226デフォルトの名無しさん:2006/03/12(日) 02:35:07
>>224
GetGUIThreadInfo
227デフォルトの名無しさん:2006/03/12(日) 02:49:49
VisualStudioで、ソリューションエクスプローラなどをウインドウに結合
したり、取り外したりできますよね。
あれはどうやってるんですか?
228デフォルトの名無しさん:2006/03/12(日) 06:00:00
普通にくっつけたり剥がしたりしてるんジャマイカ?
229デフォルトの名無しさん:2006/03/12(日) 07:40:48
>>227
ドッキングウィンドウで検索すればサンプルコードがでてくるかも。
ttp://techtips.belution.com/ja/vc/0004/
230デフォルトの名無しさん:2006/03/12(日) 10:46:23
>>227
思いつく方法の中で最も面倒な方法を使っている。
ドッキング、位置の判定、移動など、全て逐次実装する気の長いコードを書かなければならない。
231デフォルトの名無しさん:2006/03/12(日) 11:53:13
いっぱいいっぱいです。教えてください。
お題は「プログラムからIPアドレス変更、DHCP有効/無効など制御」
で、PlatformSDKをインストールしてAddIPAdress()とか試しました。
確かにIPアドレス追加とかできます。
でも手動でTCP/IPのプロパティに設定した内容と置き換えるにはどうすればいいんでしょうか?
232デフォルトの名無しさん:2006/03/12(日) 12:14:03
削除して追加?
233デフォルトの名無しさん:2006/03/12(日) 12:43:10
>>231
RegOpenKeyEx
RegQueryValueEx
RegSetValueEx
とかで設定。
234231:2006/03/12(日) 13:11:30
>>232
追加したものしか削除できない罠が・・・
>>233
調べてみます。

レスありがとうございます。
235224:2006/03/12(日) 13:12:10
あーりがとぉーーーーぉぅぉぅぉぅ!(堀内孝雄ふうに)。
236デフォルトの名無しさん:2006/03/12(日) 13:28:59
>>235
その歌手の歌が終わった後の挨拶とか歌詞とか喋りが大嫌いな漏れからすれば、なんて嫌がらせ? と思う。
#普通に感謝しろよ、普通に。
237デフォルトの名無しさん:2006/03/12(日) 15:37:18
CreateWindow(
TEXT("EDIT") , NULL ,
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL |
ES_LEFT | ES_MULTILINE ,
0 , 350 , 620 , 100 , hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
このウィンドウに枠つけたいのですがどうすればいいのだーー!
238デフォルトの名無しさん:2006/03/12(日) 15:59:46
>>237
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win7.html
ウィンドウスタイルに「WS_BORDER」追加すれば枠ができそうな予感。
239デフォルトの名無しさん:2006/03/12(日) 16:14:06
thx
240デフォルトの名無しさん:2006/03/12(日) 19:01:23
"\n"をEDITで表示すると"↑"みたいに文字化けする
241デフォルトの名無しさん:2006/03/12(日) 19:23:35
当たり前だ
242デフォルトの名無しさん:2006/03/12(日) 20:45:11
のクラッカー?
243デフォルトの名無しさん:2006/03/12(日) 20:46:03
\r\nだっけ?
メモ帳とワードパッドでは違うんだよね
244デフォルトの名無しさん:2006/03/12(日) 20:51:54
タイプライターから出直せ
245デフォルトの名無しさん:2006/03/12(日) 21:24:35
画面のプロパティ→デザイン→詳細設定→アイコン→サイズ(フォントの隣)
から設定できるアイコン用のフォントサイズを得たいんですが、
どなたか方法がわかる方、教えていただけませんか?

GetSystemMetricsあたりで得られるのかと思ったんですが、
どうやら違うらしいです。
246デフォルトの名無しさん:2006/03/12(日) 21:49:27
> アイコン用のフォントサイズ
SystemParametersInfo(SPI_GETICONMETRICS) かな?
247245:2006/03/12(日) 21:56:09
>>246
ありがとうございます、できました!

ICONMETRICS im;
ZeroMemory(&im, sizeof(ICONMETRICS));
im.cbSize = sizeof(ICONMETRICS);
SystemParametersInfo(SPI_GETICONMETRICS, im.cbSize, &im, 0);
int nSize = abs(im.lfFont.lfHeight);
248デフォルトの名無しさん:2006/03/12(日) 22:03:09
CreateWindow(
TEXT("EDIT") , NULL ,
WS_CHILD | WS_VISIBLE |WS_BORDER |
ES_LEFT | ES_MULTILINE ,
10 , 400 , 610 , 40 , hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
で作ったエディタウィンドウを一番下までスクロール死体のジャー
どうすればいいんでしょーあか?
249デフォルトの名無しさん:2006/03/12(日) 22:08:34
SendMessage(messbox,WM_VSCROLL,SB_LINEDOWN,0);


事故解決

おれって天才!!!

うぉぉぉぉぉぉぉぉ
250デフォルトの名無しさん:2006/03/12(日) 22:12:25
CreateProcess()で echo を起動しようすると、出来るPCと出来ないPCが
ある、何の環境に依存しているのだろうか。知っている人いますか?
OSはWinXPです。

#include <windows.h>
#include <stdio.h>

int main(void)
{
// プロセス起動
PROCESS_INFORMATION ProcInfo;
STARTUPINFO StartupInfo;
memset(&StartupInfo, 0x00, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);

BOOL ret;
ret = ::CreateProcess(NULL,"echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo);
if( ret != TRUE ){
printf("起動失敗");
return 0;
}
CloseHandle(ProcInfo.hProcess);

return 0;
}
251デフォルトの名無しさん:2006/03/12(日) 22:18:09
>>250
echo は内部コマンド
252デフォルトの名無しさん:2006/03/12(日) 22:29:10
出来るPCがあるほうが不思議なんだが
Cygwinのechoでも入ってるのか?
253デフォルトの名無しさん:2006/03/12(日) 22:53:58
プライマリスレッドのハンドルが
254デフォルトの名無しさん:2006/03/12(日) 23:11:04
飛んでいった。
255デフォルトの名無しさん:2006/03/13(月) 01:45:03
ぼくは小さく
256デフォルトの名無しさん:2006/03/13(月) 06:47:54
ダイアログのスタティック・テキスト欄にフォルダ名を表示しているんですが、
パスが長くなると見えなくなります。頭と尻を残して途中を省略するのって
自分で編集しないとだめですか。API 一発ってのはないのでしょうか。
257デフォルトの名無しさん:2006/03/13(月) 07:03:45
DT_MODIFYSTRINGとDT_PATH_ELLIPSISつけてDrawText()

…冗談だ。
258デフォルトの名無しさん:2006/03/13(月) 07:05:30
この辺かな?
GetShortPathName
PathSetDlgItemPath
PathCompactPath
PathCompactPathEx
259250:2006/03/13(月) 13:20:31
>>251
内部コマンドはCreateProcess出来ないって事?
Cygwinとかないのに、なぜ出来るPCがあるのかな。
260デフォルトの名無しさん:2006/03/13(月) 13:25:58
「何の」内部コマンドかに思い当たれば解決できるぞ。
261256:2006/03/13(月) 13:37:03
>>258
有難うございます。説明を読んで見ます。
聞いてみるものですね。縮めては入るか縮めては入るかってのを繰り返すのかと
数日コードを考えて滅入っていましたです。
262デフォルトの名無しさん:2006/03/13(月) 14:57:17
まぁ、パス名短縮くらい自前でも楽にできるがな
263デフォルトの名無しさん:2006/03/13(月) 18:31:24
Shell Lightweight Utility APIsのPath Functionsは、
MAX_PATHに制限されているのだけど、
似たようなことをする長さ制限のないもので、
Windows2000以降で追加DLL無しで使えるものは、
ありますか?
264デフォルトの名無しさん:2006/03/13(月) 18:42:57
>>260
答え書いちゃえよ

>>250
×ret = ::CreateProcess(NULL,"echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo);
○×ret = ::CreateProcess(NULL,"CMD /C echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo);
265デフォルトの名無しさん:2006/03/13(月) 18:43:59
マルなのかバツなのかハッキリしろ!
266デフォルトの名無しさん:2006/03/13(月) 19:43:26
コピペして消し忘れた。

○です。
267デフォルトの名無しさん:2006/03/13(月) 21:26:27
>>265-266
むしろ、○×で正しいと思われ。

# Me辺りだと、command.exeだったはず
268デフォルトの名無しさん:2006/03/13(月) 21:31:34
>>267
command.com
269デフォルトの名無しさん:2006/03/13(月) 21:45:18
よそのアプリ(他プロセス)のリストビューをダブルクリックするメッセージを送りたいんですが、
VirtualAllocEx()で確保したメモリにNMLISTVIEW構造体をセットして
WM_NOTIFYメッセージでNM_DBLCLKを送ってもアプリが反応してくれません。

同じ方法でリストビューの文字列は取ってこれてるので
メモリの確保には問題ないはずなのですが・・・

リストビューにNM_DBLCLKを使うには他に何か手続きがいるのでしょうか?
ちなみにメッセージ送信はPostMessageを使っています。
(SendMessageだとSpy++で見てるとメッセージがとんでこないようなので。)
270デフォルトの名無しさん:2006/03/13(月) 22:13:54
>>269
左ボタンのダウンとアップを交互に送ればいいんでない?
271デフォルトの名無しさん:2006/03/13(月) 22:44:16
>>269
回答ではなく、自分だったらこうやって調べるという話だけど・・・。

簡単なものでいいから、「よそのアプリ」を試しに自分でつくってみて、
メッセージを送っているほうのアプリから
どういうパラメータでNM_DBLCLKがやってくるかを調べる。
きっとパラメータに何か問題があるのが分かる。・・・と思う。
272デフォルトの名無しさん:2006/03/13(月) 23:17:52
>>270, 271
回答ありがとうございます。

>「よそのアプリ」を試しに自分でつくって
その方法を試していなかったのでやってみたところ
問題なくダブルクリックのメッセージが送れていました。

この結果から、最初に扱おうとしていた「よそのアプリ」は
ダブルクリックのメッセージで動作しているわけではない、という結論になってしまいました。

そのアプリはDelphi製らしいのでダブルクリックメッセージ以外の方法があるのかもしれません。

どうもお騒がせして申し訳ありませんでした。
273デフォルトの名無しさん:2006/03/13(月) 23:19:44
WM_LBUTTONDBLCLK?
274デフォルトの名無しさん:2006/03/14(火) 00:44:20
>>273
>>WM_LBUTTONDBLCLK?
まさにそれでした・・・

リストビューなんだからリストビューのメッセージで処理してるんだろうという
考え方にはまってしまっていました・・・orz
275デフォルトの名無しさん:2006/03/14(火) 07:32:13
リストビューをダブルクリック

  ↓

リストビューのプロシージャでWM_LBUTTONDBLCLK発生

  ↓

リストビューが親にWM_NOTIFY(NM_DBLCLK)送信


コントロールのイベントを発生させるのまで親が面倒見てるわけではないぞ
276デフォルトの名無しさん:2006/03/14(火) 09:05:10
>>275
> リストビューのプロシージャでWM_LBUTTONDBLCLK発生

この表現に違和感があるのは、漏れだけだろうか?
277デフォルトの名無しさん:2006/03/14(火) 10:28:21
ああ…もしかして>>269は親ではなくリストビュー本体の方にNM_DBLCKLを送っていたということなのか。
278デフォルトの名無しさん:2006/03/14(火) 12:06:35
リストビューの編集って一番左の列しかできないのですか?
他の列のアイテムを編集したかったら自前で書かなきゃだめですか?
279デフォルトの名無しさん:2006/03/14(火) 12:33:23
自分で書くとかocx使うとか。
280278:2006/03/14(火) 13:55:01
>>279
分かりました。
ありがとうございます。
281デフォルトの名無しさん:2006/03/14(火) 17:21:02
COMポートに何が刺さってるか
調べるAPIありますか?
282デフォルトの名無しさん:2006/03/14(火) 17:25:32
>>281
ない
283デフォルトの名無しさん:2006/03/14(火) 17:35:10
>>282
じゃあ
デバイスマネージャで
列挙されるデバイス名を列挙するようなAPIありませんか
284デフォルトの名無しさん:2006/03/14(火) 17:39:22
WMIを使うと落
285デフォルトの名無しさん:2006/03/14(火) 18:16:38
286デフォルトの名無しさん:2006/03/14(火) 19:33:33
IEに表示されているエディットボックスに文字列を入れる方法ってありますか?
普通のアプリケーション中のエディットボックスならFindWindowで
ウィンドウハンドルを取得してWM_SETTEXTを送れば出来るのですが・・・
287デフォルトの名無しさん:2006/03/14(火) 19:53:06
>>286

WM_KEYUP/KEYDOWN/CHAR を送ってみ?
288デフォルトの名無しさん:2006/03/14(火) 22:03:00
ウィンドウハンドルがとれないんではあるまいか
289デフォルトの名無しさん:2006/03/14(火) 23:33:20
IEのバージョンによっては取れる場合があるはずだけど。

そういう場合は、Windows Scriptのキー入力でやっつちゃうから API 使わんわ、俺。
290デフォルトの名無しさん:2006/03/15(水) 01:13:44
現在トラックバーのカスタムドローをしているのですが、
アクティブになった際に表示される「枠」を消す方法は無いでしょうか?
ボタンのようにTABSTOPでは変化しませんし、SPYで見てみたところ
WM_PAINTやWM_NCPAINTも関係なさそうです。
どこでどのような処理を行えば良いのでしょうか?
291デフォルトの名無しさん:2006/03/15(水) 01:29:35
>>281
そもそもcomポートにはUSBのように「何かが繋がっている」かどうか調べる機能さえないのだが。
292デフォルトの名無しさん:2006/03/15(水) 02:55:06
親のプロセスID得る方法って
tlhelp32.h しかなさげです?

なんかやりすぎな感じになるけどいいのかな?
293デフォルトの名無しさん:2006/03/15(水) 03:30:54
SAISONPASSとかはIEに入力できてるよね
どうしてるんだろ
294デフォルトの名無しさん:2006/03/15(水) 06:39:45
Add-inならCOM経由でいくらでも方法はある
295デフォルトの名無しさん:2006/03/15(水) 09:10:17
>>291
一応、つっこんどくと・・・・・

COMポート自身の仕様・機能ではないが、Windowsの実装として、シリアルマウス他いくつかの
デバイスはPlag&Playで自動認識する。
http://www.microsoft.com/whdc/system/cec/serddvr.mspx
296デフォルトの名無しさん:2006/03/15(水) 09:19:28
Plag&Play → Plug&Play
297デフォルトの名無しさん:2006/03/15(水) 12:45:02
>>290
トラックバーじゃなくてフレームウィンドウの見かけを変えるときの経験ですが、
アクティブになったとき、アクティブじゃなくなったときの再描画(の一部?)は
WM_NCACTIVATE とかのハンドラ内で行われてる模様です(行儀悪い・・・)。

そのときには
デフォルトのハンドラを実行した後に自前の描画で上書きしてごまかしました。
298デフォルトの名無しさん:2006/03/15(水) 15:10:40
Plug&Prayって言葉もあったな(´ω`)
299デフォルトの名無しさん:2006/03/16(木) 00:47:54
IEでウインドウのサイズを変更したときに、メニューバーがちらつかないのは
どういう処理をしてるんでしょうか?
300デフォルトの名無しさん:2006/03/16(木) 00:49:10
気合
301デフォルトの名無しさん:2006/03/16(木) 00:49:26
逆にちらつく方法を知りたいわ
302デフォルトの名無しさん:2006/03/16(木) 00:52:42
つダブルバッファリング
303デフォルトの名無しさん:2006/03/16(木) 01:07:52
IEのはメニューバーではなくてツールバー。
304デフォルトの名無しさん:2006/03/16(木) 01:59:08
>>297
ありがとうございます。
今日はもう時間がないので無理ですが、明日試してみます。
305デフォルトの名無しさん:2006/03/16(木) 02:01:12
エクスプローラのファイルの並び順を操作したいんですが
どうすればできますか?デスクトップとかQuickLaunchのアイコンの配置とかです
306デフォルトの名無しさん:2006/03/16(木) 10:08:00
サービスを開始したり停止したりするプログラムを作ってます
で、サービスの依存関係を取得する部分でつまずいています
EnumDependentServices()がGetLastError()で997(重複したI/O処理を実行しています)
を返して失敗(でもEnumDependentServices()はTRUEを返す)します
そのものズバリのサンプルがMSにあるのですが、
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B245230
まるまるコピーして実行しても同じエラーが出ます
アカウントはAdmin権限を持っているので、権限不足とかではないと思うのですが、
何が悪いんでしょうか・・・


#もしかして、WMIを使った方が早い?
307デフォルトの名無しさん:2006/03/16(木) 10:25:47
>>306
>EnumDependentServices()がGetLastError()で997
>を返して失敗(でもEnumDependentServices()はTRUEを返す)します
意味が分からん。TRUE返してるなら成功してるんじゃん?
308306:2006/03/16(木) 10:38:58
>>307
関数の戻り値はTRUEを返して、成功しているように見えるけど、
結果を返す引数のポインタには0しか入っていない。
おかしいと思ってGetLastError()を見たらこんなエラーが入ってた。

ってことなんだけど・・・。
309デフォルトの名無しさん:2006/03/16(木) 10:42:25
>>308
その関数呼ぶ前に、SetLastError(0)とかしてみ?
310306:2006/03/16(木) 11:00:47
>>309
結果は変わりませんでした。。
311デフォルトの名無しさん:2006/03/16(木) 11:24:14
>>308
結果を返す引数のポインタってどれだ?
312306:2006/03/16(木) 11:49:09
解決しました。っていうか、勘違いしてましたorz
EnumDependentServices()での依存関係の列挙って
サービスのプロパティの「依存関係」タブで言うところの、
「このサービスに依存しているシステムコンポーネント」を列挙するところで、
自分は「このサービスが依存するシステムコンポーネント」を取ろうとしていた
ことが分かりました・・・。

試しに"Remote Procedure Call (RPC)"を指定して動かしたら問題なく動きました。
問題なく列挙できてもGetLastError()はやっぱり997を返すんだけど、おかしいよM$

ともあれ、回答していただいた方、ありがとうございました。

>>311
LPDWORD pcbBytesNeeded, // 必要なバッファサイズ
LPDWORD lpServicesReturned // 返されたエントリの数
5番目と6番目の引数です
313デフォルトの名無しさん:2006/03/16(木) 11:58:58
>>312
おかしいのはオマエだ
314306:2006/03/16(木) 12:02:10
>>313
そりゃ勘違いしてた俺の頭は間違いなくおかしいが、
トンチンカンなエラーな値を返してくる関数もおかしくない?
関数は悪くないって言うなら説明プリーズ
315デフォルトの名無しさん:2006/03/16(木) 12:19:17
>>314
GetLastError は「API がエラーで終了したときに」エラーコードを取得するために使います。
詳細は Platform SDK の GetLastError の "Remarks" の項の第2、第3段落を参照。
316306:2006/03/16(木) 12:21:44
>>315
んじゃなんでERROR_SUCCESSってのが定義されてんの?
317デフォルトの名無しさん:2006/03/16(木) 12:23:18
>>316
MSを信用するな。
318デフォルトの名無しさん:2006/03/16(木) 12:25:12
>>314
MSDNで、その関数の説明読めば分かるが、
GetLastErrorは関数が失敗した(0が返った)ときに呼ぶよう指示されてる

EnumDependentServices関数が成功しているわけだから、
GetLastErrorを呼んで、その戻り値を参考にすることが間違ってる

>>316
関数が成功したときに、呼ぶように指示されている関数もある
そのときに問題がなければ、ERROR_SUCCESSが返る
319デフォルトの名無しさん:2006/03/16(木) 12:31:09
>>316
ERROR_SUCCESS はレジストリ操作API やWinINet API で、
呼び出しが成功したことを表すための API の戻り値として用いられています。

逆に「API呼び出しが成功した場合に、GetLastError は ERROR_SUCCESS を返す」
なんて一体ドコで覚えたんですか?そんなこと書かれているドキュメントはないし、
実際の動作とも違うし。
320デフォルトの名無しさん:2006/03/16(木) 12:48:12
>>316
PC起動後 or ERROR_SUCCESSが設定されてから、
「一度もエラーが発生していない事」が判る様にだろ。
321306:2006/03/16(木) 13:30:03
>>315-320
だいたい分かった。dクス。
322デフォルトの名無しさん:2006/03/16(木) 14:04:37
「ドコで覚えたんですか?」は言いすぎだった。今では反省しています。
>>321の大人の対応を見て恥ずかしくなったので謝罪する。
323デフォルトの名無しさん:2006/03/16(木) 14:31:46
>>312
> 問題なく列挙できてもGetLastError()はやっぱり997を返すんだけど、おかしいよM$
EnumDependentServicesの中で使われているAPIがエラーになってるんじゃない?
でもEnumDependentServicesとしては成功してると。


全然関係ないけど↓の機械翻訳、意味分かんね('A`)
ttp://support.microsoft.com/default.aspx?scid=kb%3Bja%3B231844
324デフォルトの名無しさん:2006/03/16(木) 15:58:01
>>305
エクスプローラはリストビュー
デスクトップはエクスプローラじゃない
325デフォルトの名無しさん:2006/03/16(木) 16:28:22
326デフォルトの名無しさん:2006/03/16(木) 19:29:55
GDI関数って例えばなにに使うのさ。
327デフォルトの名無しさん:2006/03/16(木) 19:35:25
君には必要無い物のようだから、気にせんでいいよ。
328デフォルトの名無しさん:2006/03/16(木) 19:52:22
わっかりやした、親方。
329デフォルトの名無しさん:2006/03/16(木) 22:41:41
win32本当に使えねーな。
DirectXのほうが全然いいや
330デフォルトの名無しさん:2006/03/16(木) 22:47:24
>>329
使えない≠使わない
331デフォルトの名無しさん:2006/03/16(木) 23:10:57
使えない=使う能力が無い。
332デフォルトの名無しさん:2006/03/16(木) 23:16:57
エラー:代入式の左側には左辺値を指定しなければなりません。
333デフォルトの名無しさん:2006/03/16(木) 23:30:14
>>331
一生使ってろ屑wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
334API3日目:2006/03/17(金) 01:01:52
お取り込み中失礼します。質問です。

(1)CreateWindowで作った子ウインドウの間で、
Tabキーによるフォーカス移動をさせたいのですが、
WS_TABSTOPを指定する以外に何が必要なんでしょうか?
(2)ファイルをごみ箱へ移動(?)させるAPIってありますか?

BCCを使っています。よろしくお願いします。
335デフォルトの名無しさん:2006/03/17(金) 01:32:01
>>334
(1)IsDialogMessage呼ぶとか?
(2)SHFileOperation
336デフォルトの名無しさん:2006/03/17(金) 05:37:30
>>334

えーとね、TABが有効かどうか Queryの役目をするメッセージがある。
それに対応させればよい。

対応の仕方はメッセージの復帰値で自動化するか、復帰値でシステム側の挙動をキャンセルして自分で TAB 移動させるか…だったはず。
メッセージは自分で調べて。
337デフォルトの名無しさん:2006/03/17(金) 06:56:46
まぁ待てよ
CreateWindowで作った子ウィンドウといっても色々あるだろう
338デフォルトの名無しさん:2006/03/17(金) 13:20:37
>>334
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnaskdr/htm/gui46.asp
> コントロールがフォーカスを取得できない別の理由として
> 考えられるのは、動的に作成されたコントロールが、
> WS_EX_CONTROLPARENT スタイルが設定されていない
> ダイアログ ボックス内の親ウィンドウにある場合です。
339ガウショ:2006/03/17(金) 17:46:27
VC6ですが、WIN32APIでプロパティシートを使う事は出来ますでしょうか?
「プロジェクト」→「プロジェクトへ追加」→「コンポーネントおよびコントロール」で「プロパティシート」を選択すると、CCmdTagetクラスがないから無理だと言われます。
MFCじゃないと無理なのでしょうか…
340デフォルトの名無しさん:2006/03/17(金) 17:55:06
>>339
PropertySheet っていうそのものズバリの名前のAPIがあるよ。
341デフォルトの名無しさん:2006/03/17(金) 18:44:18
「URLDownloadToFile」でエラーを返さない時があるんですが、現象としては一度ファイルのダウンロードに成功すると、
その後実際にはサーバ上にファイルをが無くなっているにもかかわらず、成功しファイルが書き込まれてしまいます。
キャッシュと絡んでいるようなんですが、何方か情報ありませんでしょうか。
342デフォルトの名無しさん:2006/03/17(金) 18:52:08
キャッシュしてるんだろ。
検索すればすぐ出てくる。
343デフォルトの名無しさん:2006/03/17(金) 19:50:58
ttp://support.microsoft.com/kb/555563/ja

ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/disablethreadlibrarycalls.asp
> Do not call this function from a DLL that is linked to the static C run-time library (CRT). The static CRT requires DLL_THREAD_ATTACH and DLL_THREAD_DETATCH notifications to function properly.

何故重要なところを訳さないのだ…('A`)
344デフォルトの名無しさん:2006/03/17(金) 19:54:40
そりゃーおまいらが苦しむところをみたいからさ
345ガウショ:2006/03/17(金) 20:04:05
>>340
ありがとうございます。
PropertySheetがあることは知っていました。
が、サンプル(猫でも分かるプログラミング等にあるもの)どおり打ち込んでも表示されません。

と、思ったら表示されましたw
ご迷惑をおかけしました。
346デフォルトの名無しさん:2006/03/17(金) 20:28:20
>>343
ヒント: 日本語のドキュメントは古い
347デフォルトの名無しさん:2006/03/17(金) 20:50:08
ヒント: 日本語ドキュメントしか読まないやつはバカ
348デフォルトの名無しさん:2006/03/17(金) 22:29:13
普通は英語のドキュメント読むよな
349デフォルトの名無しさん:2006/03/17(金) 22:30:03
そもそも>>1のテンプレに書いてあるし
350デフォルトの名無しさん:2006/03/17(金) 23:11:04
質問です。

アクティブでないあるプロセスに対し、"A"というキーを押してから離した、というメッセージを送りたいのですが、
どうすれば良いのか分かりません。
具体的で簡潔なサンプルプログラムを交えながら教えて頂けないでしょうか?
351デフォルトの名無しさん:2006/03/17(金) 23:16:19
>>350
WM_CHAR じゃだめか?
352API4日目:2006/03/17(金) 23:21:16
334です。

フォーカス移動の件。
今のところIsDialogMessageを呼べば足りているようです。
Queryその他については、これから勉強します。

ごみ箱へ移動の件。
SHFileOperationでググっていろいろ分かりました。

ありがとうございました!
353デフォルトの名無しさん:2006/03/18(土) 00:22:58
>>343
マイクロソフトに不利なことは訳さない。これ、常識。

354デフォルトの名無しさん:2006/03/18(土) 03:24:17
Shell_NotifyIconでタスクバーに登録したアイコンが右クリック
されたとき、タスクバーのメニューも一緒に表示されてしまうのですが、
これを阻止する方法ってありますか?
355デフォルトの名無しさん:2006/03/18(土) 09:41:55
どうやったらそうなるのか知りたい。
356デフォルトの名無しさん:2006/03/18(土) 12:11:05
Shell_NotifyIconでタスクトレイ常駐のソフトを作っているのですが、
タスクトレイアイコンをクリックした時の処理が非常に遅い時があります。
恐らく、他のタスクトレイに入っているソフトウェアの処理が終わるまで
クリックが反映されないからだと思うのですが、解消方法はないでしょうか?
どうぞよろしくお願いします。
357デフォルトの名無しさん:2006/03/18(土) 12:12:33
>>354
ShowWindow(hWnd, SW_HIDE);
にするとかは?メインウィンドウも消えちゃうけど。
358デフォルトの名無しさん:2006/03/18(土) 17:20:51
>>354のような内容の質問を最近どこかのスレで見た気がする
359デフォルトの名無しさん:2006/03/18(土) 17:50:43
360デフォルトの名無しさん:2006/03/18(土) 18:48:16
Win32APIと関係ないかもしれませんが質問。

ウインドウを前回と同じの位置やサイズで表示するのは、
各アプリケーションごとに保存して実現しているのでしょうか?
なにか自動でそうするAPIがあるのでしょうか?
361デフォルトの名無しさん:2006/03/18(土) 18:49:15
>>360
そんなAPIはない。
362デフォルトの名無しさん:2006/03/18(土) 18:50:09
>>360
自力でがんがってくださいね。
363デフォルトの名無しさん:2006/03/18(土) 18:51:52
.ini ファイルかレジストリに保存しておいて
自力でMoveWindow
364http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 19:02:47
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
365デフォルトの名無しさん:2006/03/18(土) 19:03:51
アプリケーション(自分自身)を再起動する場合どうすればいいでしょうか?
多重起動を許している場合先に新たに起動して自分を終了させればいいと思うのだけれど、
多重起動が許されてない場合まず自分を終了してからじゃないと再起動出来ない・・・
366デフォルトの名無しさん:2006/03/18(土) 19:08:21
多重起動を一旦許可してやれば良いじゃん
367デフォルトの名無しさん:2006/03/18(土) 19:09:13
>>365
- スケジュールタスクに登録
- 自分自身でなく起動係を起動してから自殺する
368デフォルトの名無しさん:2006/03/18(土) 19:18:06
>>360
GetWindowPlacement&SetWindowPlacement

バグってるつーか、ややこしい仕様のAPIだが。
369デフォルトの名無しさん:2006/03/18(土) 19:27:08
>>366

そうすると、一部のコードセグメントは変わらないから、完全な再起動にならないぞ。
再起動の別プロセスつくって、それに任せるのがいいんじゃないかな。
370デフォルトの名無しさん:2006/03/18(土) 19:27:53
そんなもん使わんでもGetWindowRectでおk
作る時はCreateWindowで指定すればいいし、
作ってから整理するならMoveWindowで充分
371デフォルトの名無しさん:2006/03/18(土) 19:36:47
メモ帳のエディットコントロールは親ウィンドウのサイズ変更に同期してサイズが変更されると思うのですが、これはどうやって実現しているのでしょうか?
372デフォルトの名無しさん:2006/03/18(土) 19:48:29
>>370
最小化・最大化してるときには注意がいるよな。
373デフォルトの名無しさん:2006/03/18(土) 19:49:02
>>371
サイズが変更されるたびに親ウィンドウが全ての子ウィンドウの位置とサイズを調整してる。
374デフォルトの名無しさん:2006/03/18(土) 19:55:42
休止状態から復帰したときにある処理を行いたいのですが、
いつがその時なのか判定できないので困ってます。
復帰したときにメッセージかなにか飛んでくるのでしょうか?
375デフォルトの名無しさん:2006/03/18(土) 19:57:33
WM_POWERBROADCAST
376デフォルトの名無しさん:2006/03/18(土) 22:24:31
Windowsをアンインストールして代わりにLinuxをインストールしたいのですが、
どのAPIでできますか?
377デフォルトの名無しさん:2006/03/18(土) 22:40:06
クマー
378デフォルトの名無しさん:2006/03/18(土) 23:00:09
379デフォルトの名無しさん:2006/03/18(土) 23:01:17
>>370
そこまで手抜きすると最小化したり最大化したりしてるときに終了すると
次回メタメタじゃん。
380デフォルトの名無しさん:2006/03/18(土) 23:02:31
>>376
SHFormatDrive
381デフォルトの名無しさん:2006/03/18(土) 23:12:03
>>376

起動可能なCD-ROMドライブにLinuxインストールCDを入れろという、メッセージボックスをだすAPI。
WindowsをリスタートするAPI。

詳しくは自分で調べて。
382デフォルトの名無しさん:2006/03/19(日) 07:19:57
>>379
実際そういうメタメタなアプリあるよな。結構有名なものでも
383デフォルトの名無しさん:2006/03/19(日) 08:06:32
ウィンドウ位置を記憶する場合は、マルチモニタも考慮しないといかんね。
以前、復元するときに画面内かチェックを入れていたがマルチモニタを
考慮していなかったので、セカンダリモニタだと位置が記憶されないって
苦情が来た。
384デフォルトの名無しさん:2006/03/19(日) 11:11:40
>>383
MonitorFromRect, MonitorFromWindow, GetMonitorInfo辺りを使うことになるんかな。
385デフォルトの名無しさん:2006/03/19(日) 12:08:39
POP before SMTPでメール送信するAPIはどれですか?
386デフォルトの名無しさん:2006/03/19(日) 12:50:22
winsock
387デフォルトの名無しさん:2006/03/19(日) 13:37:56
>>385
どうもです、winsockってAPIではないですよね
winsockを実装しないと駄目って事デツカ
それと、Outlook Expressとかも、winsockを使って通信を送受信を
しているということでいいのでしょうか?
388デフォルトの名無しさん:2006/03/19(日) 14:12:12
  _、 _ ∩
 ( ∀`) 彡 確変だ!確変だ!確変の嵐だ!
((≡O  ⊃
  |   |   おまいら!左腕を上下 右腕を前後
  し⌒J   同時にやってみろ!話はそれからだ!
389デフォルトの名無しさん:2006/03/19(日) 14:18:04
>>387
CDO使えば?
pop before smtpがどうかは知らん。
390デフォルトの名無しさん:2006/03/19(日) 16:25:50
>>387
APIだよ。
391デフォルトの名無しさん:2006/03/19(日) 18:53:25
>>387
WinSockはWindowsで通信を行う上では基本じゃないかな
簡単なのならWinInetとかでもできるのかもしれないけど、いつもSockでやっちゃってるからよく知らない
っていうかそれくらいググればすぐ出ないか?
392デフォルトの名無しさん:2006/03/19(日) 21:35:29
>>387
WinAPIは様々な分野のAPIの集合体。
そして、その中でソケット関連の部分を担うのがWinSook。
393デフォルトの名無しさん:2006/03/19(日) 22:03:45
まあ、なんでWinSockとか呼ばれてるというと、当初のWin16APIには socketが無かったんだな。
で、後からWinSockってのをつけたわけだ。

そういうことだから、あまり気にするな。

394356:2006/03/19(日) 22:48:19
どなたかいい方法知りませんか?
どうぞよろしくお願いします。
395デフォルトの名無しさん:2006/03/19(日) 23:47:10
さっぱりわかりません。
お手上げです。
396デフォルトの名無しさん:2006/03/20(月) 00:24:01
>>394
タスクトレイのアイコンがクリックされたときに、クリックされたアイコン以外は無関係。処理するものは何も無い。
また、メッセージはPOSTされるので他のソフトの処理を待つ事も無い。
よってその仮定は間違っている。
ソースも詳細も無いので良く判らんが、単にクリックされたときの処理がおかしいか、スワップされてるだけじゃね?
397デフォルトの名無しさん:2006/03/20(月) 01:12:07
VC++2005でWINAPIを使うには
何をインクルードすればいいですか?
398デフォルトの名無しさん:2006/03/20(月) 01:13:00
#include <windows.h>
399デフォルトの名無しさん:2006/03/20(月) 01:15:26
>>398
それがインクルードできないんですよ。
引っかかってエラー出てしまいます
400デフォルトの名無しさん:2006/03/20(月) 01:16:26
まさかExpressとか言わないよな?w
401デフォルトの名無しさん:2006/03/20(月) 01:17:26
Expressですけど
これではできないんですか?
402デフォルトの名無しさん:2006/03/20(月) 01:18:28
>>401
Win32 SDK(>>4のリンク参照)を別途入れよ。また、その他設定を要する。
403デフォルトの名無しさん:2006/03/20(月) 01:19:25
SDK入れなきゃいけないんですか。
ありがとうございました。
404400:2006/03/20(月) 01:19:34
405デフォルトの名無しさん:2006/03/20(月) 04:44:58
ツールバーのビットマップにLR_LOADMAP3DCOLORSを指定した場合、
画面のプロパティからウィンドウの背景色を変えると、
黒だけしか使ってないボタンが見えなくなってしまう。

「黒以外の色も使うようにする」っての以外に、
なんかいい解決方法ないかな。
406デフォルトの名無しさん:2006/03/20(月) 04:48:49
エキスプレスって知らなかったけど無料なの?
407デフォルトの名無しさん:2006/03/20(月) 07:14:06
>>406
無料だよ。
408デフォルトの名無しさん:2006/03/20(月) 09:21:18
コンパイルエラーも出ず、プログラムの動作も期待通りなのですが
時々画面がブラックアウトして少しの間PCが固まることがあります。
一時的にディスプレイへの信号が切れてるっぽいのでVRAMが解放されてないとかその辺
なんじゃないかと思ってるのですが、なかなか原因が見つかりません。

そこで怪しいと思ってる点なのですが、プロシージャ関数内にswitch(msg){}を含む関数
(引数はhWnd,msg,wparam,lparam,戻り値はLRESULT型でそのままプロシージャの戻り値に)
を複数配置してif分岐でどのswitchを通るか選んでいます。
こういった記述は問題ないのでしょうか?
409デフォルトの名無しさん:2006/03/20(月) 09:41:08
>>408
GDIのみ使ってる限りVRAM解放とかは関係ない。
時間かかる処理してて、メッセージループ回ってないとかじゃね?
410デフォルトの名無しさん:2006/03/20(月) 10:56:07
リソース開放してないで使い切るとそうなる
411デフォルトの名無しさん:2006/03/20(月) 11:52:37
指定フォルダ内のファイルを全て削除する関数はありませんか?
証拠隠滅用に簡単なのを作ってて、最近使ったファイル削除、ゴミ箱を空にまではできたんだけど、
ブラウザの履歴消去が探しても見つからない
412デフォルトの名無しさん:2006/03/20(月) 11:58:59
ブラウザの履歴消去なら知ってるけど
413デフォルトの名無しさん:2006/03/20(月) 12:09:45
履歴消去が目的なのでお願いします
414デフォルトの名無しさん:2006/03/20(月) 13:04:44
それはFireFoxでも使えるのか?
415デフォルトの名無しさん:2006/03/20(月) 14:35:54
DirectXを使わずにフルスクリーン(クライアント領域以外の余計な物を表示しない)にする方法を教えてください。
後、その状態で、メニューだけ表示する方法も。
416デフォルトの名無しさん:2006/03/20(月) 14:54:31
最大化してウィンドウサイズの固定とか。
417デフォルトの名無しさん:2006/03/20(月) 14:56:28
サイズ分だけはみでたウィンドウを作ればいい
418デフォルトの名無しさん:2006/03/20(月) 15:00:23
・画面解像度を変更
・ウィンドウのサイズを画面解像度と同じに変更
419デフォルトの名無しさん:2006/03/20(月) 15:04:37
>>416-418
ありがとうございます。
試してみます。
420デフォルトの名無しさん:2006/03/20(月) 18:23:54
>>417
そんな面倒な事しなくても、
キャプションとボーダーを外して最大化すればいいんジャマイカ?
421デフォルトの名無しさん:2006/03/20(月) 20:50:32
>>409-410
ありがとうございます。
時間のかかる処理と言うのは、メッセージループ内(case MOUSEMOVE内など)
で時間がかかってもダメなんでしょうか?
もしそうなら、最大限高速化して対応する(後は諦める)として
しばらくはリソースが解放されてないって線で調べてみます。
422デフォルトの名無しさん:2006/03/20(月) 21:42:24
Spy++はどうやってメッセージを捕らえているのでしょうか?
423デフォルトの名無しさん:2006/03/20(月) 21:44:17
フック
424デフォルトの名無しさん:2006/03/20(月) 22:01:27
アパカー
425デフォルトの名無しさん:2006/03/20(月) 23:05:13
ノック
426デフォルトの名無しさん:2006/03/20(月) 23:07:50
横山
427デフォルトの名無しさん:2006/03/21(火) 00:14:33
DeleteMenu()した後には必ずDrawMenuBar()しなければならないらしいのだが、
任意のウインドウに表示可能なポップアップメニューの場合、
DrawMenuBar()の引数 HWND には何を指定すればよいのでしょうか?
428デフォルトの名無しさん:2006/03/21(火) 00:31:04
>>427
確かにあるね……。

何でDeleteMenu()のRemarkにもDrawMenuBar()があるんだろう。
メニューの変更をした場合は呼び出す必要があるだろうが、

DeleteMenu()を呼び出したということは、
すでに、メニューを破棄してしまったのだから、
もはや存在しないメニューに対して、DrawMenuBar()を呼び出せるわけもないと思うのだが……。
429デフォルトの名無しさん:2006/03/21(火) 00:34:01
>>428
> DeleteMenu()を呼び出したということは、
> すでに、メニューを破棄してしまったのだから、
いや、DestroyMenu()じゃなくて、DeleteMenu()です。
メニューアイテムを削除した後の話。
430デフォルトの名無しさん:2006/03/21(火) 01:31:13
あ、勘違いしてた。
それなら普通に、DeleteMenu()にも指定したメニューハンドルを指定すればいいでそ。
431デフォルトの名無しさん:2006/03/21(火) 02:31:29
・・・ HWND 型にメニューハンドルを渡すのか?
432デフォルトの名無しさん :2006/03/21(火) 03:21:34
Win32APIの初心者で、まだweb上の基本的な構文しか身につけてないのですが
Win32APIを学ぶのに、全ての文法を覚えるのは、とてもじゃないけど無理だと思ったのです
で、Win32.APIを学ぶ為の書籍等は、あるのでしょうか
Win32APIを熟知していくのにこの書籍はもっとくべきという本はあるんでしょうか
できれば、教えていただきたいです。
433デフォルトの名無しさん:2006/03/21(火) 03:22:54
(´-`)。oO(Win32APIの構文や文法・・・)
434432:2006/03/21(火) 03:45:44
失礼しました
構文や文法は、記述方法としてはCの文法で、いける(いけないかもしれないですが)
要は、Win32APIを学ぶ為の図書があれば教えて頂きたいです
435デフォルトの名無しさん:2006/03/21(火) 03:48:38
すれ違い
436デフォルトの名無しさん:2006/03/21(火) 07:07:25
>>427
いくら任意のウィンドウに表示可能なメニューと言っても
Deleteやら操作するのはどこかのウィンドウのプロシージャだろ
その時の自分のハンドルを渡せばいい
437デフォルトの名無しさん:2006/03/21(火) 07:17:02
単にそれを適応するウィンドウのハンドルじゃないか?
プログラムにウィンドウがひとつとは限らないわけだし
438デフォルトの名無しさん:2006/03/21(火) 07:50:13
>>432
>>要は、Win32APIを学ぶ為の図書があれば教えて頂きたいです
ASCII出版 Cheales Petzold著 プログラミングWindows 第5版
なんといってもこれだろう、文章がしっかりしていて、翻訳もしっかりしている
序章のあたりは物語としても興味深く読めるしWinndowsに対する造詣も深まる
その導入部から徐々に
WIN32APIの本質に進んで分厚い本でも飽きさせない魅力があるYO!
439デフォルトの名無しさん:2006/03/21(火) 09:36:50
まあそんなもの読まずにやっている奴の方が多いけどな
440デフォルトの名無しさん:2006/03/21(火) 10:50:31
解らないことがあっても掲示板に書き込めば
優しいお兄さん達が答えてくれるからな!!!!
441デフォルトの名無しさん:2006/03/21(火) 10:57:48
>>438
よくnyとかの話題する?
別に深い意味はないけど。
442408:2006/03/21(火) 11:18:19
たびたびすみません。
ブラックアウトの原因ですが、staticで宣言したクラスの関数に引数としてHDC(描画元、先ともに)を渡して
描画(TransparentBlt)させてるところっぽいです。
変更があるごとに50〜130回ほどTransparentBltしてるのですが
これってリソース使い尽くすくらい多いのでしょうか?
解決策はDirectDraw使うくらいですかね・・・?
443デフォルトの名無しさん:2006/03/21(火) 11:34:11
どーせSelectObjectの使い方が間違ってるとかそんなところじゃね?
444デフォルトの名無しさん:2006/03/21(火) 11:51:09
>>442
そうじゃなくて、GDIリソースを作るだけ作って解放してないって意味。
445デフォルトの名無しさん:2006/03/21(火) 11:54:20
リソースリークしていないか確認するならタスクマネージャ。
ハンドルの数、GDI オブジェクト、USER オブジェクト当たりはチェック付けとけ。
446デフォルトの名無しさん:2006/03/21(火) 13:37:01
>>437
その後いろいろ試してみたところ、特にDrawMenuBar()を呼び出さなくても
メニュー項目はちゃんと削除されることがわかった。
ただし、システムメニューの場合はDrawMenuBar()を呼び出さないとダメらしい。
・・・ドキュメントが間違っているのか?
447デフォルトの名無しさん:2006/03/21(火) 13:45:27
>>446
System menu の場合、ウィンドウサイズによっては2段になったりして ClieentRgn の更新をしないと
いけないから明示的に DrawMenuBar() 呼び出さないとマズイ と理解している
448408:2006/03/21(火) 13:54:51
hdc_mem = CreateCompatibleDC(NULL);
hBmp = (HBITMAP)LoadImage(NULL,"back.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hBmp, (int)sizeof(bmp_info), &bmp_info);
bmpw = bmp_info.bmWidth;
bmph = bmp_info.bmHeight;
SelectObject(hdc_mem, hBmp);

back_hdc = CreateCompatibleDC(NULL);
hDummy = CreateCompatibleBitmap(hdc_mem,bmpw,bmph);
SelectObject(back_hdc,hDummy);
DeleteObject(hDummy);

こんな感じで作ってるのですが、おかしいでしょうか?
終了処理にDeleteObject⇒DeleteDCもやってるのですが・・・
>>444-445
オブジェクトのほうはタスクマネージャで見たところ、常に二桁程度で増えてる様子
もなかったです。(ためしにEndPaint消してみるといい具合に増えます)
449デフォルトの名無しさん:2006/03/21(火) 14:02:26
GDIについて勉強しなおしてきなさい。
サンプルソースコードは沢山ネットに転がってるから。
450デフォルトの名無しさん:2006/03/21(火) 14:06:52
>>448
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_1vsk.asp

target が SelectObject() されている間 DeleteObject(target) は削除されていない。
  | HDGIOBJ oObj = SelectObject(hDC, target);
  .....
  | SelectObject(hDC, oObj);
  | DeleteObject(target);
こうしないとマズイんじゃ?
451デフォルトの名無しさん:2006/03/21(火) 14:09:35
フォルダの所有権を変更するAPIってありませんか?
452408:2006/03/21(火) 14:53:07
>>449-450
バグ取りに付き合ってもらってすみません。
終了時にSelectObjectで対象を元に戻してからDeleteしてみましたがやはりダメでした・・・
453デフォルトの名無しさん:2006/03/21(火) 14:53:51
特定の部分は透明で後ろのウィンドウが見えているが、
その部分をクリックしてもちゃんと反応するウィンドウを作るにはどうすればいいでしょうか?
454デフォルトの名無しさん:2006/03/21(火) 15:27:26
>>453
レイヤードウィンドウで限りなく透明な不透明領域を作るとか。
455デフォルトの名無しさん:2006/03/21(火) 15:48:35
>>441
>438だが
nyを話題に書き込んだ事は一度もありませんが
なにか?
nyはプログラミング的にはすごく関心はあるけどね
456デフォルトの名無しさん:2006/03/21(火) 17:41:01
>451
SetNamedSecurityInfoで
SE_FILE_OBJECT
OWNER_SECURITY_INFORMATION
457441:2006/03/21(火) 20:33:31
>>455
Winndowsが気になっただけです。
すいません。
458デフォルトの名無しさん:2006/03/21(火) 21:42:54
>455
だけど、なんであやまるのかな?
おいらは最近Windowsの実装を仕方無しにやり始めたYO
マネージドだとかアンマネージドとかややこしいねwww
最近なんとなく、簡単なGUIの実装が組めるようになってきた
と少し嬉しかったので書いて見る
スレ汚しスマソ
459デフォルトの名無しさん:2006/03/22(水) 16:53:11
>>453
>>454の他にリージョンという手も
460デフォルトの名無しさん:2006/03/22(水) 16:56:04
つーか、>>453の「ちゃんと反応する」とは
どっちが反応することを期待してるんだ?
461デフォルトの名無しさん:2006/03/22(水) 16:56:51
>>459
リージョンだと抜けた部分の操作が下のウィンドウに行っちゃうよ?
462デフォルトの名無しさん:2006/03/22(水) 17:02:13
>>460
「後ろのウィンドウが見えている"が"」だから、透明な自ウィンドウだと思う。
463デフォルトの名無しさん:2006/03/22(水) 17:10:06
俺のアンテナもちゃんと反応する
464デフォルトの名無しさん:2006/03/22(水) 17:38:58
俺のアンテナも感度良好ですぎょん
465デフォルトの名無しさん:2006/03/22(水) 19:10:16
俺のちんこは早漏気味ですよん。
466デフォルトの名無しさん:2006/03/22(水) 23:46:21
金冷法を薦めるぞ、やってみちん。
467デフォルトの名無しさん:2006/03/23(木) 00:29:33
EXEの実行をフックして実行させないようにって
どうやるんでしょうか?
ウイルス対策ソフトとかはやってると思うんですが。
468デフォルトの名無しさん:2006/03/23(木) 02:26:07
ウイルス対策ソフトつかえばいいんじゃね?
469デフォルトの名無しさん:2006/03/23(木) 10:27:55
CreateProcess をすり替えてしまえ
470デフォルトの名無しさん:2006/03/23(木) 12:53:55
クリティカルセクションが使用するリソースは
CRITICAL_SECTIONが占めるメモリだけなんですか?
471デフォルトの名無しさん:2006/03/23(木) 12:58:02
いいえ
472デフォルトの名無しさん:2006/03/23(木) 13:24:15
ほう。ということは、いくらメモリ周りが潤沢でも
数万個確保するのはあまりよろしくないのですね?
473デフォルトの名無しさん:2006/03/23(木) 13:32:43
クリティカルセクション数万個確保って……
474デフォルトの名無しさん:2006/03/23(木) 13:38:02
マンコー
475デフォルトの名無しさん:2006/03/23(木) 13:48:12
>>472
例えば
struct { hoge bee; boke gaa; } nanika[10000];

なんてのがあって、個々の構造体へのアクセスをクリティカルセクション内で
行いたいなんて場合は、構造体の中に CRITICAL_SECTION を置くのではなく、
適当なハッシュで個数を減らすのが定石です。

例えば CRITICAL_SECTION cs[100]; なんてのを用いて、cs[index%100] で
クリティカルセクションに入る。1/100の確立で関係ない構造体へのアクセスと
衝突するけど、それによるパフォーマンスの低下は微々たるもの。
476デフォルトの名無しさん:2006/03/23(木) 13:55:13
万個万個ってあまえら、連発すんなぁ。
ぐへへへ。
477デフォルトの名無しさん:2006/03/23(木) 14:19:50
>>476

    [ ゚д゚]y-~~~ デフラグガカンリョウシマシタ
    /[へへ
、。。ぁあえぐすってなへへへまらん万万個個発連
478デフォルトの名無しさん:2006/03/23(木) 14:32:42 BE:139752498-
春休みか。
479デフォルトの名無しさん:2006/03/23(木) 22:33:57
Win32APIの中で一番長い関数名ってなんだっけ?
前にこの板のどこかで見たんだけど忘れちゃった。

偶然見つけた52文字 in advapi32.dll
ConvertSecurityDescriptorToStringSecurityDescriptorA
ConvertSecurityDescriptorToStringSecurityDescriptorW
ConvertStringSecurityDescriptorToSecurityDescriptorA
ConvertStringSecurityDescriptorToSecurityDescriptorW
480453:2006/03/24(金) 09:29:04
逆に短い関数名ならArc
481デフォルトの名無しさん:2006/03/24(金) 09:41:00
GDI+ Flat APIには結構長い名前の関数が多そうな気がする。
482デフォルトの名無しさん:2006/03/24(金) 11:29:36
そうでもないぞ。gdiplus.dllだと長いっても
GdipGetStringFormatMeasurableCharacterRangeCount (49)
GdipSetImageAttributesOutputChannelColorProfile (48)
ぐらい。まあ、短いのでも
GdipGetRegionData (18)
はあるが。
483デフォルトの名無しさん:2006/03/24(金) 12:49:32
すでに起動しているアプリケーションのウィンドウサイズを
自在に変形するにはどうすればよいでしょうか?
この場合の変形というのは
サイズをかえるという意味ではなくて、
リージョンなどを使って星型とかキャラクタの型だとかに
変形することはできるのでしょうか?
484デフォルトの名無しさん:2006/03/24(金) 12:51:46
できますよ
485ねこ:2006/03/24(金) 12:58:08
質問させてください。

現在、VB6.0からVB.NETへ移行中です。 iniファイルから文字列を取得するAPI GetPrivateProfileString
を使用する上でわからない所があります。

GetPrivateProfileString
<引数>
lpAppName:セクション名
lpKeyName:キー名
lpDefault:キーが見つからなかった場合のデフォルトの文字列
lpReturnedString:取得した文字列が入る
nSize:同、文字数
inifilename:INIファイル名
@戻り値@
取得した文字列
で、VB6.0では、lpReturnedStringにはnSizeで指定したバッファ分戻ってきた
のですが、(空文字列で埋めてそのバッファ分を返していた)
VB.NETでは、指定したバッファ分ではなく、文字数分のみかえってきてしまいます。
しかも、文字列AAAだとすると、"AAA だけで、後ろの " が抜けてしまう状態です。

どうすればいいかご存知の方、教えてください!

宜しくお願いします。
486デフォルトの名無しさん:2006/03/24(金) 13:04:20
意味分からん
487デフォルトの名無しさん:2006/03/24(金) 13:18:18
そういう現象なら
VB.NETの仕様でただしいような気がする。
たぶんいままでバグってた
488ねこ:2006/03/24(金) 13:26:13
えっ!?
ばぐ。。。

すみません!
VB6.0では
lpReturnedString(取得した文字列が入る変数) = Space(256)
llngRet = GetPrivateProfileString(・・・・lpReturnedString,256(バイト数)・・)

っといった具合に書くと、"文字列+空文字"(256バイト分)で返ってきてたんですが。。
こっちが間違ってる感じですか??

宜しくお願いします!

489デフォルトの名無しさん:2006/03/24(金) 13:31:29
感嘆符がうざ
490デフォルトの名無しさん:2006/03/24(金) 13:31:50
マーシャラがNULL文字で切ってんだろ
そもそもそれで何か不都合があるのか?
491ねこ:2006/03/24(金) 14:01:16
無事解決できました。
ありがとうございます。
492デフォルトの名無しさん:2006/03/24(金) 17:00:09
他のアプリでクリップボードからデータが読み出されたことって、
クリップボードビューアチェインのメッセージからは認識できないんでしょうか。
どうやって認識可能ですか?
493デフォルトの名無しさん:2006/03/24(金) 22:40:51
バイナリファイルの途中にデータを挿入したり、途中の指定バイトを削除するAPIってない?
CEでの開発を想定しているので、できればメモリに読み込ませたくないんです。
494デフォルトの名無しさん:2006/03/24(金) 22:43:46
メモリに読み込まなくても自前でできるでそ。
495デフォルトの名無しさん:2006/03/24(金) 22:49:05
ファイルの途中を抜いたり、途中を追加することはできない。
自前で、ずらすしかない。その際、一時データをメモリに
読み込ませるのは仕方がない。
496チラシの裏:2006/03/24(金) 23:05:58
まとまったお金ができたから、
前々から欲しかった Advanced windows をついに購入するぞ!


…と思ったら、何処のオンライン書店でも
売り切れとか重版未定とかなってるじゃーか!
どういうことだ!!

た、楽しみにしてたのに……orz
497デフォルトの名無しさん:2006/03/24(金) 23:48:12
>>496
それ大分前に既出@推薦図書スレ
俺も買おうと思ったが無理だった
498デフォルトの名無しさん:2006/03/24(金) 23:54:52
俺の場合、学校の図書館にたまたまあったので助かっている。
499デフォルトの名無しさん:2006/03/25(土) 03:39:36
Advanced Windows、ちょっと立ち読みしてから買いたいんだけど、近所の本屋には置いてないな……。

大学の図書館にリクエストしてみようかね。
500デフォルトの名無しさん:2006/03/25(土) 12:04:10
ウィンドウプロシージャでのキーボードショートカット処理の質問なのですが

タスク切り替えのAlt + Tabを「押されたタイミングで」検出することって
出来ないんでしょうか?
Alt押しながらだとWM_KEYDOWNのVK_TABは発生しないようだし、
WM_SYSKEYDOWNではAltが押された情報のみしか送られてこず、
WM_SYSKEYUPでやっとTabが「離されたタイミング」を検出できたところです。
要はタスク切り替え用のメニューウィンドウが出る直前までに
処理したい事があるのですが、なんとかなりませんでしょうか。
501デフォルトの名無しさん:2006/03/25(土) 12:27:05
>>500
WM_ACTIVATEAPPじゃダメなんか?
502デフォルトの名無しさん:2006/03/25(土) 12:33:26
全ての流れを掌握してるシステムより先に検知することなどできはしない
503デフォルトの名無しさん:2006/03/25(土) 12:39:16
キーボードドライバになんかかませばOSより先に知れるが。
504デフォルトの名無しさん:2006/03/25(土) 12:46:46
そんなことを知ってるヤツがここで聞くかよw
505500:2006/03/25(土) 13:08:30
えっと別に抑止したいとかOSより先にっとかゆんじゃなくて、
タイミングが知りたいだけなんですが…
WM_ACTIVATEAPPはAlt + Tabによる切り替えなのか
判断できないと思うんですけど、何か方法があるんでしょうか?
クリック操作でウィンドウが背後に回る時とかも来ますよね…
506デフォルトの名無しさん:2006/03/25(土) 13:20:30
GetKeyState取るとか。
フック掛ければ早そうだが。
507デフォルトの名無しさん:2006/03/25(土) 13:57:59
フックかければ、ユーザモードアプリより先に取れるはずだよ。
昔、それで、Alt+Tabを独自アプリに切り替えるプログラムがサンプルで Dr.GUIに出てたはず。
508デフォルトの名無しさん:2006/03/25(土) 14:01:56
win2000とかなら取れるけどwin9x系だと取れないことない?
以前winキーのフックができなくて困った記憶がある
509デフォルトの名無しさん:2006/03/25(土) 14:04:31
ローレベルフックしようとしたということではあるまいな
510デフォルトの名無しさん:2006/03/25(土) 14:06:50
そうそうローレベルフックしようとしてたような希ガス
だってローレベルじゃないとWinキー拾えないっしょ?
511510:2006/03/25(土) 14:08:52
記憶が定かじゃないんで間違ってるかもw
512デフォルトの名無しさん:2006/03/25(土) 16:42:52
同じくWinキーはローレベルフックでないと駄目だった記憶が…
513デフォルトの名無しさん:2006/03/25(土) 18:35:02
はじめまして 
同じDLLをLoadLibraryで複数ロードした場合
h1=LoadLibrary("test.dll")
h2=LoadLibrary("test.dll")
インスタンスが複数できるイメージでいたのですが
あくまでもインスタンスは1つなんですね
これを上記 h1,h2で個別のメモリを共有しない方法あります?
検索すると逆に アプリケーション間でメモリを共有する
方法はたくさん載ってるのですが
よろしくお願いします


514デフォルトの名無しさん:2006/03/25(土) 18:58:03
>>513
test.dllを別名で保存してロードすればいい
515デフォルトの名無しさん:2006/03/25(土) 21:36:22
LoadLibraryがやってることを全て自前で実装してしまえばどうとでもできる。
516デフォルトの名無しさん:2006/03/25(土) 22:04:11
モーダルダイアログをモードレスダイアログのように親ウィンドウとアクティブ/非アクティブ
などの動作を共有する方法はないでしょうか?
別のウィンドウに親と自ウィンドウが隠されて、親ウィンドウがアクティブになった歳に
一緒に前面にくるような仕組みを行いたいのです、よろしくお願いします。
517デフォルトの名無しさん:2006/03/25(土) 22:13:01
モーダルといえば、ふつうそうなるけど。
モードレスのときに、モーダルのように、親からアクティブにしてほしい、ってことか?
518デフォルトの名無しさん:2006/03/25(土) 22:30:11
モーダルダイアログしか作成できないので、擬似的にでもモードレスと同じ動作をしたいのです。

現状では、スレッドを作成してモーダルダイアログを作成して、親ウィンドウと別々の
動作を可能にしているのですが、親ウィンドウが前面に出てくる時に
自ダイアログが前面に来ないのでこれをモードレスと同じような動きを作りたいと思って
質問させていただいています。
519デフォルトの名無しさん:2006/03/25(土) 22:35:14
モーダル、モードレスじゃなく、ウィンドウの親子関係の問題の気がするが…
520デフォルトの名無しさん:2006/03/25(土) 22:54:16
どうにかしてモーダルダイアログのHWND持ってくる必要があるが、
SetWindowPosとかでZオーダー変えればいいんじゃねーの?

つーか、

> モーダルダイアログしか作成できないので

コレがさっぱりワカンネ
521デフォルトの名無しさん:2006/03/25(土) 22:59:59
モーダルにしたければ、親ウインドウを無効にするだけでできるんだが、
まさかリソース系の専用のAPIを使わなければできないとか思ってるのか?
522デフォルトの名無しさん:2006/03/25(土) 23:06:12
モーダルで作成して、SetParentで親ウィンドウを指定したのですが
親ウィンドウ内にダイアログが作成されてしまいました。

モードレスも作成は出来るのですが、メッセージループにIsDialogMessageをかませられないので
正常に動作しなかったのです。
523デフォルトの名無しさん:2006/03/25(土) 23:08:56
ウインドウスタイルの設定すらまともにできないのなら、
猫のページを見て、やり方を覚えてからにしろ。
524デフォルトの名無しさん:2006/03/25(土) 23:36:46
>>513
逆に聞くが、なんで別のメモリにしたいの?
525デフォルトの名無しさん:2006/03/26(日) 00:03:09
スレッドセーフじゃないDLLを使わなくちゃいけなかったときに
>>514の方法をやったことがあるな。
>>513が同じ理由なのかは知らんけど。
526デフォルトの名無しさん:2006/03/26(日) 01:49:41
>>525
それよりも、スレッドセーフにするラッパーDLL作った方がいいんじゃない?
527デフォルトの名無しさん:2006/03/26(日) 08:18:02
>>526
kwsk

DLLの関数Aを呼んだあとで関数Bを呼ぶんだけど、
Aの結果を受けてBの動作が変わるという仕様だった。
「Aの結果」というのを、たぶんグローバル変数で持ってたんだな。
で、マルチスレッドで問題が起きた、と。
そのときの俺には>>514以外にいい方法が思いつかなかったんだ。
528デフォルトの名無しさん:2006/03/26(日) 09:49:45
>>520
ダイアログボックスを作るのにはDialogBox関数しかないとか思っているオチではないかと
529デフォルトの名無しさん:2006/03/26(日) 11:55:12
CreateDialogだろ、知ってるよ。IsDialogMessageをメッセージループに入れられないから
正常に動作しないんだよ。
自己解決するのでもう質問への回答はいらないです、失礼します。
530デフォルトの名無しさん:2006/03/26(日) 11:56:29
>>10
研究成果は国民の共有財産だ。
即物的なものにしか価値を認めないDQNにはわからないかもしれないがね。
531デフォルトの名無しさん:2006/03/26(日) 12:00:19
  _, ._
Σ(゚Д゚) ←>>10
532デフォルトの名無しさん:2006/03/26(日) 12:11:07
>>527
ラッパーDLL内で元のDLLをCopyFile
533デフォルトの名無しさん:2006/03/26(日) 12:27:36
>>10は三週間も経った後に
見当違いのレスされてカワイソス
534デフォルトの名無しさん:2006/03/26(日) 13:31:03
>>529
本当にしたいことを捨て台詞とともに書くようじゃ、まっとうな回答は得られる訳ないな
535デフォルトの名無しさん:2006/03/27(月) 15:27:13
まともな質問もできないから自分に逆切れしてるだけかと
536デフォルトの名無しさん:2006/03/27(月) 22:19:44
エディットボックスでダブルクリックを検知したいんですけど、どうすればよいでしょうか?
537デフォルトの名無しさん:2006/03/27(月) 22:49:02
勇気で補え
538デフォルトの名無しさん:2006/03/27(月) 22:50:09
ttp://www14.big.or.jp/~ken1/tech/tech9.html
ここの下記のコード、コピっても全く反応がありません。
case WM_PAINT:
{
PAINTSTRUCT ps;

hdc = BeginPaint(hWnd , &ps);

Blit(hdc,hdc,0,100,50,50,400,260,RGB(0,0,0));

EndPaint(hWnd , &ps);
}
break;
どこが悪いか教えてください。お願いします。
539デフォルトの名無しさん:2006/03/27(月) 22:54:21
>>536

Edit Boxぐらい自前で作れるよ。そうすりゃ簡単。

どうしても、いやならメッセージをフックしろ。
540デフォルトの名無しさん:2006/03/27(月) 23:00:02
GDIナツカシス
>>538
透過部分を黒(0)、描画部分を白(1)にしたマスク画像を作って
まずマスク画像をBitBleでラスタオペレーションにSRCPAINTで描画、
そのあと本画像をSRCANDで描画すると透過処理できる

「背景とマスクをSRCPAINT(論理和)で結合し、そのあとSRCAND(論理積)で結合することによって
黒(0)の部分は全て0になり、白(1)の部分だけに描画される」

とか俺のAPIメモに書いてあった
541デフォルトの名無しさん:2006/03/27(月) 23:00:42
フックってDLL作るのがメンドイよなー
実行ファイルでも大丈夫って噂を聞いたが本当だろうか
542デフォルトの名無しさん:2006/03/27(月) 23:04:34
前提条件が他プロセスなのか?
情報を小出しにしないで、できる限り説明してから質問しろ。
543デフォルトの名無しさん:2006/03/27(月) 23:05:49
>>536
NM_DBLCLK or サブクラス化
544デフォルトの名無しさん:2006/03/27(月) 23:09:15
>>539
どうやって作るのかも言えよ!
つかえねえなボケが。
545デフォルトの名無しさん:2006/03/27(月) 23:24:43
EditBoxくらい、っていうけど、ちゃんとしたEditBox作るのは結構大変だよ。
たとえば、「右から左へ読む」とか「UNICODE制御文字の挿入」とか。
546デフォルトの名無しさん:2006/03/27(月) 23:30:13
大変って何が大変なんだ? アルゴリズムを考えるのが大変なら、自分の脳味噌を呪えよ。
547デフォルトの名無しさん:2006/03/28(火) 08:49:14
エディットボックスのダブルクリック検知くらいでフックとかアホかと・・・
548デフォルトの名無しさん:2006/03/28(火) 08:51:00
>>543
NM系はコモンコントロールの通知メッセージで標準コントロールじゃない
549デフォルトの名無しさん:2006/03/28(火) 09:31:27
>>548
御意
550デフォルトの名無しさん:2006/03/28(火) 10:33:51
故にサブクラス化にしる
551デフォルトの名無しさん:2006/03/28(火) 12:13:40
>>540
ありがとうございます。
552デフォルトの名無しさん:2006/03/28(火) 16:26:02
すみません、CreateFont/CreateFontIndirectで、固定ピッチの太字フォントを強制することは出来ますでしょうか?

LOGFONT logFont = {0};
HFONT hFont;
HDC hDC = GetDC(NULL);

logFont.lfHeight = nHeight;
logFont.lfWidth = 0;
logFont.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
logFont.lfCharSet = SHIFTJIS_CHARSET;
logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logFont.lfQuality = DEFAULT_QUALITY;
logFont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
_tcscpy(logFont.lfFaceName, _T(pszFontName));

hFont = CreateFontIndirect(&logFont);

こんなコードを書いているのですが、FW_NORMALではフォント幅が
たとえば半角8pixel/全角16pixelで全て固定できるのですが
FW_BOLDの場合は9pixelとか17pixelとかの半端な文字が出てしまいます。

何か方法がありましたらご教示頂けませんでしょうか。
553デフォルトの名無しさん:2006/03/28(火) 16:36:14
>>552
8+1→9
16+1→17
554デフォルトの名無しさん:2006/03/28(火) 16:45:39
・日本語をあきらめ、Courier等を使う。
・太字描画処理を自分でやる。
555デフォルトの名無しさん:2006/03/28(火) 16:52:00
それを聞いて思ったんだが、オマイラもちろん
コード書くときのフォントはCourier(New)だよな!?
556デフォルトの名無しさん:2006/03/28(火) 16:54:57
Lucida Console です。
557デフォルトの名無しさん:2006/03/28(火) 17:02:57
ああ...書き方がまずかったですね、すみません

・lfWidthを8と指定しても9になる
・全角が半角の2倍にならない

など、FW_BOLD指定時とFW_NORMAL指定時でフォントの論理的な属性が
異なってしまう点で行き詰まっています。

明示的に指定した値そのもので、かつ全角が半角のきっちり倍になるような
太字フォントで描画することは可能でしょうか?
558デフォルトの名無しさん:2006/03/28(火) 17:03:05
自作フォントです
559デフォルトの名無しさん:2006/03/28(火) 17:04:58
目が見えません
560デフォルトの名無しさん:2006/03/28(火) 17:08:04
>>554, 558
無理ですか...ありがとうございました。
561デフォルトの名無しさん:2006/03/28(火) 17:09:29
太さがNGなら色で区別つければ?
# 多分見難いかもしれんけど・・・
562デフォルトの名無しさん:2006/03/28(火) 17:16:46
>>558
うp
563デフォルトの名無しさん:2006/03/28(火) 17:43:01
固定ピッチのフォントは、ピッチが固定してるだけであって、2byte文字が1byte文字の2倍の幅とは限らない。
自前のウィンドウに描画するなら、1文字づつDrawTextすれば?
あるいは、2倍幅になるようなlfWidthのみを使う。
564563:2006/03/28(火) 17:49:54
>固定ピッチのフォントは、ピッチが固定してるだけであって、2byte文字が1byte文字の2倍の幅とは限らない。
(追記) BOLDにしなくてもサイズによっては、2倍になりません。

565563:2006/03/28(火) 17:51:32
>あるいは、2倍幅になるようなlfWidthのみを使う。
(訂正)あるいは、2倍幅になるようなlfHeightのみを使う。
566デフォルトの名無しさん:2006/03/28(火) 18:13:22
プログラミングにMSゴシック使っている俺は負け組?
567デフォルトの名無しさん:2006/03/28(火) 18:39:37
基本でしょう
568デフォルトの名無しさん:2006/03/28(火) 19:18:49
> 1文字づつDrawTextすれば?
ClearTypeとの相性最悪だから俺は好きでない。
569デフォルトの名無しさん:2006/03/28(火) 22:16:32
東風明朝
さざなみ明朝

1 l I | の区別が楽。
0の中に点があれば、もっとよかったけど。
570デフォルトの名無しさん:2006/03/28(火) 23:56:48
SMゴシップ
571デフォルトの名無しさん:2006/03/29(水) 00:04:03
>>557
フォントの指定を持って厳密におこなうと、lfWidthが8の場合も取れる事がある。
ただし、WIFE時代のフォントだけじゃないかな。日本語だと。
列挙して獲得 DCにセット後、論理フォントで確認、まですれば完璧。

一般的には、文字を描画するときに文字間が指定できる API があるから、それを使う。
572デフォルトの名無しさん:2006/03/29(水) 12:18:47
IMEで入力中というか、未確定文字列があるかどうかを知るには
どの関数が適してますか?
573デフォルトの名無しさん:2006/03/29(水) 12:31:26
質問です
自分の作ったアプリがWinXPでは動くけど、9xでは動かない時、原因としてどのような事が考えられるでしょうか。
・WINVER, _WIN32_WINNT, _WIN32_WINDOWSのバージョンを適切に設定する
・ユニコードビルドしない
くらいしか思いつかないのですが、何か他に気をつけなければならない点があったら教えていただけないでしょうか
574デフォルトの名無しさん:2006/03/29(水) 12:52:38
>>573
XPにも9xにも実装されている関数だとしても油断してはならない。
細かい差異が存在する可能性がある。

たとえばCreateWindow(Ex)では、
NTならHINSTANCEはヌルにして良いが、9xではヌルにできないと言う違いがある。

そんな具合なんでエラーになる箇所で呼んでいる関数をMSDNなんかで調べてみな。
575デフォルトの名無しさん:2006/03/29(水) 12:54:47
・IEのバージョン
・使用しているAPIが9xに対応したものかどうか
576デフォルトの名無しさん:2006/03/29(水) 12:57:42
>>574
なるほど、そりゃキツい
というか、9x系列のOSを持ってないので、9xでも動くように開発するのは無理そうですね…
577は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 13:07:19 BE:317747579-
GetDlgItemTextを行うためにDialogBoxで呼び出したダイアログボックスのハンドルを知る方法って無いですか?
578デフォルトの名無しさん:2006/03/29(水) 13:18:36
教えてオーナードロー&visual-styleに詳しい人

Vistaでプッシュボタンにカーソルを合わせると、じわぁと色が変るのですがあれってどうやるんでしょうか?
579デフォルトの名無しさん:2006/03/29(水) 13:21:08
>>577
LRESULT CALLBACK About( HWND hDlg,....)
{
n = hDlg;

......
}

これじゃダメなの?
580578:2006/03/29(水) 13:44:55
自己解決(してないけど)

MSDNフォーラムみてたら
「まだサポートしてない、Beta2辺りで新しいAPIを公開するかもしれないから待ってね」(適当に訳した)
とあった…orz

>>577
つ FindWindow()
ってDialogBox()で指定するDLGPROCのHWNDでいいんジャマイカ?
581デフォルトの名無しさん:2006/03/29(水) 15:05:33
ここで質問していいのかわからないのですけど、
「ファイル名を指定して実行」ダイアログのログってどこに保存されてます?
582デフォルトの名無しさん:2006/03/29(水) 15:12:18
レジストリのどこか
583デフォルトの名無しさん:2006/03/29(水) 15:13:37
>>581
レジストリ
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
584デフォルトの名無しさん:2006/03/29(水) 15:26:40
ありがとうございました。
585デフォルトの名無しさん:2006/03/29(水) 15:30:43
パソコン初心者も見てるんだ
586は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 15:41:45 BE:322790988-
>>579
これで実行したものの、c_tempの中身が空になって終わりなんですよ。
ちなみにEndDialog(hDig, LOWORD(wParam));の前にブレークポイントを置いて確認しました。
LRESULT CALLBACK WProc_DISC_NAME(HWND hDig, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case WM_INITDIALOG :
return FALSE;
case WM_COMMAND :
switch(LOWORD(wParam)){
case BTN_OK :
GetDlgItemText(hDig, TXT_DB, c_temp, sizeof(c_temp));
EndDialog(hDig, LOWORD(wParam));
return TRUE;
break;
default:
break;
}
break;
default:
break;
}
return FALSE;
}
587は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 15:49:23 BE:247136977-
>>586
訂正
×:空になって
○:空のままで
588デフォルトの名無しさん:2006/03/29(水) 15:52:44
c_tempの宣言はちゃんとしてる?
TXT_DBというコントロールにちゃんと文字列はあるの?
なんでGetDlgItemTextの戻り値をチェックしないんだ?
589は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 16:28:17 BE:30262032-
>>588
>c_tempの宣言はちゃんとしてる?
グローバル変数として宣言してあります。
>TXT_DBというコントロールにちゃんと文字列はあるの?
TXT_DBは別のダイアログでした。
>なんでGetDlgItemTextの戻り値をチェックしないんだ?
クイックウォッチで無いと返されました。
結論:バグ取りに手伝わせてしまい非常にすみませんでした。
(何故かメインのダイアログにあるTXT_DBをGetDlgItemTextの引数に指定していた上に
このダイアログのエディットボックスのIDをちゃんと変えていなかった為。
ちゃんとIDを決めてそのIDを引数にしたら上手く取り込めました。)
590デフォルトの名無しさん:2006/03/29(水) 20:35:25
>>555
Fixed98
斜線つきの0が好きなので

>>576
難しいけど無理ではない
591デフォルトの名無しさん:2006/03/29(水) 20:39:57
>555
Anonymous  最近聞いた。
592デフォルトの名無しさん:2006/03/29(水) 20:46:26
>>555
みそ字 が欲しいなぁ
593デフォルトの名無しさん:2006/03/29(水) 23:10:26
タスクトレイアイコンの上でマウス動かすとツールチップ出てくるけど、
あれをコードで出すにはどうすれば良いの?
594デフォルトの名無しさん:2006/03/29(水) 23:21:45
TextOut
595593:2006/03/29(水) 23:48:44
>>594
それってオレに対するレス?
だとしたらもう少しヒントお願い…
596デフォルトの名無しさん:2006/03/30(木) 00:06:24
597デフォルトの名無しさん:2006/03/30(木) 00:49:25
メモリデバイスコンテキスト関連の質問です。

SelectObject (hdcMemM1, ii[0]) ;
SelectObject (hdcMemM2, ii[1]) ;

BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ;
BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM2, 0, 0, SRCCOPY) ;

ここの部分を、下に直すと上手く動かなくなります。

SelectObject (hdcMemM1, ii[0]) ;
SelectObject (hdcMemM2, ii[0]) ;

BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ;
BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM2, 0, 0, SRCCOPY) ;

出力したい画像が同じで、bitbltを使う場合同じ画像の出力がうまくいきません。
この場合メモリデバイスコンテキストはどのようにするのがヨイんでしょうか?
598593:2006/03/30(木) 00:50:57
>>596
バルーンはNIM_MODIFYすると直ぐ表示されるけど、
ツールチップはNIM_MODIFYしても何か表示されないっぽくて困ってます
599デフォルトの名無しさん:2006/03/30(木) 00:54:11
>>597
なんで転送元二つも必要なん?
画像が同じなら一つでいいじゃん。
600デフォルトの名無しさん:2006/03/30(木) 01:05:06
>>599
トンクスです。
ビットマップハンドルをコピーしてるのが良くなかった気がする。。
デバイスコンテキストハンドルのコピーで増やしてみる。
デバイスコンテキストだけで、128枚画像あるorz 疲れた
601デフォルトの名無しさん:2006/03/30(木) 08:27:57
>>597
1つのオブジェクトを複数のデバイスコンテキストが同時にSelectすることは出来ない。
602デフォルトの名無しさん:2006/03/30(木) 13:23:06
一つの「ビットマップは」だろ。
603602:2006/03/30(木) 13:33:28
>>753
動的にメモリを確保したいときに使う。
mallocしてしっかりfreeしないと、メモリリークが激しいよ。うん。激しいよ。
604602:2006/03/30(木) 13:34:05
あ・・・っ!激し・・すぎ・・!
605デフォルトの名無しさん:2006/03/30(木) 13:34:45
>>753
動的にメモリを確保したいときに使う。
mallocしてしっかりfreeしないと、メモリリークが激しいよ。うん。激しいよ。
606602:2006/03/30(木) 13:35:16
あ・・・っ!激し・・すぎ・・!
607602:2006/03/30(木) 13:38:24
誤爆しましたorz

C言語なら俺に聞け! Part 124
http://pc8.2ch.net/test/read.cgi/tech/1142302804/752-760
608デフォルトの名無しさん:2006/03/30(木) 15:55:04
つまり

SelectObject (hdcMemM1, ii[0]) ;

BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ;
BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ;
609デフォルトの名無しさん:2006/03/30(木) 19:39:01
>>605
malloc/freeだとフラグメント解消できないから、
プロはHeapCreate(0,0,0)してHeapAllocを使う。
610デフォルトの名無しさん:2006/03/30(木) 19:44:17
CreateThreadもリークしますよね?
どうしよ・・・・
611デフォルトの名無しさん:2006/03/30(木) 23:59:01
C++NETでSMTPによるメール送信プログラムを実装しました
次にSocketを使用して、SMTPメール送信するプログラムの実装をして見ようと
思うのですが、大まかな流れは
1 Socketの初期化
2 TCP/IPを設定
3 SMTP設定
4 Socketを閉じる
こんな感じでいいでしょうか?
612デフォルトの名無しさん:2006/03/31(金) 06:21:07
普通はプロトコルとかエンコードとかを考えると思うが
613デフォルトの名無しさん:2006/03/31(金) 06:33:09
うむ
まずはプロとコルだな
プロをマスターした後にコルを習得せよ
614デフォルトの名無しさん:2006/03/31(金) 08:38:24
ドトネトがやってくれるんじゃね
615デフォルトの名無しさん:2006/03/31(金) 10:25:30
>>610
後始末をすればリークしない
616デフォルトの名無しさん:2006/03/31(金) 12:32:28
>>611だす
みなさんどうもです
PCからカキコ出来ないので、携帯からです
実は、TC/IPプロトコル部分をrawSocketを用いて実装したくて
WIN32APIをC++でコーディングした方がいいかと思い、このスレで質問させて
もらいましたが、ドットネットでもrawSocketの関数は用意してあるのでしょうか?
617デフォルトの名無しさん:2006/03/31(金) 12:47:40
サンプルはpingだけどこのあたり。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#rawsocket
618デフォルトの名無しさん:2006/03/31(金) 13:26:05
>>611
Cygwin使えばUnix用のsmtpsendのソースがそのまま使えるよ。
#WinSockは色々互換性がないので注意。
いずれにしても、後はネットワークプログラミングスレにでも。
619デフォルトの名無しさん:2006/03/31(金) 14:25:38
SMTP (Simple Mail Transfer Protocol)
そんなに難むほど難しいことかな?
620デフォルトの名無しさん:2006/03/31(金) 17:01:04
HTTPよりはムズイんじゃない?
621デフォルトの名無しさん:2006/03/31(金) 17:17:34
ウィンドウ内に二つの違う画像を並べるのってどうやるの?
______________
|      |
| ◎ △ |
|____________|

こんな感じで、メニューで開いた画像を左にとかやりたいんだけども
622デフォルトの名無しさん:2006/03/31(金) 17:20:25
>>620
全然

620が「何処がどうムズイと思うのか」が知りたい
623デフォルトの名無しさん:2006/03/31(金) 17:21:18
それから、巨大な画像も
描画エリア内に収まるように縮小したりしたいんだけど

画像を扱うTIPがあまりなくて(´・ω・`)
624デフォルトの名無しさん:2006/03/31(金) 17:22:12
>>621
座標を指定すればいいじゃん
625デフォルトの名無しさん:2006/03/31(金) 17:23:11
>>623
つ StretchBlt
626デフォルトの名無しさん:2006/03/31(金) 17:27:10
Win32APIを始めようと、サイトを見ながら導入しようとしました。コンパイラはBorland C++ Compiler 5.5で、
サイトに書いてある通り、bcc32 -W test.c としてコンパイルしても

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
警告 W8057 test.c 9: パラメータ 'hInstance' は一度も使用されない(関数 WinMain )
警告 W8057 test.c 9: パラメータ 'hPrevInstance' は一度も使用されない(関数 WinMain )
警告 W8057 test.c 9: パラメータ 'lpCmdLine' は一度も使用されない(関数 WinMain )
警告 W8057 test.c 9: パラメータ 'nCmdShow' は一度も使用されない(関数 WinMain )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

このようなエラーが出てしまいます。どこが問題なのか指摘して頂きたいのですが、お願いします。
627デフォルトの名無しさん:2006/03/31(金) 17:27:44
>>621
好きなように描け。

>>623
好きなように縮小しろ。

>>620
もしや、POP before SMTPとかSMTP認証とかと勘違いしていないか?
SMTP自体はCHAT作るより簡単だぞ。
628デフォルトの名無しさん:2006/03/31(金) 17:33:31
POP before SMTP だって、ソケット通信さえ出来ればどうということ無いしなあ。

メール関係で一番面倒なのは、メールメッセージそのものを作るところだよ。
629デフォルトの名無しさん:2006/03/31(金) 17:43:31
>>624-625
ありがd
ちょいと色々いじくってるけどまだ上手くいってない

>>627
それが出来ないから聞いてるんだよ('A`;

あと読み込んだ画像データを
ボタン押したらCUIプログラムに送って実行させるみたいな風にするにはどうしたらいいかな
それが一番やりたい
630デフォルトの名無しさん:2006/03/31(金) 17:47:50
>>629
つ WinExec
631デフォルトの名無しさん:2006/03/31(金) 18:11:25
>>626
-Wがあるから大丈夫なはずだけど何でだろう。
間のスペースが全角なのは、ここに書くときにそうしたと思うし。
632デフォルトの名無しさん:2006/03/31(金) 18:15:09
>>621
位置変えはBitBltの第2、第3引数に普通にあるような。

>>629
CreateProcess。
633デフォルトの名無しさん:2006/03/31(金) 18:17:33
>>631
そうですか・・・もう少し検索して方法を探してみる事にします。レス有難う御座います。
634デフォルトの名無しさん:2006/03/31(金) 18:27:07
-tWでないっけ?
635デフォルトの名無しさん:2006/03/31(金) 18:37:13
windows.hを挿入してないとか
PlatformSDKをいんぽしていないとか

もしそうなら抜くぞ
636デフォルトの名無しさん:2006/03/31(金) 18:45:45
>>634
両方試してみましたができませんでした。
>>635
サンプルコードですので、間違ってはいないと思うのですが・・・。
SDKをもう一度インストールし直してみます。

ダメであれば諦めます。有難う御座いました。
637デフォルトの名無しさん:2006/03/31(金) 18:48:20
>>626
というか真面目に学ぼうとするなら今更BCCなんて使うなや
638デフォルトの名無しさん:2006/03/31(金) 19:00:50
そうだな
VC++2005ExpressEditionが無償で配布されてるんだからそっち使った方がいい
俺もBCCから乗り換えた
639デフォルトの名無しさん:2006/03/31(金) 19:37:16
そして、LPTSTR hoge="hoge"; みたいなサンプルでハマる、と。
640デフォルトの名無しさん:2006/03/31(金) 19:41:56
プロジェクトの文字セット設定を変えればよろし
641デフォルトの名無しさん:2006/03/31(金) 19:55:01
最初からTEXTマクロとかTCHARを使って書けばいいんだけど、最初はウェブからコピペしちゃうよね。
VS2005でもエラーがなく通るのはPetzoldのサンプルコードぐらいか。
642デフォルトの名無しさん:2006/03/31(金) 20:13:43
TEXTマクロなんか使わなくても普通に通る
643デフォルトの名無しさん:2006/03/31(金) 20:32:59
デフォルトで_UNICODEとなってからはTEXTとかTCHARとかやめてwchar_t, L""で書いてる
644デフォルトの名無しさん:2006/03/31(金) 20:34:13
MFCのウィザードで自動で作られるようなメニューのサンプルってどこかにない?
開く・貼り付け・ヴァージョン情報あたりで十分なんだけど
645デフォルトの名無しさん:2006/03/31(金) 20:51:08
できね・・・Orz。最後に一つだけ質問させて下さい。SDKは25MBをDLして、CoreSDK-common.1.2.cab
のフォルダをbcc32.exeと同じ場所に置けばいいのですよね?
646デフォルトの名無しさん:2006/03/31(金) 20:58:22
>>643
引数がLPCTSTRになってる奴にwchar_t*って渡せたっけ?と思って
MSDNライブラリにあった型定義一覧を探してたが見つからない・・・
誰かどこにあったか知らない?
647デフォルトの名無しさん:2006/03/31(金) 21:10:55
そもそも簡単なサンプルのコンパイルならPSDKイラネはずだが。
最低限のSDKはBCCに付いてくる。
648デフォルトの名無しさん:2006/03/31(金) 21:11:48
>>646
LPCTSTRで検索したら普通に出てきたぞ
#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
typedef CONST WCHAR *LPCWSTR;
typedef __nullterminated CONST CHAR *LPCSTR;
なのでLPCTSTRにwchar_t*は渡せない
const wchar_t*なら渡せる
649デフォルトの名無しさん:2006/03/31(金) 21:15:30
>>648

非constなポインタ引数にはconstポインタは渡せない。
650デフォルトの名無しさん:2006/03/31(金) 21:19:27
>>647
自分には無理な様なので脳内コンパイルで楽しみます。ご迷惑お掛けしました。
助言して下さった方々有難う御座いました!諦めます。
651デフォルトの名無しさん:2006/03/31(金) 21:21:46
実は警告とエラーの区別が付いていないだけと予想。
652デフォルトの名無しさん:2006/03/31(金) 21:33:37
>>651
ぬォォォォォォォォォぉぉぉできたーーーーーーーーーー!!!!
出来ましたよ!警告とエラーと言う意味深な発言をしてくれたので、まさかと思い実行しましたら
ウインドウが表示されました。有難う御座います。
コンパイル結果が警告が出たので先入観から無理と判断してしまってました・・・。
警告が出て違和感ありますが、出来てよかったです。
653648:2006/03/31(金) 21:36:44
>>646
漏れも>>649も寝ぼけてたようだww
(>>649の二行目は正しい)
LPCTSTRにはwchar_t*もcons wchar_t*も渡せる。
誤解のないように他のも言っておくと、
当然const LPCWSTR(=const wchar_t* const)やconst LPWSTR(wchar_t* const)も渡せる
(シグネチャは同じだしね)
654デフォルトの名無しさん:2006/03/31(金) 21:37:27
ちゅか誰か俺の644に応えて
655デフォルトの名無しさん:2006/03/31(金) 21:40:34
>>652
Warning も全部解決しる
メッセージをよーーーーーく読めばどうすれば分かるはず
656デフォルトの名無しさん:2006/03/31(金) 22:08:24
C++限定の方法。
int WINAPI WinMain(HINSTANCE, HINSTANCE, char*, int)
657デフォルトの名無しさん:2006/03/31(金) 22:18:36
>>654
猫でも分かる
658デフォルトの名無しさん:2006/03/31(金) 22:27:30
ある区間のコードだけは他のスレッドに制御が移らないように出来ますか?
659デフォルトの名無しさん:2006/03/31(金) 22:28:56
書籍やウェブサイトどおりに
int WINAPI WinMain(・・・){
・・・
return msg.wParam;
}

とすると警告が出るのですが、return (int)msg.wParam; にしたほうがいいんですか?
660デフォルトの名無しさん:2006/03/31(金) 22:31:05
無害な警告だし、明示的にキャストして消しても問題ないと思われ
661デフォルトの名無しさん:2006/03/31(金) 22:34:00
>>660
ありがとうございます。周りに合わせてキャストせずに放っておくことにします。
662デフォルトの名無しさん:2006/03/31(金) 22:34:33
x64 だと問題があるが、まあ意味はないな
663デフォルトの名無しさん:2006/03/31(金) 22:35:16
>>655
どう試してみても消える事が無いです。基本から始めていきいつか警告の意味を理解してみます。
WinAPIは楽しいですね。
664デフォルトの名無しさん:2006/03/31(金) 22:37:06
俺はstatic_castする。
665デフォルトの名無しさん:2006/03/31(金) 22:43:16
>>664
誰もそんなこと聞いてねーよボケ
だいたいC++かどうかもワカンネーだろ
666デフォルトの名無しさん:2006/03/31(金) 22:57:32
_tWinMainにしろ。
667デフォルトの名無しさん:2006/03/31(金) 23:19:59
>>658
ひたすらSuspendThread
668デフォルトの名無しさん:2006/03/32(土) 00:34:25
>>658

カーネルレベルで共有セマフォをねじる。
または、それが発生するような処理を「中途半端」に実行する。

スレッドレベルならば、リソースは共有されているわけで、ひたすら suspend すりゃいいと言うのが妥当。
669デフォルトの名無しさん:2006/03/32(土) 00:59:37
スレッドの優先順位を最高レベルに上げる。
670デフォルトの名無しさん:2006/03/32(土) 01:28:18
>>669

それだけは、やるな。

止めたいスレッド以外、つまりほかのプロセスまで止まる。
システムがCPUパワーをどのように割り振ってるか調べればわかるはず。

671デフォルトの名無しさん:2006/03/32(土) 04:41:34
>>670
調べるからAdvanced Windowsくれ。
672デフォルトの名無しさん:2006/03/32(土) 08:43:17
_tmemset() なぜないんだ
673デフォルトの名無しさん:2006/03/32(土) 09:27:42
>>672
つstd::fill_n
C++だけど。
674デフォルトの名無しさん:2006/03/32(土) 09:28:55
>>670
他のプロセスを止めてはいけないという前提条件は定義されていない。
675デフォルトの名無しさん:2006/03/32(土) 09:45:43
CPUが2つ以上あったら、suspendThread以外の手法では
並列実行されるけどそれは、「制御が移らない」という条件を満たすといえるの?
676デフォルトの名無しさん:2006/03/32(土) 09:51:37
複数のプロセッサを考慮するという前提条件が存在しないが、
それを追加するならプロセスの使用するプロセッサをマスクすればいいだけ。
677デフォルトの名無しさん:2006/03/32(土) 09:56:58
DualCoreとかHTとかある現状で、マルチスレッドプログラムが
マルチプロセッサを考慮しないのはとっても危険だと思うが。
678デフォルトの名無しさん:2006/03/32(土) 10:08:27
>>675が思いつかなかった、回避方法は示したが、
解決したら逆にグダグダ文句を言い続ける。
相手に勝利するためのだけの議論のふっかけ乙。
679デフォルトの名無しさん:2006/03/32(土) 13:49:53
パソコン起動時に壁紙を自動で変更するプログラム作りたいんですが、

壁紙を変更する方法(どのファイルを書き換えればいいか?)と、
起動時にプログラムを自動実行させる方法を教えてください。お願いします。
680デフォルトの名無しさん:2006/03/32(土) 13:49:55
>>671

わかってるなら、いらないだろ。Advanced Windows。俺のは初版だから古いぞ。
681デフォルトの名無しさん:2006/03/32(土) 14:15:38
>>679
ファイル名を決め打ちで持っておいて、任意の壁紙ファイルをその名前にコピーするのが簡単。
#IrfanViewやブラウザがやってる方法もこれ。
その決め打ちのファイルを設定するのはレジストリだが、その位はユーザに選ばせてもいいかも。

自動実行は、スタートアップにショートカットを入れてしまうのがいちばん簡単かな。
これも、場合によってはユーザができることだし。
682デフォルトの名無しさん:2006/03/32(土) 15:08:44
>>679
[HKEY_CURRENT_USER\Control Panel\Desktop]
"Wallpaper"="C:\\WINDOWS\\Walking_Home_by_x_horizon.bmp"
"WallpaperStyle"="0"

この辺。
683デフォルトの名無しさん:2006/03/32(土) 15:19:55
レジストリで直接変更するとログインし直さないといけなくなるけど。
APIで用意されているのに使わない理由が何かあるの?
684デフォルトの名無しさん:2006/03/32(土) 15:28:49
>>681,682
おお、なるほど。これなら、出来そうです。サンクス!
>>683
APIであったんですか。調べてみます、サンクス。
685デフォルトの名無しさん:2006/03/32(土) 16:23:15
リバーコントロールの上にスライダを乗せているのですが
スライダの背景色が描画されてしまいXPだと綺麗に見えません。
そこでリバーをサブクラス化して、WM_CTLCOLORSTATICで
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
としてみたのですが、背景色が透明になるどころか
なぜか黒くなってしまいました。
原因や解決策をご存知の方はいらっしゃいませんか?
686デフォルトの名無しさん:2006/03/32(土) 20:00:49
>>684
APIであると言われて調べるのなら
なぜはじめに調べてみないんだろうか…
687デフォルトの名無しさん:2006/03/32(土) 20:09:56
APIであるなんて考えもしない
俺の場合
688デフォルトの名無しさん:2006/03/32(土) 21:07:32
ものすごくくだらない機能のAPIがあったような気がしたんだが
なんだっけ?
689デフォルトの名無しさん:2006/03/32(土) 21:14:19
それはようするに、誰が一番くだらないAPIを見つけられるかという
ネタ振りだな?
690デフォルトの名無しさん:2006/03/32(土) 21:25:04
CharNextを馬鹿にするな!
691デフォルトの名無しさん:2006/03/32(土) 21:39:19
ウィンドウが何のフォントを使っているのか調べる方法はあるのでしょうか?
MSDNを調べた結果、GetTextFace()だと思ったのですが、自プロセスのEditコントロールから取得すると何のフォントが使われていても"System"という文字列しか返ってこないようなのですが・・・?
692デフォルトの名無しさん:2006/03/32(土) 22:56:12
WM_GETFONT
693デフォルトの名無しさん:2006/03/32(土) 23:33:37
>>690
CharNext()は別に下らなくないだろ
694デフォルトの名無しさん:2006/04/02(日) 01:42:30
じゃあ、FreeLibraryAndExitThreadとか言ってみるテスツ
695デフォルトの名無しさん:2006/04/02(日) 02:00:58
画像を窓に表示させたいんだけど
これって勝手にスクロールバーとか出てこないの?
696Win32API:2006/04/02(日) 03:13:17
出てくるわけねーだろ
甘えんなヴォケ
697デフォルトの名無しさん:2006/04/02(日) 08:23:01
>>695
検索用キーワード
CreateWindow WS_VSCROLL WM_VSCROLL
698デフォルトの名無しさん:2006/04/02(日) 09:13:15
>>695
おれもあってもイイと思うがない。
high level の bmp control とか image control。audio control か sound control か
wave control とか。edit control, rich edit control があるもんな。
画像を扱う third party 保護といえば保護なんかな。

win98 時代にも jpeg, tiff などの filter も持っているのに公開していない。
自前で decode しないといけなかった。

API の説明も分かり難いものがある。使う側がテストしながら使うはめになる。
説明書くのを手抜きしたいなら、ソースを公開すればいいと思うんだが。
699デフォルトの名無しさん:2006/04/02(日) 09:40:48
>>698
( ゚Д゚)・・・

(゚Д゚)・・・
700デフォルトの名無しさん:2006/04/02(日) 11:03:02
SecureZeroMemory
701デフォルトの名無しさん:2006/04/02(日) 12:05:56
SetWindowsHook(Ex)でロードされたdllのDllMainは実行されますか?
702デフォルトの名無しさん:2006/04/02(日) 12:11:58
>>701
DllMain内でOutputDebugStringでも使ってデバッグ出力確認すればいいじゃない
703デフォルトの名無しさん:2006/04/02(日) 13:45:40
コモンコントロールをリソース無しで(CreateWindow系で)作っています。

この自作コントロール、親がダイアログの場合は何も問題が無いのですが、
親が普通のウィンドウの場合、再描画を行ってくれなくて困っています(例えばタスク切り替え時など)。
手直しする方法を御存知のかた、教えて頂けないでしょうか。

一応、親ウィンドウのWM_PAINTにて、(子の)InvalidateRect等を呼んでみたりしましが、駄目でした。
704デフォルトの名無しさん:2006/04/02(日) 14:11:20
>>703
親ウィンドウにWS_CLIPCHILDRENが付いてないとか言うなよ。
705デフォルトの名無しさん:2006/04/02(日) 14:42:37
>>704
はい、それは大丈夫です。
具体的にはWS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
でやってます。逆に、これを外しても駄目みたいです。

補足で、自作コントロールの方では、一応極力DefWindowProcを各メッセージで呼んでます。
706デフォルトの名無しさん:2006/04/02(日) 15:20:59
その自作コントロールは、WM_PAINTでちゃんと描画してるか?
707デフォルトの名無しさん:2006/04/02(日) 15:41:20
>>706
お付き合いどうもです。

例えば自作エディットコントロールなんですが、これを枠だけWM_NCPAINTで自前描画しています。
他の文字や反転処理、プロンプト描画などは全て、DefWindowProcに任せています。
そして一応成功しています。

問題なのはその自作エディットコントロールを一度ShowWindowで非表示>表示したり、
あるいはアプリをAlt+Tabでタスク切り替えしたときでして、この時コントロールの再描画を一切行ってくれません。
(ただこの場合も、そのコントロールにフォーカスが行くと再描画してくれます。)
708デフォルトの名無しさん:2006/04/02(日) 16:06:51
WM_NCPAINTでBeginPaint使ってるとか言うなよ。
709デフォルトの名無しさん:2006/04/02(日) 16:10:03
リストボックスを持ったモードレスダイアログを作りたいです。
BCCFormで作ったんですが、上手くいきません。
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT
スタイルがおかしいのでしょうか?
710デフォルトの名無しさん:2006/04/02(日) 16:11:13
リストビュー(レポートビュー)のカスタムドローで
NMCUSTOMDRAWのrcに正しい値が入ってないのは仕様なの?
x座標はあってたけど、y座標の値がでたらめだった。
LVM_GETSUBITEMRECTで解決したが、半日ほど悩んだ。
711デフォルトの名無しさん:2006/04/02(日) 17:30:48
>>708
マニュアル通り、GetWindowDC(GetDCEx)です。

どうもこいつは、ウィンドウベースじゃ無理そうだな…
712デフォルトの名無しさん:2006/04/02(日) 17:59:06
TerminateProcessで殺される事を、
事前に察知させる方法ありませんか?
せめてちゃんとリソースを破棄してから終了したいのです。
この仕様はあまりにも理不尽です。
Terminate呼ぶ代わりにWM_CLOSEみたいな
メッセージを投げるとかの対処しかありませんか?
713デフォルトの名無しさん:2006/04/02(日) 18:02:30
つまりアレか? メッセージ処理したくないけど終了前になんらかの処理を行いたいと?
714デフォルトの名無しさん:2006/04/02(日) 18:03:22
>>712
それでリソースの破棄に時間掛けたりあまつさえ無限ループしたりするのか?
馬鹿馬鹿しいイタチごっこだな
715デフォルトの名無しさん:2006/04/02(日) 18:33:53
とりあえずWM_CLOSEでも送ってみれば?
つーかものすごいバカっぽいな
716デフォルトの名無しさん:2006/04/02(日) 18:45:14
UNIXならシグナルハンドラでどうにかなるんだがな。
717デフォルトの名無しさん:2006/04/02(日) 18:52:35
ほう、どうやってUNIXでSIGKILLを処理するのか詳しく聞こうか?
718デフォルトの名無しさん:2006/04/02(日) 19:57:26
うむ
719デフォルトの名無しさん:2006/04/02(日) 20:49:13
シングルラインのエディットコントロールでEnterキーを押したときに鳴る
ビープ音を止めるにはどうすればよいでしょうか?
WM_KEYDOWNを捕まえても意味がなかったようです。。
720デフォルトの名無しさん:2006/04/02(日) 21:28:11
例えば
OKボタン、Cancelボタン、テキストボックスの3つしかないダイアログボックスがあります。
そして、テキストボックスに http://test.jpg などの文字列を入力。
その後OKボタンを押すとダウンロードが始まる仕組みを作りたいのですが、
このダウンロードのプロセスがわかりません。
APIの関数ひとつで出来るような簡単なものを想像しているのですが、実際のところ
どうすれば実現できるのでしょうか
721デフォルトの名無しさん:2006/04/02(日) 21:29:53
URLDownloadToFile だったっけ?重いファイルだと固まるけど
722デフォルトの名無しさん:2006/04/02(日) 21:32:33
>>721さま
おぉ!即レスありがとうございます!
さっそくこの情報を元に頑張ってみたいと思います。ありがとうございました。
723719:2006/04/02(日) 22:29:27
自己解決しました。
WM_CHARを捕まえてVK_RETURNのときだけ
CallWindowProcを呼ばないようにしたら出来ました。
724デフォルトの名無しさん:2006/04/02(日) 23:17:56
BMP画像をクライアント領域よりも大きいときは縮小
小さいときは、クライアント領域内に表示っていうのがうまくいかない

誰かおしえてくれ。。。
725デフォルトの名無しさん:2006/04/02(日) 23:24:44
自分でどこまでできてどこが分からないのかを説明できるようになってからもう一度質問に来い。
726デフォルトの名無しさん:2006/04/02(日) 23:27:18
クライアント領域を指定して
そこに指定したデータを開いて
クライアント領域に合わせて画像を拡大縮小させるの

全部がわがんね
そんなことを説明してるサイトのアドを教えてよ
もう、疲れた
727デフォルトの名無しさん:2006/04/02(日) 23:43:22
すとれっちんぽ
728デフォルトの名無しさん:2006/04/03(月) 00:26:00
WM_CHARがキーボードからの入力なのか、
それとも何かのAPIがポスト or 送信したものなのか、判別する方法ってありますか?
729デフォルトの名無しさん:2006/04/03(月) 00:29:55
TranslateMessageがWM_KEYUP/DOWNを変換してWM_CHARを発行するんじゃなかったっけ?
730デフォルトの名無しさん:2006/04/03(月) 00:36:40
そのようなんですが、
キーボードからの入力があってWM_KEYUP/DOWNが来てWM_CHARが発行されたのか、
何かのAPIがWM_KEYUP/DOWNを送ってきてWM_CHARが発行されたのか、です。
(もしかしたら直接WM_CHARを送ってきている?)
wParamとかlParamを見るのかもしれませんが、とりあえずGetKeyStateでしのいでいます。
731デフォルトの名無しさん:2006/04/03(月) 05:07:08
>>724
クライアント領域の大きさを取得。
ビットマップの大きさを取得。
minマクロあたりで小さいほうを採用
ストレッチブリットを使う。

こんな感じでどうだい?
732デフォルトの名無しさん:2006/04/03(月) 05:09:53
説明は次のレスで。
HBITMAP CreateMask(HWND hWnd,HBITMAP Src,COLORREF trans){//マスク作成。透過色は黒になる。
    BITMAP bm; HDC hdc,mdc,sdc,rdc; HBITMAP hbmp,hmono,old,old2,old3; COLORREF oldbk;
    GetObject(Src,sizeof(BITMAP),&bm);
    hdc = GetDC(hWnd);
    mdc = CreateCompatibleDC(hdc);
    sdc = CreateCompatibleDC(hdc);
    rdc = CreateCompatibleDC(hdc);
    hbmp = CreateCompatibleBitmap(hdc,bm.bmWidth,bm.bmHeight);
    hmono = CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);
    ReleaseDC(hWnd,hdc);    
    old = (HBITMAP)SelectObject(sdc,Src);
    old2 = (HBITMAP)SelectObject(mdc,hmono);
    oldbk = SetBkColor(sdc,trans);
    BitBlt(mdc,0,0,bm.bmWidth,bm.bmHeight,NULL,0,0,WHITENESS);
    BitBlt(mdc,0,0,bm.bmWidth,bm.bmHeight,sdc,0,0,SRCCOPY);
    old3 = (HBITMAP)SelectObject(rdc,hbmp);
    BitBlt(rdc,0,0,bm.bmWidth,bm.bmHeight,mdc,0,0,SRCCOPY);
    SelectObject(sdc,old);
    SetBkColor(sdc,oldbk);
    SelectObject(mdc,old2);
    SelectObject(rdc,old3);
    DeleteDC(sdc);
    DeleteDC(mdc);
    DeleteDC(rdc);
    DeleteObject(hmono);
    return hbmp;
}
733732:2006/04/03(月) 05:18:04
現在非常に困っています。お知恵を拝借したい。

>>732はとあるビットマップの透過用マスク画像を生成するための関数です。
引数はGetDCするためのウインドウハンドルとマスクのソースとなるHBITMAPそして透過色を指定する数値です。
で、現状の問題はこの関数を使ってできた画像をそのままウインドウにBitBltしてみても期待のようにはならず白になってしまいす。
白になるのは途中でWHITENESSをBltしているからなんですが、その先の処理がうまく意図どおりに動かないようです。
どこか見落としなどの指摘があればぜひお聞かせください。
734デフォルトの名無しさん:2006/04/03(月) 05:55:57
誰もいない。
鳥のさえずり聞くなら今のうち。

ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。
ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。
ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。

Orz
735732:2006/04/03(月) 06:24:26
寝ます。
それと質問は一端取り下げます。
また別の機会にでも質問させてもらおうと思います。

それじゃお休みです。
736デフォルトの名無しさん:2006/04/03(月) 10:21:36
>732
マジレスしてやる
そんな糞コードをこねくり回すよりCreateDIBSectionで作ったDIBに
自分でマスク用データ書き込んだ方が比較にならんほどマシ
全部書き直せ
737デフォルトの名無しさん:2006/04/03(月) 13:59:29
物理メモリの使用容量を取得するにはどうすればよいでしょうか?

GlobalMemoryStatusで取った総容量から空き容量を引いた値は
システムキャッシュで使われている分も含んでしまうので、
それを含まない値を取得したいのです。
738デフラグさん ◆mRgSYalFkQ :2006/04/03(月) 16:47:44
>>734

  [゚д゚] デフラグカンリョウ
 /[_]b
  | |
Orz。。。。。。。。。。。。。。。。。。。。いいうえくさずちちちちちちちちちちちちちちちちちちちちちちちちち
ちちちちちちちちちちちちななののもゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅ
ゅゅゅゅらりんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんピピピピピ
ピピピピピピピピピピピピピーーーーーーーーーーーーーーーーーー今聞誰鳥
739デフォルトの名無しさん:2006/04/03(月) 17:11:58
画面のプロパティの設定タブで確認できる、各モニタ毎の番号は
EnumDisplayDevicesの第2引数で指定したもの+1なのでしょうか?
そうでないならばモニタ番号とディスプレイデバイスの対応を取る方法は無いでしょうか?
740デフォルトの名無しさん:2006/04/03(月) 17:30:48
createprocessでDOSプログラム(○.exe)に ”ファイルパス | -n > FILE” 見たいな感じのコマンドラインを実行させたいのですが
どういう風にもっていけばいいのでしょうか

ためしにノートパッドの起動だけやってみたのですが
ノートパッドだと、これに文字列がはじめに入力されるような感じで

STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = /*SW_HIDE*/SW_SHOWNORMAL;
PROCESS_INFORMATION pi;
CreateProcess(NULL, "notepad ", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

741デフォルトの名無しさん:2006/04/03(月) 17:42:35
> UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );
> BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString );

GetDlgItemText に必要なのがLPTSTR型で
SetDlgItemText に必要なのはLPCTSTR型ですが
GetDlgItemText で取得したものを SetDlgItemText で表示する際
データの変換はどうするのでしょうか?

(LPCTSTR)LPTSTR とか (LPTSTR)LPCTSTR 、あとstrcpy関数も試してみましたが
うまくいきませんでした
742デフォルトの名無しさん:2006/04/03(月) 17:52:21
>>740
何がやりたいのかさっぱり言ってることの意味わからん。
> コマンドラインを実行させたい
ここだけに反応すると
 cmd.exe /c コマンドライン
を実行すればいい。

>>741
> うまくいきませんでした
では原因わからんわ。
質問するときは何が起こったのか書いてくれ。
743デフォルトの名無しさん:2006/04/03(月) 18:02:40
猫でもわかるWindowsプログラミングを片手に簡単なスクリーンセーバーを作ろうとしているのですが
ほぼ本の通りにやっているのですが、画像が表示されません
何度も本と見比べたのですが、どこが間違っているのかわかりませんでした

#define ID_TIMER 101
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 HDC hdc, hdcMem;
 static RECT rc;
 HBITMAP hBmp;
 BITMAP bmpInfo;

 switch(msg){
   case WM_CREATE:
SetTimer(hWnd, ID_TIMER, 500, NULL);
GetClientRect(hWnd, &rc);
break;
   case WM_TIMER:
if(wParam != ID_TIMER) break;
hdc = GetDC(hWnd);
hBmp = LoadBitmap(hMainInstance, "MY_BITMAP"); // ビットマップリソース
GetObject(hBmp, (int)sizeof(BITMAP), &bmpInfo);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBmp);
BitBlt(hdc, 50, 50, bmpInfo.bmWidth, bmpInfo.bmHeight, hdcMem, 0, 0, SRCCOPY);
DeleteObject(hBmp);
DeleteDC(hdcMem);
ReleaseDC(hWnd, hdc);
break;

どこが悪いのか教えて頂けないでしょうか
744デフォルトの名無しさん:2006/04/03(月) 18:04:19
うわ、スペースおかしくなってしまってすいません・・・
745デフォルトの名無しさん:2006/04/03(月) 19:05:44

CreateProcess(NULL, "netsh interface ipv6 install", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
これで出来ないか?と一週間前に知った関数で知ったかンス



流してほしい海の果てまで
746デフォルトの名無しさん:2006/04/03(月) 19:15:49
>>736
おはようございます。
書き直しですか。なるべく泥臭いことはしたくなかったんですが。
少々残念ですが、そのように検討してみます。
747デフォルトの名無しさん:2006/04/03(月) 20:16:09
>>741
LPTSTRはTCHAR*のtypedef。
LPCTSTRはconst TCHAR*のtypedef。
だからLPTSTR型のオブジェクト(変数)はLPCTSTR型へ暗黙の内に変換できる。
748デフォルトの名無しさん:2006/04/03(月) 20:36:13
>>745
自分へのレスでいいのかな?
どうもです。
ただ、プログラム始めたばかりなので
いまいちどういう関数か分からくて試すのに時間がかかりそうです。
749デフォルトの名無しさん:2006/04/03(月) 20:37:18
あ、上は>>743です。ここってID出ないんですね
750デフォルトの名無しさん:2006/04/03(月) 20:44:22
実はリソースが無いというオチではないか
751743:2006/04/03(月) 21:19:56
リソースは本に書いてある手順に従ってやったら、こんな感じになりました
ttp://www.uploda.org/uporg355339.jpg
752デフォルトの名無しさん:2006/04/03(月) 21:43:16
ありがちなオチだな。
753デフォルトの名無しさん :2006/04/04(火) 03:11:45
教えてくださいお願いします。
ウィンドウを作ろうとしてるのですが
一番最後のNULLの部分で警告がでるのですが
(warning C4133: '関数' : 'char [10]' と 'LPCWSTR' の間で型に互換性がありません)
どこをどうすれば良いのかがわからないです。
hWnd = CreateWindow(szClassName,
//タイトルバーにこの名前が表示
L"俺じゃわからんWindowプログラミング",
WS_OVERLAPPEDWINDOW,//ウィンドウの種類
CW_USEDEFAULT,//x座標
CW_USEDEFAULT,//y
CW_USEDEFAULT,//幅
CW_USEDEFAULT,//高さ
NULL,//親ウィンドウのハンドル、親ならNULL
NULL,//メニューハンドル、クラスメニューを使うときはNULL
hInst,//インスタンスハンドル
NULL);
754デフォルトの名無しさん:2006/04/04(火) 07:02:50
L"俺じゃわからんWindowプログラミング",
_T("俺じゃわからんWindowプログラミング")

Warningは行単位で出るので一番最後のNULLの部分で出ているわけではない。
755デフォルトの名無しさん:2006/04/04(火) 10:17:00
'char [10]'って言ってるんだから、警告が出ているのはszClassNameの方だと思われ。
szClassNameの宣言をCHAR(char)ではなく、WCHAR(wchar_t)もしくはTCHARにするべし。
756753:2006/04/04(火) 10:38:40
>>754さん
ありがとうございます
一応TEXT("俺にはわからないwindowsプログラミング")でコンパイルしたのですが
やはり警告がでて、でもビルドは出来ました
ただコンパイル時の警告
(warning C4133: '関数' : 'char [10]' と 'LPCWSTR' の間で型に互換性がありません)
は、なぜ出るのかまだ、自分自身理解不足で、コンパイル時点では出てしまう警告
はビルドが正常に行われたらあまり気にしなくて良いのでしょうか
初心者の質問で申し訳ありません
757753:2006/04/04(火) 10:45:35
>>755さん
ありがとうございます
szClassNameをWCHAR
にしたらコンパイルエラーがなくなりました
ちなみに、文字列を書くときはTEXT()で囲んで書く習慣
つけた方が良いのでしょうか
初心者すぎてすみません
758デフォルトの名無しさん:2006/04/04(火) 11:31:26
>>757
文字列はTEXT()で。
変数もTCHAR,PTSTR等を使ったほうがいい。たぶん。
759デフォルトの名無しさん:2006/04/04(火) 11:52:21
GetProcAddressにはASCII版しかないし、GDI+なんかはほとんどUnicodeしか食わない。
つーことで結局臨機応変に対応するしかないわけだが。
760デフォルトの名無しさん:2006/04/04(火) 12:27:17
>>757

LPTSTR、LPCTSTR は TCHAR[] で TEXT("hoge")とか_T("hoge")、
LPWSTR、LPCWSTR は WCHAR[] で L"hoge" 、
LPSTR、LPCSTR は CHAR[] で "hoge"、
LPOLESTR、LPCOLESTR は OLECHAR[] で OLESTR("hoge")、
BSTR はちょっと変なの、

と昔から決まってる。
761デフォルトの名無しさん:2006/04/04(火) 13:29:11
指定のプロセスを強制終了させたいんだけどそういうAPIありますか?
Internet ExplorerだとIEXPLORE.EXEのプロセスを殺すとか
762デフォルトの名無しさん:2006/04/04(火) 13:47:48
TerminateProcess
ただし、強制終了だから不具合起きても知らん。
763デフォルトの名無しさん:2006/04/04(火) 14:08:27
>>762
サンクス
関数名で色々ググってみたところこのやり方で大丈夫そうなのでちょっと試してみる
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200512/05120047.txt
>強制終了だから不具合起きても知らん。
家族に変なもの見られて人生に不具合が起きるよりはマシなのでおk
764デフォルトの名無しさん:2006/04/04(火) 15:03:56
>>763
そんな用途ならWin+D or Win+Mで十分じゃ?
765デフォルトの名無しさん:2006/04/04(火) 15:17:21
なにこのWindows組み込みボスが来たコマンド
Windows数年間使ってきたけど今まで知らなかった
せっかくだからTerminateProcessの方も作ってみて
そのあとでキー状態変更APIでも探してそっちのも作ってみる
ありがと
766デフォルトの名無しさん:2006/04/04(火) 16:21:06
>>740
ちゃんとやるなら
CreateProcess()で取ってきたpiの中にあるハンドルをゴニョゴニョして
ReadFile()するのが定石

てゆうかかなり昔にやったことなので詳しいことは忘れた後は自分で調べてくれ
(猫のパイプがどうのこうのって所にサンプルがあったような気がする)

ちなみに、結果をnotepadに出す方法はシラン
767デフォルトの名無しさん:2006/04/04(火) 16:24:37
>>743
scrnsave.libをちゃんと入れたか?
768デフォルトの名無しさん:2006/04/04(火) 16:35:41
>>764
ただのデスクトップだけだと怪しいからこっちの方がいいんジャマイカ?

・適当なテキストファイルを作成
・そのファイルのショートカットを作る
・ショートカットを右クリックしてプロパティを選択
・ショートカットキーという項目に適当なキーを登録、実行時の大きさは最大にしておく

結構無駄な努力だけどね<ボスがきた
769743:2006/04/04(火) 18:22:52
>>767
入れました
コンパイル後に、本に書いてあった通りに.exeの部分を.scrに変更すると起動するんですが
画像は表示されないんです
770デフォルトの名無しさん:2006/04/04(火) 19:41:56
指定された区域にスクロールバーつけたいんですが、
ウィンドウって分割できますか?
771デフォルトの名無しさん:2006/04/04(火) 19:44:42
位置の指定はいくらでも出来るので、好きなように分割しろ。
問題は指定された区域ではなく、指定した区域になるということだ。
772770:2006/04/04(火) 21:01:31
>>771
ありがとうございます。
小出しすみません。
分割の方法を教えてください。
見えない子ウィンドウにバーをつけようかと試みたのですが、
バーも消えてしまって上手くいきませんでした。
お願いします。
773デフォルトの名無しさん:2006/04/04(火) 21:12:30
>>769
exeと同じ起動方法で起動しない、
とか言うオチじゃないだろうな?
774770:2006/04/04(火) 21:36:04
分かりにくいですね。すみません。
CreateWindow()でSCROLLBARクラスを指定したら、座標は指定できますが
旧式のスクロールバーになってしまうので
xp仕様(?)のスクロールバーにできませんか?
って事です。
775デフォルトの名無しさん:2006/04/04(火) 22:41:23
RSTパケを送出したいのですが、socketの生成から、
順にどんな関数を使えばいいですか?
とりあえず関数名だけ羅列してくれれば助かります。
776デフォルトの名無しさん:2006/04/04(火) 22:55:16
世も末だな
777デフォルトの名無しさん:2006/04/04(火) 22:59:25
connect() して send() して close() じゃないかな、うん
778743:2006/04/05(水) 00:23:09
>>773
起動はして、マウスを動かすと終了する感じでスクリーンセーバーの動きはするんですが
用意した画像は表示してくれません
779デフォルトの名無しさん:2006/04/05(水) 01:10:22
プルダウンメニューをプログラムで閉じたいのですが、いい方法はないでしょうか。
あるボタンからプルダウンメニューが表示されているウインドウに
ウインドウメッセージを投げると、プルダウンメニュー閉じ、そのウインドウメッセージを処理するようなイメージです。
エクスプローラの表示(一覧/詳細/アイコン/...)ボタンに近いです。

で、以下のように書いてみたのですが、プルダウンメニューは閉じるものの、ボタンは凹んだままで完全ではありません。
HWND hWndMenu = ::FindWindow(_T("#32768"), NULL);
if ( ::IsWindow(hWndMenu) ) ::DestroyWindow(hWndMenu);

あと、プルダウンメニューを表示するボタンはたくさんあり、特定のメニューを閉じるという実現方法は避けたいです。

よい方法があればご教授をお願いします。m(_ _ )m
780デフォルトの名無しさん:2006/04/05(水) 01:16:00
>>743
多分rcファイルのリソース名がIDになっているんだな
LoadBitmap()の所の"MY_BITMAP"をMAKEINTRESOURCE(MY_BITMAP)に変えると解決するかも
781デフォルトの名無しさん:2006/04/05(水) 01:42:42
>>779
keybd_eventでは駄目なのかのぅ?
782775:2006/04/05(水) 03:03:51
>>777
レスありがとうございます。
が、そういうことでなくて、自前でRSTパケだけを送出したいのです。

(1) socket()
(2) setsockopt()
(3) sendto()

だけで送れそうなので試してみるけどダメっぽいんです。
なので、根本的に使う関数とかが間違えてるかなぁと思いまして。。

783デフォルトの名無しさん:2006/04/05(水) 03:27:11
生ソケットとか
784デフォルトの名無しさん:2006/04/05(水) 03:42:23
ヒント:スレ違い
785デフォルトの名無しさん:2006/04/05(水) 05:05:43
ヒント房、うざい。
786デフォルトの名無しさん:2006/04/05(水) 06:14:25
基礎知識が欠乏
787デフォルトの名無しさん:2006/04/05(水) 09:24:04
>>778
> 起動はして、マウスを動かすと終了する

回線切って(ry
788デフォルトの名無しさん:2006/04/05(水) 10:19:33
>>779 WM_CANCELMODE
789デフォルトの名無しさん:2006/04/05(水) 10:41:31
すみません。
1つ質問させてください。

ディレクトリの削除で
SHFileOperation
を使いたいのですが。

相対パスが使えません。
EX:"..\..\DATA"こんな感じで。

これは、使えないのでしょうか?

もし出来ないとしたとき、APIで相対パスをフルパスに変換するAPIは、あるのでしょうか?

もしわかりましたら教えてください。


790デフォルトの名無しさん:2006/04/05(水) 10:44:49
もしかして
- \
+ \\
とかって問題?
791デフォルトの名無しさん:2006/04/05(水) 10:45:18
>>789
"..\\..\\DATA"じゃないのか?と適当な事を言ってみる
792デフォルトの名無しさん:2006/04/05(水) 10:56:20
>>790-791

いや、VBを使ってるんですよ。
フルパスでは、成功しています。
793デフォルトの名無しさん:2006/04/05(水) 11:19:48
>>792
API でいいなら

GetCurrentDirectory して PathAppend して PathCanonicalize かな。
794デフォルトの名無しさん:2006/04/05(水) 11:20:19
ヒント:MSDN
795デフォルトの名無しさん:2006/04/05(水) 11:20:54
>>793
ありがとうございます。
やってみます。
796デフォルトの名無しさん:2006/04/05(水) 11:34:40
GetFullPathNameを忘れるな。
797デフォルトの名無しさん:2006/04/05(水) 11:51:54
それ以前に、カレントディレクトリからの相対パスを
扱うってのは危険じゃないか?
カレントディレクトリ=実行ファイルのあるディレクトリとか
思ってないか?
798デフォルトの名無しさん:2006/04/05(水) 11:55:41
皆さん色々ありがとうございます。

vbつかってるのでカレントディレクトリは、app.pathでとります。
799デフォルトの名無しさん:2006/04/05(水) 12:06:05
>>798
それカレントじゃない。
800デフォルトの名無しさん:2006/04/05(水) 12:28:33
>>799
EXEを実行したときの始めに
app.pathでとればカレントになると思うが違ってますか?
801デフォルトの名無しさん:2006/04/05(水) 12:35:12
すんませんAPIの名前を教えてください。
「ファイルを開く」で使われるコモンダイアログはOpenFileName()ですが、
似たような感じで「フォルダ」のパスを取得するAPIはなんと言うやつでしょうか?
802デフォルトの名無しさん:2006/04/05(水) 12:36:56
>>801
SHBrowseForFolder()の事か?
この腐女子め!
803デフォルトの名無しさん:2006/04/05(水) 12:44:21
app.pathは実行ファイルのパス

ショートカットの作業フォルダ等で、
起動時のカレントが変更されたりする可能性はあるだろ。
804デフォルトの名無しさん:2006/04/05(水) 12:57:01
>>803
そういうことか
ご指摘どうもありがとう。
EXEのパスがほしかっただけなので。

皆さんいろいろありがとうございました。

805デフォルトの名無しさん:2006/04/05(水) 14:06:24
>>802
表示デキター、サンクソ
しかし寒いギャグは頂けないな
806デフォルトの名無しさん:2006/04/05(水) 17:30:24
音をミュートにするAPI又は方法はありませんか?
検索しても出てこなかったので
807デフォルトの名無しさん:2006/04/05(水) 17:38:20
808デフォルトの名無しさん:2006/04/05(水) 17:44:55
ありがと、その辺探してみる
809デフォルトの名無しさん:2006/04/05(水) 22:33:32
質問があります。

Win32API@VC++2005でMP3プレイヤーを作ろうとしています。
でも、どうにも再生できないので、知恵を拝借願いたく。

mciSendStringを利用し、以下のようなプログラムを書きました。

if(!mciSendString("open \"test.mp3\" type mpegvideo alias MP3", NULL, 0, NULL)){ // ファイルを開く
 mciSendString("play MP3 notify", NULL, 0, hWnd); // MP3の再生
}

とりあえずDebugでビルドしてるので、プロジェクトのDebugフォルダに
test.mp3を置いてビルドしてるんですが、
ifの中にブレイクポイント仕掛けてもそこに到達すらしてないようです。

なんとかMP3を再生する方法を教えてください。お願いします。
810デフォルトの名無しさん:2006/04/05(水) 22:47:50
>>809
まずはtest.mp3をフルパスで指定してみたら?
811デフォルトの名無しさん:2006/04/05(水) 22:50:19
>>809
まず問題が起きたら原因を探れ。原因が分からないと対処できないからな。
で、これを踏まえて
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mcisendstring.asp
を見ると
>Returns zero if successful or an error otherwise.
>To retrieve a text description of mciSendString return values, pass the return value to the mciGetErrorString function.
と書いてある。
何をすればいいか分かるな?
812デフォルトの名無しさん:2006/04/05(水) 22:54:57
>>809
環境が分らんからアレだがVCはデバッグ時のカレントディレクトリがDebugフォルダではない。
813デフォルトの名無しさん:2006/04/05(水) 23:38:57
>>809
せっかくだからIGraphBuilder使おうよ
814デフォルトの名無しさん:2006/04/06(木) 00:15:28
>>809の人気に嫉妬

ちなみにtype mpegvideoがなくても拡張子で判断してくれたりする。
815デフォルトの名無しさん:2006/04/06(木) 06:40:58
RenderFileが簡単でマジオススメ
816743:2006/04/06(木) 19:12:15
>>780
遅くなりましたが、レスありがとうございました
おかげで解決できました
817デフォルトの名無しさん:2006/04/06(木) 23:25:34
エクスプローラバー(グーグルツールバーみたいなやつ)自作して
ひととおり動作しました。
で、IEではなく、エクスプローラで動かしたところIWebBrowser.Documentは
IHTMLDocument2をもたないようです。
このときはどのようなインターフェースをもつオブジェクトが入ってきますか?
または調べる方法、ドキュメントはないですか?
818779:2006/04/07(金) 00:50:15
>781さん
>788さん
試してみたところ、どちらの方法でも大丈夫そうです。
WM_CANCELMODEを使うのが本来の方法みたいですね。

どうもありがとうございました。m(_ _ )m
819デフォルトの名無しさん:2006/04/07(金) 06:42:06
IShellViewとかじゃね
820デフォルトの名無しさん:2006/04/07(金) 07:01:05
後この辺のインターフェースを片っ端から要求してみるとか
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/interfaces.asp
821デフォルトの名無しさん:2006/04/07(金) 14:57:15
ツールチップをエディットボックスやチェックボックスに設定するにはどうしたら良いでしょうか!?
ラベル上ならちゃんと表示されるのですが…
822デフォルトの名無しさん:2006/04/07(金) 17:22:13
アプリケーションの関連付けについて教えて下さい ○<\_

特定拡張子のファイルにあらかじめアプリケーションを関連付けておいて、
ファイルをダブルクリックする事でアプリケーションを起動する場合、
呼び出されるアプリケーション側ではファイル名をどのように取得すれば
良いのでしょうか?
823デフォルトの名無しさん:2006/04/07(金) 17:29:33
>>822
コマンドライン引数
(w)WinMainの3番目の引数や(w)mainならargc。

WinAPIの関数を使いたければGetCommandLine。
その際にはPathGetArgsが使えるかもしれない。
824デフォルトの名無しさん:2006/04/07(金) 17:42:45
他のウインドウのイメージを取得したいのですが、手前で作成したDCを添えて、
WM_PAINTメッセージをターゲットのアプリケーションウインドウに送っているのですが、
全く何も取得できません。

PowerToysのAlt+Tab Replace等では、ウインドウの画像を取得して表示していますが、
どうするとこのように取得できるのでしょうか。

どうぞ宜しくお願いします。
825デフォルトの名無しさん:2006/04/07(金) 17:51:10
boot.iniの/3GBとVC.netの/LARGEADDRESSAWAREオプションを使っても
7c800000にkernel.dllが配置されるんだけど、
/LARGEADDRESSAWAREは2GB以上のメモリ空間を使えるというだけで
連続したのは無理ってことですか?
826822:2006/04/07(金) 18:00:37
>823
取得できました、マリガトウゴザイマス
827デフォルトの名無しさん:2006/04/07(金) 18:24:21
>>824
GDIオブジェクトはプロセス跨げなかったと思う。
あとWM_PAINTはシステムが送るメッセージなので、ユーザーが勝手に送ってはダメ。
フックで目的のプロセスに忍び込んで、WM_PRINT(WM_PAINTじゃないよ)送ればいいんじゃない?
828デフォルトの名無しさん:2006/04/07(金) 18:31:22
>>825
一応訊くけどWindowsのバージョンは?
829デフォルトの名無しさん:2006/04/07(金) 19:14:39
830825:2006/04/07(金) 20:56:59
>>828
XP Homeです。

>>829
ありがとうございます。無理みたいですね、諦めます。
831デフォルトの名無しさん:2006/04/07(金) 21:57:26
http://support.microsoft.com/default.aspx?scid=kb;ja;328882
重要 : /3GB スイッチは、次のオペレーティング システムでのみ使用してください。
.Microsoft Windows Server 2003 Datacenter Edition
.Microsoft Windows Server 2003 Enterprise Edition
.Microsoft Windows 2000 Advanced Server
.Microsoft Windows 2000 Datacenter Server
.Microsoft Windows NT 4.0 Enterprise Server
832デフォルトの名無しさん:2006/04/07(金) 22:29:39
>>824
死ぬほど強引な手法だが。
ttp://slashdot.jp/comments.pl?sid=147813&cid=470365
833デフォルトの名無しさん:2006/04/08(土) 00:04:21
>>831

その情報は古い。
834デフォルトの名無しさん:2006/04/08(土) 00:06:47
XP Homeで/3GBが効かないのは変わらないけど。
835デフォルトの名無しさん:2006/04/08(土) 03:11:53
IEでTABキーを押してコントロール(ボタン)に標準をあわせ、Enterを押してボタンを押すということ
(例えば、http://www.google.co.jpを開いていたとすれば、TABキーを押して「Google 検索」に
フォーカスを当て、Enterを押して検索といったこと)をアプリケーション側から自動で行いたくて、
HWND ie = FindWindow("IEFrame", 0);
SendMessage(ie, WM_KEYDOWN, VK_TAB, 0);
SendMessage(ie, WM_KEYDOWN, VK_RETURN, 0);
というようなコードを書いたのですが、うまく動作しませんでした。
何か良い方法はありませんでしょうか?
836デフォルトの名無しさん:2006/04/08(土) 03:53:30
>>835
SendMessageではなく、PostMessageを使う。
837デフォルトの名無しさん:2006/04/08(土) 04:49:38
>>835
SendInputを使う。
838デフォルトの名無しさん:2006/04/08(土) 05:26:18
>>837さんの方法で出来ました
ありがとうございました!
839デフォルトの名無しさん:2006/04/08(土) 07:16:28
一般に、リストビューコントロールのカラムの数ってどうやると得られるんでしょうか? アイテムの数はLVM_GETITEMCOUNTで得られるわけですが・・・
840デフォルトの名無しさん:2006/04/08(土) 07:53:51
>>839
Header_GetItemCount(ListView_GetHeader(hList));
はどうだろうか。
841デフォルトの名無しさん:2006/04/08(土) 11:10:14
WIN32アプリケーションで、IEなどブラウザの表示をさせたいのですが、
WIN32APIでそれを実現する手段ありますでしょうか?
出来ればクッキーを渡したり、ポストをしたいのですが。
842デフォルトの名無しさん:2006/04/08(土) 11:12:42
簡単に荒らしツールが作れてしまうね
843デフォルトの名無しさん:2006/04/08(土) 11:41:11
競馬の投票プログラムを作りたいなと思っておりまして・・・。
最後のパスワードの入力などはブラウザに任せたいと思っているのですが・・・。
844デフォルトの名無しさん:2006/04/08(土) 12:31:17
>>841
CreateProcess辺りじゃないかと
845デフォルトの名無しさん:2006/04/08(土) 13:21:25
質問です。
SelectObjectが失敗する状況ってどんな感じですか?

LoadImageでよみこんだやつで、GetObjectでの情報取得は成功していて読み込み失敗ではないとおもいます。
SelectするHDCもGetDCでウインドウのDCを取得後CreateCompatibleDCしています。
なにか、心当たりありませんか?
846デフォルトの名無しさん:2006/04/08(土) 13:43:59
>An application cannot select a bitmap into more than one DC at a time.
847デフォルトの名無しさん:2006/04/08(土) 13:59:16
>>846
レスThx。
一度に2つ以上のBitmapをセレクトできないよー。
って感じですか??(エキサイト翻訳使ったんですけどね・・・。

関連付けにSelectObject使わない方法は無いし。
Sleepいれろとかそういう意味ではないと思うんだけど・・・。

あ!それとも、2つのDCにひとつのBitmapをSelectできないよー。ってことですかね。
そういえば後者には心当たりが。。。
ちょっといじってみます。
848847:2006/04/08(土) 14:06:03
えーっと。できました。
うーん。こんな仕様だとは思わなかった。
それはそれとして、助かりました。Thx!!
849デフォルトの名無しさん:2006/04/08(土) 23:03:02
エクスプローラのツールバーの更新とかのボタンを押したときって
どんなメッセージがいってるんでしょうか?
spy++でツールバーみてもそれらしいのが見当たらないんですが
850デフォルトの名無しさん:2006/04/08(土) 23:04:26
そらツールバーみたって分からんわな
851デフォルトの名無しさん:2006/04/08(土) 23:13:22
あは、ウインドウをターゲットにしてツールバー関係を見てたということです。
それでも間違ってるかもしれないけど
852デフォルトの名無しさん:2006/04/08(土) 23:18:26
とりあえずマウスのメッセージ
853デフォルトの名無しさん:2006/04/09(日) 00:41:14
指定プロセスのタブ(ボタン?)をプロセス自体は終了せずにタスクバーから消すAPIありますか?
ウィンドウ最小化とのコンボでちょっと上手くやってみたい
854デフォルトの名無しさん:2006/04/09(日) 03:47:05
なにやりたいのかわからないけど、
ShowWindow(SW_HIDE)でいいんじゃない?
855デフォルトの名無しさん:2006/04/09(日) 10:50:16
ありがとう
ウィンドウハンドルはリストで保持しておいて後で戻せば大丈夫そうだね
856デフォルトの名無しさん:2006/04/09(日) 11:46:43
ごめんもう一つ質問
プロセスIDや実行ファイル名が分かっていて、そこからウィンドウハンドルを出すにはどうすればいい?
EnumWindows()とかEnumThreadWindows()、GetWindowThreadProcessId()辺りを探してみたけどそれぞれ使う引数がバラバラでわけわかめ
ウィンドウハンドル取得にはスレッドIDが必要だし(EnumThreadWindows())、
スレッドID取得するにはウィンドウハンドルが必要(GetWindowThreadProcessId())
857デフォルトの名無しさん:2006/04/09(日) 11:57:33
現在実行中のプロセスの数を取得するにはどうすればいいでしょう?
858デフォルトの名無しさん:2006/04/09(日) 12:43:55
//プロセス一覧取得
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))==INVALID_HANDLE_VALUE)
 return;

//プロセス情報格納構造体初期化
PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);

//プロセスリストの最初のポインタを取得し、ループごとに次のアイテムに移動
for(BOOL bResult = Process32First(hSnap, &pe); bResult; bResult = Process32Next(hSnap, &pe))
 count++;

CloseHandle(hSnap);

一応検索してみたけど無かったから自分の使ってる走査を弄ってみた
ちゃんとできるかどうかは分からない
859デフォルトの名無しさん:2006/04/09(日) 12:46:58
>>856
Googleに聞け。
860デフォルトの名無しさん:2006/04/09(日) 12:54:43
>>859
小一時間ほどお聞きした後の質問だから許して
861デフォルトの名無しさん:2006/04/09(日) 13:05:59
>>860
だが断る
862デフォルトの名無しさん:2006/04/09(日) 13:49:03
>>860
許さん
NHK杯の記録係は許さん
863デフォルトの名無しさん:2006/04/09(日) 14:19:24
>>858
できました。ありがとうございました。
864デフォルトの名無しさん:2006/04/09(日) 17:22:20
猫でも〜を見つつ、ウィンドウにBMPを表示させようとしているのですが、
200*200の24ビットカラーBMP(ペイントで作成)を表示することができません。
SetDIBitsToDeviceを使ってやってみようとしているのですが、
表示させようとしているエリアが真っ黒になります。

真っ黒になるということはどういうミスが考えられるでしょうか?
アドバイスお願いします。
865デフォルトの名無しさん:2006/04/09(日) 17:30:08
>>864
いろいろありすぎて書ききれない。
866デフォルトの名無しさん:2006/04/09(日) 17:34:19
とりあえずまともに動くサンプルを見つけてそれを参考にする。
動かないサンプルを参考にしてもしょうがないだろ
867デフォルトの名無しさん:2006/04/09(日) 17:58:38
>>856
EnumWindowsで全てのウィンドウハンドルを列挙することができる。
それぞれをGetWindowThreadProcessIdに渡して得られたIDと
自分が知っているIDとが一致するウィンドウだけを記録しておけば、いいのでは?

もっと単純な方法を俺は知らない。
868デフォルトの名無しさん:2006/04/09(日) 18:17:04
スタートボタンを押したときに出てくるスタートメニューのウインドウハンドルって
取り方ありますか?
ウインドウタイトルは無いようなんですが。
869デフォルトの名無しさん:2006/04/09(日) 18:19:47
>>856
ウィンドウハンドルを取得するのにスレッドIDが必要なわけでも、
スレッドIDを取得するのにウィンドウハンドルが必要なわけでもない。
ウィンドウハンドルもスレッドIDも取得する方法は沢山ある。

単にそれらが、ウィンドウハンドルからスレッドIDを取得するAPIと、
スレッドIDからウィンドウハンドルを取得するAPIなだけ。
870デフォルトの名無しさん:2006/04/09(日) 18:28:07
だが決して具体的な名は挙げない。
871デフォルトの名無しさん:2006/04/09(日) 19:05:56
>>864
1.COLORONCOLOR などのモードの設定がない
2.bmp_info が正しくない
3.bitmap データが真っ黒
StretchDIBits() などでも描けるが、心配なら前もって hdc を FillRect() で
背景色、例えば白で塗りつぶしておく。
左上座標、画面の縦横、絵の縦横は間違ってないという前提。
猫のどの章を見ているか言えばもっと話が早いかも。粂井さんの palette の設定
のとこは間違ってたと思うが、直っているかな。今回 BPP24で関係ないが。
872デフォルトの名無しさん:2006/04/09(日) 19:49:28
>>865
説明が足らなくてすみませぬ。

>>866
その通りだねってことで別のサンプルで試してみたら出来ました。
ありがとん。

>>871
170章見てて出来ず、172章でやってみたら出来ました。
(ただし、24ビットカラーなら出来るけれども、他のだとパレット設定が失敗してしまいますね。
まだ直ってないのかもしれませんね。)
ちゃんと原因を理解していないので、挙げてくれたのを検証してみます。

御三方、レスありがとうでした。
873デフォルトの名無しさん:2006/04/09(日) 20:30:06
DLLの関数をLoadLibraryで呼び出そうとしているのですが、
実行時に上手く動作せず、困っています。
どんな状態かというとビルド自体は特に問題なく出来ているのですが、
関数をポインタ経由で呼び出した後に戻ってくる値がおかしいといった感じです。
関係のありそうな部分を適当に抜き出してみるとこんな感じに書いてあります。

if((hInstDLL=LoadLibrary("Advapi32.dll"))==NULL)
MessageBox(NULL, "「Advapi32.dll」のロードに失敗しました。", "エラー", MB_OK);

typedef LONG (APIENTRY *TFUNC)(HKEY,LPCSTR,DWORD,REGSAM,PHKEY);
TFUNC DllFunction;
DllFunction=(TFUNC)GetProcAddress(hInstDLL,"RegOpenKeyExA");

if(DllFunction==NULL)
MessageBox(NULL, "関数のアドレスの取得に失敗しました。", "エラー", MB_OK);

int ref = DllFunction(hKey,pSubKey,ulOptions,samDesired,phkResult);

実際のソースでは RegCloseKey, FreeLibrary とかはちゃんとしています。
実行したときは戻り値は「ERROR_SUCCESS」、
だけれども「phkResult」の値はNULLではないものの不正な値になっています。
MessageBoxのエラーは特に表示されていません。
どこに問題があるのか、わかる方がいたらお教えいただけませんでしょうか?
よろしくお願いします、長文失礼しました。
874873:2006/04/09(日) 20:35:59
補足です、なぜこんな紛らわしい事をしていることかというと
既存のアプリケーション(バイナリの)動作を替えたかったからです。
875デフォルトの名無しさん:2006/04/09(日) 21:17:19
カレントディレクトリを確認したか? パスは確認したか?
876873:2006/04/09(日) 22:13:08
>>875
一応ダイアログを表示してみたりとか、そのほかでテストをしてみたので
ロードするDLLに間違いは無いんじゃないかと思います。
877デフォルトの名無しさん:2006/04/10(月) 00:14:58
>「phkResult」の値はNULLではないものの不正な値になっています。

不正な値とは?
どうやって判断したの?
878873:2006/04/10(月) 00:30:58
>>877
sprintf(test, "%X,%s,%X,%X,%X",hKey,pSubKey,ulOptions,samDesired,*phkResult);
と言うような表示をしてみた時に実行する前には
「80000001,Software\test\test,0,F003F,CCCCCCCC」
実行した後には「0xD8」となっていたからです。
「80000001,Software\test\test,0,F003F,D8」
ハンドルでこの値はおかしいのでないかなと思ったからです。
879デフォルトの名無しさん:2006/04/10(月) 00:50:12
>>878
じゃあ、どんな値なら正しいのさ?
880873:2006/04/10(月) 00:59:50
>>879
0x400000(実行モジュール領域?)以上なら普通に使っていて
あり得る値だと勝手に思っていたのですが…
881デフォルトの名無しさん:2006/04/10(月) 01:04:56
思い込みでプログラム作るんじゃねえ
882856:2006/04/10(月) 01:09:26
>>867
exe名をテキストから読み込み→プロセス一覧から一致するexeを検索、プロセスIDを取得
としてるのでそれだとプロセス一覧を2回まわすことになるから速度面で少し不安
情報後出しスマソ

>>869
くぁしく
いや一応Google先生にお聞きしてくるけど
883873:2006/04/10(月) 01:10:47
>>881
申し訳ないです。
思いつく限りは試してみましたが、何が原因で実行出来ないのでしょうか?
そろそろ寝ないと仕事がつらいので今日は落ちます。
明日、必ず返信します。
884デフォルトの名無しさん:2006/04/10(月) 01:16:16
>>883
実行出来ないって何が?
DllFunctionはERROR_SUCCESSを返しているんだろ?
ERROR_SUCCESSを返している以上ハンドル値は格納されている。
で、実際にCCCCCCCCからD8になったと>>878で言ってるじゃないか。
885873:2006/04/10(月) 01:19:57
>>884
エラーで強制終了されてしまいます。
エラー内容は"0x00551522"の命令が"0x000000D8"のメモリを参照しました。メモリが"read"になることはできませんでした。
と言った感じです。
886873:2006/04/10(月) 01:21:51
言葉不足でした。
返ってきたハンドルの「0x000000D8」を使おうとすると
エラーが起きると言ったところです。
887デフォルトの名無しさん:2006/04/10(月) 01:24:22
>>886
エラーが起こってるところのコードも晒した方がいいんじゃねえかな?
888デフォルトの名無しさん:2006/04/10(月) 01:44:56
ハンドルとポインタを混同している悪寒。
889デフォルトの名無しさん:2006/04/10(月) 02:18:15
RegOpenKeyEx() の最後の引数に渡しているポインタがあやしい
phkResultってどこを指してるんだろうね?
890デフォルトの名無しさん:2006/04/10(月) 07:01:30
ハンドルをポインタとして読み書きしているね絶対
891デフォルトの名無しさん:2006/04/10(月) 09:46:07
お手上げ。

我が家でも、
80000001,Software\test\test,0,F003F,0 //←できれば初期化する癖
80000001,Software\test\test,0,F003F,7B4

DLLの動的ロードを使わずに、普通にRegOpenKeyExを呼び出したら、
80000001,Software\test\test,0,F003F,7B0

この7B4や7B0のハンドル使って、RegSaveKeyしてみたら、
空のファイルしか出力されなかった。
892デフォルトの名無しさん:2006/04/10(月) 09:51:52
PHKEY phkResult;

とだけして、phkResultが指す先を用意していない悪寒。
893デフォルトの名無しさん:2006/04/10(月) 09:56:37
>>892
それだとRegOpenKeyEx呼び出した時点でアウツじゃね?
894デフォルトの名無しさん:2006/04/10(月) 10:00:32
HKEY hkResult = NULL;
として &hkResult を渡してみ
895デフォルトの名無しさん:2006/04/10(月) 10:04:33
つーか問題の本質は RegOpenKeyEx 側じゃなくて、その後のハンドル利用コードの予感
896デフォルトの名無しさん:2006/04/10(月) 15:37:58
自分自身の実行ファイル名を取得するにはどうしたらいいんでしょうか。
実行ファイル名をハードコーディングできないプログラムなのです。
main()から始まるコンソールアプリなら、argv[0]からファイル名を取得できるのですが。
WinMain()から始まるプログラムの場合にどうしたらいいか分かりません。
897デフォルトの名無しさん:2006/04/10(月) 15:40:34
>>896
GetCommandLine()
898デフォルトの名無しさん:2006/04/10(月) 15:41:44
ただし、コマンドライン引数が含まれる。
899896:2006/04/10(月) 15:44:05
>>896の補足です。
ウインドウを持たないプログラムですので、
GetWindowModuleFileNameは使えないんです。

画面を一切出さないプログラムを作ろうとして、コンソールアプリを作ったら、
実行時にコンソール画面が出てしまったので、Win32 Applicationでウインドウなしの
プログラムとして作り直しました。
900デフォルトの名無しさん:2006/04/10(月) 15:45:02
GetModuleFileName()
901デフォルトの名無しさん:2006/04/10(月) 15:45:43
>>897
ありがとうございます!

WinMainの引数にはプログラム名が入ってなかったので
無理かと思ってました。
902デフォルトの名無しさん:2006/04/10(月) 15:50:47
>>900
ありがとうございます。
こっちの方がちょっと簡単ですね。
903873:2006/04/10(月) 22:18:22
>>887
結構長くなってしまうと思いますが良いでしょうか?
やっていることとしてはAPIのフックです。

>>888-895
確かにハンドルとポインタをごっちゃにして考えていました。
とりあえず一番の問題としてはエラーで強制終了されてしまうことです。
元々は正常に動作していたソースを書き換えていたので、
レジストリ関係の関数の取り扱いに特に問題は無いのではないかと思います。
現状だと「RegOpenKeyExA」の呼び出し以外には特に手を加えていません。

HKEY hkResult = NULL;
として「&hkResult」を渡してみましたが、やはり結果は強制終了でした。

904デフォルトの名無しさん:2006/04/11(火) 08:55:12
>>869
FindWindow()以外の関数きぼん
FireFoxだとGoogle - Mozilla Firefoxになるからウィンドウタイトルじゃ指定できないだす
905デフォルトの名無しさん:2006/04/11(火) 08:57:29
>>904
ウィンドウ・クラス名でも検索できるだろ
906デフォルトの名無しさん:2006/04/11(火) 09:46:21
>>905
ありがと、分かってきた。
クラス名の取得にはGetClassName()でウィンドウハンドルが必要
これは開始前にクラス名を取得して書き出しておくしかないのかな
907デフォルトの名無しさん:2006/04/11(火) 16:50:32
画面上の特定の範囲のスクリーンショットを撮るにはどうしたらいいですか?
908名無しさん@Linuxザウルス:2006/04/11(火) 17:11:40
>>907
GetDC(hwnd,0);
909デフォルトの名無しさん:2006/04/11(火) 17:20:03
>>908
それだと範囲内に複数のウィンドウが入っているときとか面倒じゃない?
910デフォルトの名無しさん:2006/04/11(火) 17:23:23
ウチのwinuser.hのGetDCには引数1つしかないんだが・・・
911デフォルトの名無しさん:2006/04/11(火) 17:26:08
>>907
GetDC(NULL)
912デフォルトの名無しさん:2006/04/11(火) 17:32:25
>>911
そんな手があったのか。
やってみる。
913デフォルトの名無しさん:2006/04/11(火) 22:56:18
質問です。
マウスジェスチャー的なものを作っているのですが、マウスフックした状態で
1)Explorerのウインドウ内で右ボタンを押す
2)マウスカーソルを移動してExplorerの範囲外に移動
3)右ボタンを離す
という操作をしたとき(ファイルを選択しない右ドラッグみたいな感じの操作)に、
3)のところでWM_RBUTTONUPが通知されません。
Spy++ではWM_RBUTTONUPが見えているので、どうにかすれば拾えるのはわかるのですが…

WM_RBUTTONUPでなくてもいいので、右マウスを離したことを検出する
方法を教えてください。
914デフォルトの名無しさん:2006/04/11(火) 23:09:52
>>913
マウスキャプチャしてる?
915デフォルトの名無しさん:2006/04/11(火) 23:40:00
>>914
できました!ありがとうございます。
猫は一通りやったんですが、このAPIは頭に入ってませんでした。
916デフォルトの名無しさん:2006/04/12(水) 03:30:22
ファイルハンドルを指定してリネームする関数ないですか?
changefilename(hFile, "c:\\foo.txt");
みたいなかんじで
917デフォルトの名無しさん:2006/04/12(水) 09:04:28
>>916
ハンドルがあると言うことは、ファイルを開いている事になる。
開いているファイルをリネーム出来るとでも?
918デフォルトの名無しさん:2006/04/12(水) 09:12:10
C標準でそういう関数あったな
919デフォルトの名無しさん:2006/04/12(水) 09:12:51
>>917
できないんですか? 随分仕様もないOSですね。
920デフォルトの名無しさん:2006/04/12(水) 09:40:17
>>919
うん、そーだね
921デフォルトの名無しさん:2006/04/12(水) 09:43:13
>>919
君が言うんならそーなのかもね
922デフォルトの名無しさん:2006/04/12(水) 13:19:56
imm32.dllの使い方に関して説明がある
日本語又は英語のサイトであって、
マイクロソフトMSDN以外のものをご存知でしたら、
どうか、どうか、教えてください。

(VC#ExpressPreview)
923デフォルトの名無しさん:2006/04/12(水) 13:21:33
>>917
開いててもリネームできるよ
(少なくともNT系はできる)
924デフォルトの名無しさん:2006/04/12(水) 13:23:48
.netを利用してワードを操作するアプリを作っております。
ワードの画面で、例えばCtrl+Rを押したときに、
ワードを操作するアプリ(wordobjectlibrary9.0)にその旨(Ctrl+Rが押下された)を
伝えることはできますでしょうか。
925924:2006/04/12(水) 13:26:34
付記
WndProcで、メッセージを監視するという方法もありますが、
これだと、ワード画面が非アクティブなときに
押下されたCtrl+Rも前述したアプリに拾われてしまうので、
この方法は避けたいと思っております。

もっとも、ワード画面が非アクティブになったという事実を
前述したアプリに送ることができれば、もう少し選択の幅が
広がるかも知れませんが。
926デフォルトの名無しさん:2006/04/12(水) 14:49:12
keybd_event?
927デフォルトの名無しさん:2006/04/12(水) 15:21:51
>>924
グロ−バルフックとかじゃだめ?

出来るかどうかさっぱりわからないけど、Wordのアドインとして
自プログラムを登録しておいて、キー押下とかコマンドとか
拾えないかな?
928924:2006/04/12(水) 15:30:08
>>927
ごめんなさい、さっきの文、間違えました。正しくは、

付記
「GlobalHotkey」で、メッセージを監視するという方法もありますが、
これだと、ワード画面が非アクティブなときに
押下されたCtrl+Rも前述したアプリに拾われてしまうので、
この方法は避けたいと思っております。

もっとも、ワード画面が非アクティブになったという事実を
前述したアプリに送ることができれば、もう少し選択の幅が
広がるかも知れませんが。




グローばるほっときーは、
半ば無差別にキーボードを監視するので、
ワード文書を操作しながら、平行して
オートキャドを操作する場合、不具合が生じてしまいまうのです。
929924:2006/04/12(水) 15:32:20
以前、WndProcを試してみたこともありましたが、
えっと確かじゃないですけど、
そのときは、
メッセージをワードに食われてしまう結果、
メッせーじを監視できなかったような気がします。

immGetContextのメッセージを監視しようとしても、
WndProcで監視してもメッせージが出てこなかったような・・

ところで、グローバルホットキーと、グローバルフックって
同じことをさすのですか?
930924:2006/04/12(水) 15:35:21
>出来るかどうかさっぱりわからないけど、Wordのアドインとして
>自プログラムを登録しておいて、キー押下とかコマンドとか
>拾えないかな?

それ、すごくいい!!(・∀・)
どうやるの・・・??
931924:2006/04/12(水) 15:37:01
ちなみに、現行ソフトは、
HonliangSoft.Utilities
を使用しております。
932デフォルトの名無しさん:2006/04/12(水) 15:45:00
そんなローカルな名前出されても困る。ついでに間違ってる。あとあれはホットキーじゃなくてグローバルフック。
GetForegroundWindow とか使えない? どうやって Word をホストしてるんか知らないけど。
933924:2006/04/12(水) 15:46:55
word文書においてCtrl+Rを押す。
すると、マクロAが起動する。
マクロAは、現在実行中のプログラム一覧を取得する。
当該プログラム一覧の中に、「myAppli.exe」というものがあるか
確認する。
もし「myappli」が2以上見つかったら、もしくは見つからなかったらreturn;
さもなくば、「myappli」に所定の処理をさせるようにメッせージを送る。
myappliは、何らかの方法でこのメッせージを受け取る。
myappliの変数wdAppli(Word.Applicationインスタンス)を介して、
ワード文書内に適宜の文字を追加する。WdTypeText(string str);

理想はこんな感じです
---------------
(a)現在実行中のプログラム一覧を取得 → VBAでやったことないから自信ないけど不可能ではなさそう。
(b)「myappli」に〜〜メッせージを送る。→送れるのか・・・
(c)myappliは、何らかの方法でこのメッせージを受け取る。→受け取れるのか・・・

この3点さえ解決すれば、OKです
934924:2006/04/12(水) 15:50:17
>>932
僕がグローバルホットキーを使う方法は、こんな感じです。
///<summary>ホットキーが押された時に発生します。</summary>
public event HotkeyReceivedEventHandler HotkeyReceived;
///<summary>WndProcをオーバーライドします。</summary>
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x312 && HotkeyReceived != null)
{
//LParamの上位ワードが仮想キーコード、下位ワードが修飾キー
Keys key = (Keys)((int)m.LParam >> 16);
Modifiers modifiers = (Modifiers)((int)m.LParam & 0xFFFF);
HotkeyReceived(this, new HotkeyReceivedEventArgs(key, modifiers));
}
base.WndProc(ref m);
}
935デフォルトの名無しさん:2006/04/12(水) 15:52:24
ぶっちゃけると、このスレの住人は.NET Frameworkなんて知らない
旧世代の人間だから、別のスレで聞いた方がいいと思うぞw

っていうか、そもそも.NET Frameworkはこのスレではないと思うが。
936デフォルトの名無しさん:2006/04/12(水) 15:52:39
>>933
その myAppli 内に COM オブジェクトを実装して(COMサーバ化して)、
word の マクロの中ではそれを CreateObject して myAppli と通信するってのが一般的。

ATL なら簡単にできる。MFC だとどうやるんだっけ・・。APIだけだとちょっと難しい。
937924:2006/04/12(水) 15:54:02
>どうやって Word をホストしてるんか知らないけど。

WordObjectLibrary9.0を使用しております。
http://support.microsoft.com/default.aspx?scid=kb;ja;316384

>GetForegroundWindow
>(a)現在実行中のプログラム一覧を取得 → VBAでやったことないから自信ないけど不可能ではなさそう。

ものすごく関連ありそうな、聞いたことあります。
現在実行中のプログラムをゲットする関数でしたっけ・・・それ
VBAでもimportdllとかすれば使えそうな・・・えっと、
938924:2006/04/12(水) 15:56:16
>>932様
>>936様

孤独感から解放された気がしました。
939924:2006/04/12(水) 15:59:11
>>932
getforegroundwindowは、
「120.現在操作中のウインドウのハンドルを取得する 」
というものですね。http://homepage1.nifty.com/MADIA/vb/API/GetForegroundWindow.htm

しかし、myappliは、ワード文書を作成中(即ち、Ctrl+Rを押下する時点)では、
非アクティブとなっております。
940デフォルトの名無しさん:2006/04/12(水) 16:06:10
>>939
> しかし、myappliは、ワード文書を作成中(即ち、Ctrl+Rを押下する時点)では、
> 非アクティブとなっております。
逆。myAppliがグローバルフック仕掛けてC-r押されたときにWordがアクティブか判断する。
がホストしてるWordのウィンドウハンドルを手に入れるのは無理な気がする。
モジュール名の取得とかで行けないこともないか?

>>933で良いのならそれで良さそうだが。
SendMessage WndProc
941924:2006/04/12(水) 16:09:11
>>932
>>936

ATL
http://www.codeproject.com/atl/
ATL+Office2003+VC++
http://www.codeproject.com/atl/outlook2k3addin.asp
ATL+Word
http://www.shoeisha.com/book/hp/pc/office/Word/files/index-first-wa.html

他に、船出のお祝いとして、何か紹介いただけないでしょうか。
942924:2006/04/12(水) 16:15:31
>>940
>逆。myAppliがグローバルフック仕掛けてC-r押されたときにWordがアクティブか判断する。
なるほど、よく理解できます。
これだったら、ワード文書の作成と並行して起動されているイラストレータ
をいじってるときに、イラストレータのショートカットであるCtrl+Rを
押しても、ワードがアクティブじゃなければ、WndProcプロシージャの中では
何もしなければいいんですものね。

でも、でも、ワード文書で日本語を入力しているときであって、
入力されている文字がまだ未確定の場合はどうなるでしょうか。
ワード文書はアクティブですが、文字が未確定(変換中を示す。)のときに、
myAppliがワード文書内に所定の文字を追加するようWdTypeText(String str)
を実行してしまうと、ワードばぐるんですよ
(この問題が発生しているので、私は他の手法を考えていたところだったのです)
943デフォルトの名無しさん:2006/04/12(水) 17:04:14
ちょっと本題から外れてしまうけど、ウチのWordで
ctrl+R押すと右揃えになるんだわ。参考までに。

あと、さっきも書いたけどアドインでメニュー項目を追加できると
思うので、ctrl+[何か]からメニュー項目起動で、自分の
コードを実行できそうな気がするんだけど、よくわからん…。

Word アドイン
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deovrwordaddins.asp

参考までに:アドイン、テンプレート、ウィザード、およびライブラリ
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deovraddinstemplateswizardslibraries.asp
944924:2006/04/12(水) 17:17:18
>>943
どうもありがとう!

>ctrl+R押すと右揃えになるんだわ。参考までに。
デフォルトでは仰るとおりです。
945デフォルトの名無しさん:2006/04/12(水) 18:35:51
実行プログラムを開くとメールで開いたことを伝えるプログラム組みたいんだけど何方かわかる人いますか?
946デフォルトの名無しさん:2006/04/12(水) 18:40:15
socket使ってSMTP送ればいいじゃん
947デフォルトの名無しさん:2006/04/12(水) 18:44:55
http://www.kumei.ne.jp/c_lang/sdk3/sdk_228.htm
これなんですが自分の力量じゃ組めませんでした。
948デフォルトの名無しさん:2006/04/12(水) 18:50:02
まんまのコードが載ってるのに技量も糞も無いだろ
949デフォルトの名無しさん:2006/04/12(水) 18:51:22
カット&ペーストの技量が今ひとつなんだろう
950デフォルトの名無しさん:2006/04/12(水) 19:01:54
とゆうかよりにもよって猫かよ
951デフォルトの名無しさん:2006/04/12(水) 20:14:28
>>945
ウイルスでも組む気か?
952デフォルトの名無しさん:2006/04/12(水) 20:17:46
>>945
MessageBox( NULL, "[email protected]に、開いたことをメールで通知して下さい。", "お願い", MB_OK );
953デフォルトの名無しさん:2006/04/12(水) 21:10:52
>>945
プロセス列挙かスナップショットでポーリング。
見つかったらCDOで送る。

ポーリングの間をすりぬけるケースを拾いたければ、、、知らん
954デフォルトの名無しさん:2006/04/12(水) 21:25:14
>>953
CreateProcessをフックすればいいんじゃない?
955デフォルトの名無しさん:2006/04/12(水) 22:11:52
WH_GETMESSAGEでメッセージフックしてるんですが、しばらく動かしてると
時々フックが外れて何も通知されなくなってしまいます。
このときマウス等の他のフックは動いているようです。

いろいろ探していてExplorer.exeが再起動したときなんかはフックが外れる
ようなことをどこかで見たのですが、対処方法まではわかりませんでした。
フックが外れたことを検出する方法と、その際の復旧方法について教えてください。
956デフォルトの名無しさん:2006/04/12(水) 22:18:05
>>955
さあ、さっぱりわからんけど、explorer.exeの再起動を
検知する姑息な方法として思いついたのは、
・PIDを覚えておいて定期的にチェック
・タスクトレイ常駐アプリはexplorer.exeの再起動を
 教えてもらえると思うので、それを利用
957デフォルトの名無しさん:2006/04/12(水) 22:40:34
PIDってProcessIDか
なんかピッドとかいうハンドルみたいなものがあると思ってた
958デフォルトの名無しさん:2006/04/12(水) 23:00:22
>>955
シェルが再起動した場合は、RegisterWindowMessage("TaskbarCreated") のメッセージが来る
959デフォルトの名無しさん:2006/04/12(水) 23:07:18
TaskbarCreatedって定数式じゃないからcaseに出来ないのが微妙に腹立つんだよな
960は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/04/12(水) 23:36:19 BE:161396148-
>>1
>日本語版MSDN Online Libraryは不完全です
ってあるけど、本当だね。
FindFirstFileで英語版だとルートディレクトリも工夫次第で検索できることになっているのに
日本語版だと検索できないとしか書いてないという。
961デフォルトの名無しさん:2006/04/12(水) 23:52:27
962デフォルトの名無しさん:2006/04/13(木) 07:06:44
>>959
ものすごい勘違いしている気がする・・・
963デフォルトの名無しさん:2006/04/13(木) 07:45:43
>>962
よくわからんが
RegisterWindowMessage() … つか、関数の戻り値を case ラベルに利用する方法を教えてくれ。
964デフォルトの名無しさん:2006/04/13(木) 08:11:00
基本的にメッセージハンドラへの分岐に switch - case なんぞ使ってねえし
965デフォルトの名無しさん:2006/04/13(木) 09:00:03
フレームワークを使わないSDKオンリーのサンプルは
switch-case使ってるのがほとんどだけどね。
966デフォルトの名無しさん:2006/04/13(木) 09:14:39
空気読めよ
967デフォルトの名無しさん:2006/04/13(木) 13:48:18
これから勉強しようとしている者です。
Win32API作成するのに一番主流なのはMFCですか?
968デフォルトの名無しさん:2006/04/13(木) 13:51:53
Win32API を作るのは Microsoft しかできないと思うが。
969デフォルトの名無しさん:2006/04/13(木) 13:59:50
キーボードからの物理的なキーストロークは受け付けるけど、
SendInput でキーストローク送っても受け付けないウィンドウがあるんですが、
受け付けさせるのに何か良い方法ありませんでしょうか?
970デフォルトの名無しさん:2006/04/13(木) 14:00:04
MFCなんていらん
実力付けたきゃ全部自分で書け
971デフォルトの名無しさん:2006/04/13(木) 14:00:08
VBです。
972デフォルトの名無しさん:2006/04/13(木) 14:01:58
SetKeyStateみたいなの無い?
キーの入力状態を設定する関数
973デフォルトの名無しさん:2006/04/13(木) 14:02:56
SendKeyでUp/Downとか送っとけ
974デフォルトの名無しさん:2006/04/13(木) 14:15:27
KFCウマー(゚д゚)
975デフォルトの名無しさん:2006/04/13(木) 14:22:44
>>968
Win32APIアプリの間違いです。
976デフォルトの名無しさん:2006/04/13(木) 14:47:46
>>975
>>986なんて相手にするなよw

意地悪かバカかのどっちかだ。どっちにしてもかまってロクなことはないw
まあリアルで友達いないんだろうな。ここでかまってあげる優しさもありか( ´艸`)
977デフォルトの名無しさん:2006/04/13(木) 14:47:49
MFCは馬鹿には扱えないから
978デフォルトの名無しさん:2006/04/13(木) 14:50:15
馬鹿しか使わないの間違いだろwww
979デフォルトの名無しさん:2006/04/13(木) 15:01:27
馬鹿は「***を使う奴は〜」と言いたがる。
980デフォルトの名無しさん:2006/04/13(木) 15:37:33
とりあえず >>986 の出方に期待してみよう。
981972:2006/04/13(木) 15:51:24
>>972
C++使ってるからむりぽ
Ctrl+Alt+Delに似たことをやりたいんだけど、何か無い?
982デフォルトの名無しさん:2006/04/13(木) 16:32:28
>>962
ハァ?バカは氏ね
983は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/04/13(木) 19:17:11 BE:90786029-
>>961
VB6についてきたVS6版のMSDN
984デフォルトの名無しさん:2006/04/13(木) 19:46:04
VB6って8年ぐらい前じゃないか?
985デフォルトの名無しさん:2006/04/13(木) 21:36:53
>>981
やりたいことがわからんから多分外してるが
LockWorkstation
986デフォルトの名無しさん:2006/04/13(木) 21:37:45
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist
CPUは32ビットですけど。どのプラットフォームSDKをダウンロードしたらい
すか?
たくさんありすぎてわかりません。
987デフォルトの名無しさん:2006/04/13(木) 21:39:36
>>986
x86じゃね?
988デフォルトの名無しさん:2006/04/13(木) 21:45:12
987さん
ありがとうございます。
Microsoft Platform SDK for Windows Server 2003 SP1
というやつをインストールしましたが、
これのどこをみたらAPIのヘッダファイルをみることができるか
教えてもらえないでしょうか?

989デフォルトの名無しさん:2006/04/13(木) 21:45:33
まて、32bit環境で64bitのEXEを作成する気かもしれないだろ!
990デフォルトの名無しさん:2006/04/13(木) 21:47:32
そうなのか?小出しh(ry
991デフォルトの名無しさん:2006/04/13(木) 23:38:38
プラットフォームSDKをインストールしましたが。 
どこさがしてもヘッダファイルが見つかりませんが?
どこをみたらいいのでしょうか?
992デフォルトの名無しさん:2006/04/13(木) 23:50:49
見ようとするな。
993デフォルトの名無しさん:2006/04/13(木) 23:51:41
もちろんインストールしたドライブを*.hで検索とかはしたんだろうな?
994デフォルトの名無しさん:2006/04/14(金) 00:03:22
 ありがとうございます。わかりました。
995デフォルトの名無しさん:2006/04/14(金) 00:42:25
定数をVB.NET用定義にするにはどうしたらよいのでしょうか?
具体的なやり方を教えてください。
996デフォルトの名無しさん:2006/04/14(金) 00:47:19
それがWIN32APIに関する質問だと思うなら、居座り続けるがよい。
997デフォルトの名無しさん:2006/04/14(金) 02:23:04
定数の定数名をエクスプローラーに掛けてみましたがヒットしません。
これはどういうことが考えられるのでしょうか?
998SOURCE ◆tAo.kQ2STk :2006/04/14(金) 02:59:26
>>995
constじゃなかったっけ?
999デフォルトの名無しさん:2006/04/14(金) 04:02:21
1000デフォルトの名無しさん:2006/04/14(金) 04:37:59

10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。