■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build41
1 名前:デフォルトの名無しさん :2006/03/03(金) 22:23:36
スレ立てるまでもない、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
-過去スレ
40 ttp://pc8.2ch.net/test/read.cgi/tech/1138893959/
39 ttp://pc8.2ch.net/test/read.cgi/tech/1136673250/
38 ttp://pc8.2ch.net/test/read.cgi/tech/1133798345/
37 ttp://pc8.2ch.net/test/read.cgi/tech/1131884991/
36 ttp://pc8.2ch.net/test/read.cgi/tech/1128951330/
35 ttp://pc8.2ch.net/test/read.cgi/tech/1125850096/
34 ttp://pc8.2ch.net/test/read.cgi/tech/1122723009/
33 ttp://pc8.2ch.net/test/read.cgi/tech/1120153520/

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
- MSDN Online
http://www.microsoft.com/japan/msdn/
- 猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
- Platform SDK Update
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
- Google
http://www.google.com/

- Windows® Server 2003 SP1 Platform SDK Full Download
http://www.microsoft.com/downloads/details.aspx?familyid=EBA0128F-A770-45F1-86F3-7AB010B398A3&displaylang=en
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

- Win32 API入門
http://wisdom.sakura.ne.jp/system/winapi/
- Win32 プログラミング入門
http://www7.plala.or.jp/keny01/windows/win32/

- 書籍
Advanced Windows
http://www.amazon.co.jp/exec/obidos/ASIN/4756138055

-おまけ
dat落ちしている過去スレが見れるかも。Build19が見たい人、余裕のある人は●でも買ってやってくれ。
http://makimo.to/cgi-bin/search/search.cgi?q=Win32API&andor=AND&sf=2&H=&view=table&shw=&D=tech


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;


30 名前:29 :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 ?
プログラム名.manifestだろ

55 名前:デフォルトの名無しさん :2006/03/05(日) 20:53:33
それとも自作のコントロールをビジュアルスタイルに対応させたいということか?

56 名前:デフォルトの名無しさん :2006/03/05(日) 20:55:31
>>52
マニフェストファイル ビジュアルスタイルでぐぐるといくつかでてくる。
ttp://www.h3.dion.ne.jp/~hanagex/dev/contents/xp/xpmenu.html
ttp://www.microsoft.com/japan/msdn/vs/client/vbtchUsingWindowsXPVisualStylesWithControlsOnWindowsForms.asp


57 名前:52 :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
アドレスは物理アドレスを示している訳じゃないんだから、
別のプロセスで読めなくて当然。

74 名前:69 :2006/03/07(火) 15:20:05
>71
レスどうもです。
>LPARAMで送ることができるのは、void*な値だけです。
>文字列を送ることはできません。
って事は、1文字ずつ小分けにして送らなくてはダメって事?


75 名前:69 :2006/03/07(火) 15:25:02
>72
>73
レスありがとうございます。
簡単にはいかないんですね。
プロセス間通信ついてですが、検索キーワードになりそうなヒント教えてくれませんでしょうか
よろしくお願いします。


76 名前:デフォルトの名無しさん :2006/03/07(火) 15:26:54
SetWindowTextでダミーウィンドウに送ってやれば?

77 名前:69 :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を知らないの?

80 名前:69 :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
標準コントロールじゃないって言うと、コモンコントロールとかか?
だったらそれぞれにメッセージやマクロが用意されとるよ

112 名前:106 :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だけで行う方法はありませんか?

121 名前:120 :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はその後まだコードが動いているようなんですが。
なんでそう思ったの?

132 名前:106 :2006/03/09(木) 21:03:13
>>113
>>114
レスありがとうございます。
あきらめることにします


133 名前:127 :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超初心者丸出しですわ)

138 名前:137 :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を対応させて管理しておけばいいんですね?

153 名前:138 :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
http://blogs.msdn.com/oldnewthing/archive/2003/08/21/54675.aspx
ここな。

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でググれ。

180 名前:174 :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
そんな貧乏くさいことを考えてはいかん
富豪になれ

186 名前:174 :2006/03/11(土) 21:14:04
>>182
それは分かっています。
>>183
実際計算して>>180のような疑問がおきました。

例えば、横4pixelの24bitフルカラー画像の場合、
4 * (( 4 * 24 + 31 ) / 32 ) = 15.875 [ Byte ]
これをint型の変数に代入しているので、
その変数には小数点以下が切り捨てられた15バイトが入ることになります。
これは4バイトの整数倍ではありません。

187 名前:174 :2006/03/11(土) 21:15:07
あ、すみません、12になりますね。
間違えました。

188 名前:174 :2006/03/11(土) 21:29:02
たしかに
4 * 整数
であれば4の倍数になるのですが、
どのような考え方でこの式が導かれるのか教えてください m(_ _)m

189 名前:174 :2006/03/11(土) 21:39:51
分かってきたのですが、どうも>>176の部分の理屈が解せません。
ですが、これは数学の問題になってくるので、別スレで聞いてみることにします。
ありがとうございました m(_ _)m

190 名前:174 :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

192 名前:174 :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
誰か暇なひと、一緒にデバッグしましょう。して下さい(__)


194 名前:1 :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はファイルポインタを進める。

196 名前:2 :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));
}


198 名前:4 :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;
}


199 名前:5 :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 ;
}

200 名前:6 :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;
}

201 名前:7 :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
名前に番号を書かないでくれ

210 名前:192 :2006/03/12(日) 01:15:38
>>195
ということは、ReadFile関数はchPixelBitがchar型であることを頼りにファイルポインタを
進めるということでよろしいでしょうか?
この場合、ビットマップファイルのピクセルビット部はchar型で認識されることが前提ですが。

211 名前:デフォルトの名無しさん :2006/03/12(日) 01:21:11
chPixelBitが何型だろうと、
bmpFileHeader.bfSize - bmpFileHeader.bfOffBitsバイト進めるだけだろ…

212 名前:192 :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
で、俺らに何をして欲しいんだ?

216 名前:192 :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);
ここでその続きからピクセルビットを読んでる

220 名前:192 :2006/03/12(日) 01:45:36
>>217
>>219
ああー!!分かりましたー!!
感動です!!
ありがとうございましたぁ!!

221 名前:デフォルトの名無しさん :2006/03/12(日) 01:49:51
>>218
>>203

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
とかで設定。

234 名前:231 :2006/03/12(日) 13:11:30
>>232
追加したものしか削除できない罠が・・・
>>233
調べてみます。

レスありがとうございます。

235 名前:224 :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) かな?

247 名前:245 :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;
}



■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.