トップページ⇒tech
981コメント336KB

Win32API 質問箱

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

Win32API以外の質問については >>2 を参照。
0002デフォルトの名無しさんNGNG
 すれ立てるまでもない質問はここで 第2刷
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=990082077
 VC++初心者質問スレ
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=984812029
 C++Builder相談室
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=969458279
 C言語なら、オレに聞け! <2>
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893
 なぜC++はあんなに難しいのか?
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=982758107
 C#相談室
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=977112364
 鬱だ氏のうDirectX
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=966655286
 Java相談室 Part2
  http://piza.2ch.net/test/read.cgi?bbs=tech&key=980858322
0003デフォルトの名無しさんNGNG
コンテキストメニューをWinZipみたいにオーナードローするにはどうやったらいいすか?
0004デフォルトの名無しさんNGNG
よくわかんねーけど、
http://piza.2ch.net/test/read.cgi?bbs=tech&key=973187725
こっちじゃできないの?
0005デフォルトの名無しさんNGNG
1は最近来たのか?>>4が正しいよな

しかしギコ猫の相談スレが、スレ立てるまでも…に駆逐された
例もあるし、はてさてどうなるかな。ま、頑張ってくれ
0006デフォルトの名無しさんNGNG
あっちは雰囲気がいやだからあえてこっちに書き込む(w

>>3
普通にHMENUでオーナードローできない?
0007デフォルトの名無しさんNGNG
クリップボードの変更ってどうやったらわかるの?
常駐秀丸とか。

まさか、タイマー使って監視してるんじゃないよね…。
0008デフォルトの名無しさんNGNG
>>7
SetClipboardViewer

>>4-5
あっちの576が書いてるように、こっちはWin「32」APIってことにしておけ(w
0009デフォルトの名無しさんNGNG
IE コンポーネントってどうやって使うんですか?
0010デフォルトの名無しさんNGNG
>>9
http://fukuoka.cool.ne.jp/manabu/tech/2_webbrowser1.htm
0011デフォルトの名無しさんNGNG
エクセルのようなソフトはどうやって作ればいいのですか?
マジレスを希望します
0012デフォルトの名無しさんNGNG
>>3
http://www.codeguru.com/shell/CascadingMenus.html
00133NGNG
>>12
先9です
0014デフォルトの名無しさんNGNG
>8
あれはどう見てもネタ
0015デフォルトの名無しさんNGNG
>>10
Win32API をきぼー
0016デフォルトの名無しさんNGNG
>>15
あれを参考にすればできると思うのだが…。
0017デフォルトの名無しさんNGNG
>>15
IWebBrowser2を使えばできる。
001817NGNG
VC持ってるなら、CWebBrowser2のソース見れば?汚いけど。
0019デフォルトの名無しさんNGNG
SendMessage関数のメッセージ(EM_UNDOとかあるけど・・)は、
どうやって仕様を知ることが出来るのですか?
誰か教えてください。お願いします。
0020デフォルトの名無しさんNGNG
とりあえず、http://msdn.microsoft.com 逝っとけ。
0021デフォルトの名無しさんNGNG
>>18
Windows95APIバイブルの2巻にいっぱい載ってる
002221NGNG
>>18じゃなくて>>19だ。
0023デフォルトの名無しさんNGNG
エクセルのようなソフトはどうやって作るんですか?
教えてください。
0024デフォルトの名無しさんNGNG
とりあえず向こうを使い切らないか?
http://piza.2ch.net/test/read.cgi?bbs=tech&key=973187725
0025デフォルトの名無しさんNGNG
他のプロセスのデフォルトヒープ領域の開始位置とサイズ、
拡張ヒープ領域の開始位置とサイズをすべて取得するのはどうやるの
自分の取得方法なら分厚いAPIマニアルに書いてあるけど相手のを
取る方法はどこにもない
0026デフォルトの名無しさんNGNG
>>25
ハッカー級でないと難しいかも。

そのプロセスに潜り込んで、中から調べればいいだけ。
漏れならそうする。

マジで外から調べようとするなら、
たぶん、Native API を使わなきゃダメ。
002725NGNG
DBxSTANDみたいなツールを作りたいんですけど・・・だめですかー
0028デフォルトの名無しさんNGNG
>>25
グローバルフックを仕込んで、DllMain の PROCCESS_ATTACH の
時に調べると良いのでは?
002926NGNG
>>28
他に Debug API を使うという手もある。
Guest 権限ではダメだが。
0030デフォルトの名無しさんNGNG
OwnerDraw の ComboBox では CB_SETCURSEL は機能しないのでしょうか?
リストの項目が必ず先頭から表示されてしまいます。
直前に選択した項目をリストメニュー中で反転表示したいだけなのですが…
0031デフォルトの名無しさんNGNG
とりあえず向こうを使い切らないか?
http://piza.2ch.net/test/read.cgi?bbs=tech&key=973187725
0032デフォルトの名無しさんNGNG
>>30
オーナードローの描画範囲矩形が渡されてない。。とか?
それだけではよくわかりません。
0033デフォルトの名無しさんNGNG
SetWindowsHookEx をラップするクラスを作ろうとして鬱になった。
コールバックにthisを渡す方法がない。無理だわ...
0034デフォルトの名無しさんNGNG
フックプロシージャは他プロセスから呼ばれることすらあるから根本的に
不可能と思われ
0035デフォルトの名無しさんNGNG
それって関係あるんだろうか?
コールバックで自分の処理が終わった後 postProc に委譲するでしょ?
これをどっから持ってくるかが問題なんだよなあ
グローバルな関数を動的に生成できないってのが癪だよ。
結局スタティック関数を抱えたクラス(のインスタンス)を動的に生成
することでしのいだが...
0036デフォルトの名無しさんNGNG
ファイルの移動を目的として、
MoveFile(SrcFile, DestFile);
を使ったのですが、この関数が必ず失敗してしまいます。

同じ動作をさせようと思い、
CopyFile(SrcFile, DestFile, FALSE);
DeleteFile(SrcFile);
としてみたところ、CopyFile()は成功しますが、DeleteFile()が失敗します。

これはどうしてなんでしょう。
どうか解決策を教えてください。
0037デフォルトの名無しさんNGNG
>36
削除したいファイルを別のアプリで開いたりしてない?
関数が失敗したあとにGetLastError()の返値を調べてみては。
003836NGNG
>37
GetLastError()で調べてみたところ、
「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」
ということでした。

でも、削除したいファイルを別のアプリで開くというようなことはしていません。
(削除したいファイルはドラッグ&ドロップで得る形になっていますが関係あるのでしょうか)
0039デフォルトの名無しさんNGNG
>>38
誰も使ってなければそのメッセージはでない。
ドラッグ含めて調べなおせ。
004036NGNG
ドラッグ&ドロップでなければ、目的のファイルに対するDeleteFile()ができるようです。
ドラッグって、他のプロセスがファイルを使ってることになるんですかね。
004136NGNG
誰か、教えてください〜〜〜〜〜〜〜〜〜
0042デフォルトの名無しさんNGNG
うぜえよ。
ちゃんとDragFinish()やってるか?
どうせやってないとかそんなことだろ?
0043デフォルトの名無しさんNGNG
他の窓下にある、キャプションの無い特定のアイテムのハンドルを得るには
どうしたら宜しいのでしょうか。
0044デフォルトの名無しさんNGNG
Win98上で試してみた。DragFinishやる前でも削除できる。
つか、普通に作ってれば削除できる。自分でハンドル開いてたり
とか、きっとそういうレベルだな。クソの予感
0045デフォルトの名無しさんNGNG
>>36
デバッグ中なんかで途中終了したときに、ファイルをつかみっ放しに
したりしてることもある。
ドラッグ自体は確かにデスクトップだかなんかのプロセス管理下だが
放せば終わり。そんだけ
0046デフォルトの名無しさんNGNG
>>43
Spy を使う
004736NGNG
DragFinishを使う場所の確認はいろいろやってみましたが、状況は特にかわりません。

>自分でハンドル開いてたりとか
んなことしてないよ。それくらいのことなら自分で気づくさー
0048デフォルトの名無しさんNGNG
>>43
FindWindow(親探し) -> EnumChildWindows(子列挙)
-> GetWindowLong/GetClassLong(ターゲット判定)
ではだめかい。
0049デフォルトの名無しさんNGNG
>>36
NTor2000で削除権が無い
005043NGNG
>>48 有り難う御座います〜
早速。。と言いたい所ですが、今ちょっと試せない(残リソースが無いw)ので、
後で試してみます。
005136NGNG
>49
たしかにWin2kなんですが、アドミニストレータでログインしてるんで削除権はあるんじゃないんかなぁ。
ほんとにいろいろ考えてもらってありがたいのですが、全然解決できない・・・

WM_DROPFILESを捕まえてDragQueryFile()でファイル名を得る。
そのファイル名に対しDeleteFile()、そしてDragFinish()。

と単純なことなんですが、ダメダメです。
0052デフォルトの名無しさんNGNG
>>36
リソース掴みは調べたの会。アイコンが表示されていると
掴まれて足りする。本気でやるなら、使用中プロセス置換か
稼動プロセス停止(ほとんどすべて止める)を考えないといけない。

使用中プロセス置換を考えるなら、各ドライブ毎に
テンポラリフォルダを用意し、そこに*ドライブをまたがないように*
削除したいファイルをMoveする。また、移動前には移動先チェックを
常にし、移動先のファイル名が既にある場合には他のファイル名に
移動先名を変えること。削除タイミングはマシン起動時か、次回AP
起動時の最初の方で削除を試みる。リブートをはさまないと失敗する
確率は高いからできればリブート後に削除すること。
ポイントは使用中でもドライブをまたがない移動、もしくは、リネーム
はできる、削除タイミングに注意かな。
もちろんこれでもwin386.swpとか署名付きドライバ(2000以降)など
できないものも当然あるが、普通のものなら大抵使用中でもできる。
0053デフォルトの名無しさんNGNG
>>51
>そのファイル名に対しDeleteFile()、そしてDragFinish()。
ガイシュツだけど、これは順序が逆では?
0054デフォルトの名無しさんNGNG
>>51
Administrator でログオンしてるんなら、
誰が捕まえてるか、さっさと調べりゃいいじゃん。

こういうの、使うとかsa。
http://www.sysinternals.com/ntw2k/freeware/handle.shtml



どうせ結果は…。
005536NGNG
たびたび申し訳ないです。

>53
順序入れ替えてもダメでした。

>54
試してみたら、自分自身がファイルのハンドル握っているようでした。
なんでhDropを解放したあとでもファイル操作がダメなんだろ・・・

ああ、俺ってバカだなー
0056デフォルトの名無しさんNGNG
ていうかファイル操作をシェルにやらせればいいんじゃないの?
SHFileOperationでさ。
005750NGNG
>>48
まだ実装し終わってませんが、とりあえず逝けそうです。
有り難うございました。
0058デフォルトの名無しさんNGNG
WM_DROPFILES 内のコーディングを全部ココに出すしかない
005957NGNG
ハンドルはしっかり得られたのですが、また詰まりました;

ListViewのハンドルを得られたので、ListView_GetItemText
で、得られたリストから項目を吸い出そうとした所、対象のソフトから
「モジュールCOMCTL32.DLLのアドレス〜に対する書き込み違反〜」
等とシステムエラーを吐かれてしまいました。。一体何が。。。
0060デフォルトの名無しさんNGNG
>>59
・該当行アイテムが存在ない
・該当列サブアイテムが存在ない
・バッファが十分でない
ハンドルが正しいかどうかは ShowWindow(hXxx, SW_HIDE); とか試してみる
006159NGNG
>>60
HIDEしてみたら、しっかり隠れたのでハンドルは確かな様です。。。
バッファはとりあえず足りなくてもTextMaxで切り捨てで。
アイテムはおもむろに 16行の4列とか指定してみたんですが、
これが不味んですかね。。;
リストは12項目で1000個程あるのでとりあえず適当で良いかなと
思ったのですが。
006259NGNG
DeleteItemは通る様です。。が、同じ番号にGetItemTextを送ると
やはりエラーが。。。解らんTT
0063デフォルトの名無しさんNGNG
エディットボックスで右クリックをしたときに
メニューを表示しないようにしたいのですが、どうすればいいのでしょうか?
出来れば、サブクラス化しないでやりたいのですが・・・
0064デフォルトの名無しさんNGNG
>>55
"新規プロジェクト"で単純なWin32 Applicationで以下のところだけ追加して
ビルドしてそれでもだめなら諦めろ。とりあえず俺のとこでは期待とおりに動いた。
つか、自分で切り分けもできないのはだめだめだぞ。

-- InitInstanceに追加
DragAcceptFiles(hWnd, TRUE);

-- WindProcに追加
case WM_DROPFILES:
  int   i, iExitLoop;
  HDROP  hDrop;
  UINT  uFileNo;
  char  szFileName[MAX_PATH];
  char  szMsg[1024];

  iExitLoop = FALSE;
  hDrop = (HDROP)wParam;
  uFileNo = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
  for(i = 0; i < (int)uFileNo; i++) {
    DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
    switch( MessageBox(hWnd, szFileName, "Delete", MB_YESNOCANCEL) ) {
      case IDYES:
        if( CopyFile(szFileName, "c:\\file.obj", FALSE) == FALSE ) {
          MessageBox(hWnd, szFileName, "Copy failed", MB_OK);
          break;
        }

        if( DeleteFile(szFileName) == FALSE ) {
          wsprintf(szMsg,
             "File: %s GetLastError: %ld",
             szFileName, GetLastError());
          MessageBox(hWnd, szMsg, "Delete failed", MB_OK);
        }
        else {
          MessageBox(hWnd, szFileName, "Delete Success", MB_OK);
        }
        break;
     case IDNO:
        break;
     default:
        iExitLoop = TRUE;
   }

   if( iExitLoop == TRUE ) break;
  }

  DragFinish(hDrop);
  break;
0065デフォルトの名無しさんNGNG
>>64
もとい。「標準的な"Hello,world"アプリケーション」でした。
0066デフォルトの名無しさんNGNG
>>59
他のAPのリソースになんでもアクセスできると思うなよ。
http://hp.vector.co.jp/authors/VA003525/tips8.htm

つーか、なんで漏れはこんなとこで油売ってんだろ。自分の勉強しよ。
0067↑そうそう、えらそーに言うほどのことでもない学生は勉強しなNGNG
>>62
別プロセスの場合はこうやんだってさ
http://nt.sakura.ne.jp/~miwaki/progtips/process/sharedmemory.shtml
006859NGNG
>>66
有り難うございますーー まさにコレですね。  しかし。。でるふぁい;

調度今、逆ギレて他のソフトの小判ざめ辞めて諸々1から作ってやろうと
思い立った所だったのですが、幸いWin98なのでやはり小判ざめで
逝く事にします^;;
#長い事書けませんでした;
006959NGNG
CreateFileMappingと言うAPI初めて使うんですが、何やっても
第一引き数がキャスト出来んと叱られてしまいます;
(HANDLE)0xffffffff>'void *' から 'int'
0xffffffff>const unsigned int' から 'void *'
一体何なんだ。。(;´Д`)
007059NGNG
すみません解決しました。 逝ってきます。
0071デフォルトの名無しさんNGNG
>>63
サブクラス化なしでは無理しょ
0072ちゃんと読もうな。>>67NGNG
君がえらそーに紹介したのと同じ技法だよ。
それと君は勉強をやめてしまったのか。ま、いいけどな。
007363NGNG
ガーン、そうなんですかー、
なんか、うまいやり方はないかなぁと四苦八苦してみたんですが
結局サブクラスなんですねー・・・・
どうもありがとうございました。
0074デフォルトの名無しさんNGNG
MP3を再生させる事の出来るAPIってあるんでしょうか?
0075デフォルトの名無しさんNGNG
>>74
コーデックがインストールされてればmciで再生可能。
0076デフォルトの名無しさんNGNG
>>72
誰も訂正なんかしていない。VC版でNT付き
ちゃんと読め、というヤツはたいがい自分が読んでない。
>他のAPのリソースになんでもアクセスできると思うなよ。
この逆説的な言い方が幼いというだけ。なんか自分で自分に言い聞かせてる
みたいだ。アンタ自信が初発見だったんじゃないの?
俺もよく答えているが、自信ないヤツほど高圧的なんだよね。
なぜエバる? ま、エバって答えりゃ有難みが増すからかな。
第三者から見ると鬱陶しいので事実を素直に答えといて下さい。じゃ
007776NGNG
>72
どーでもいーね
わりわり、怒るな
0078デフォルトの名無しさんNGNG
ウィンドウの縁からクライアント領域までのオフセットを取得するには
どうすればいいのでしょうか。
どなたかご存知の方、教えて下さい。宜しくお願い致します。
0079知ってる範囲ではNGNG
ClientToScreenとGetWindowPosを組み合わせるとか、
GetSystemMetricsでウィンドウ枠の幅を得るとか,,,,,,
008072NGNG
そうか。今度から気をつけるよ。
あと、素直に答えなかったのは検索すればすぐ
見付かったからだ。すぐに人に聞くのではなく
もう少し調べて欲しかった。そんだけ。
008178NGNG
>>79
こんな API があったんですね。不勉強でお恥ずかしい限りです。
早速やってみます。ありがとうございました。
008236NGNG
よーく探したら、やはり閉じ忘れのファイルハンドルがありました。
考えてくれた方々、どーもありがとー。

てうか、ごめん。
0083デフォルトの名無しさんNGNG
GetClientRect+ClientToScreen
AdjustClientRectEx
WM_NCCALSIZE
なども調べてみよう
0084デフォルトの名無しさんNGNG
あがれや
0085デフォルトの名無しさんNGNG
exeやdllが使用中かどうかを他プロセスから調べるにはどうしたらいいのですか?
0086デフォルトの名無しさんNGNG
>>85
そのファイルの名前を変更しようとして失敗すれば使用中。
成功したら元に戻すのを忘れずに。
0087デフォルトの名無しさんNGNG
>86
あたまいーねー
0088デフォルトの名無しさんNGNG
あんまり頭良くないと思う
exeやdllがCD-ROM上にあったり読み取り専用で共有されてたり
アクセス権の関係で読取専用だったりしたらどうするつもりなんだろう
0089デフォルトの名無しさんNGNG
>>88
なんのために使用中かどうか調べるのか、その目的によっては
Read Onlyも「使用中」とみなしてよいのではないか?
0090デフォルトの名無しさんNGNG
ダイアログをリソース使わないで、動的に作りたいと思います。
でもCreateDialogIndirectの構造体の作り方がよく分かりませんでした。
テンプレートの詳しい解説サイト無いですか?
0091デフォルトの名無しさんNGNG
>>89
質問の条件だけじゃ漠然としすぎてるね。
実際に使ってみてエラーが出るかどうか調べるのが一番確実なような。
0092デフォルトの名無しさんNGNG
>90

DialogBoxIndirect()のサンプルがあるから参考にしてくれ。
http://www.hinaiji.com/quixel/002/

あとはMicrosoft(米国)で下の言葉を検索すればいろいろ見つかるぞ。
http://search.microsoft.com/us/default.asp

CreateDialogIndirect
DialogBoxIndirect
DLGTEMPLATE
DLGITEMTEMPLATE
009390NGNG
>92
なんかえらく難しそうですね・・・。
リソース→メモリイメージ変換ツールというのが見つかったので、
それも参考にしてやってみます。ありがとうございました。
0094デフォルトの名無しさんNGNG
すみません、超初心者な質問ですが気になったので教えてください。
CもC++もWinプログラムも始めたばかりなのですが、
グローバル変数ってありますよね、
どこかのスレで「グローバル変数作りまくるのはダメ」
とか書いてあったので考えてしまったのですが、
例えばある構造体型の変数(オブジェクト?)をグローバルで
宣言してたとして、それをローカルに変え、かつ常に
内容を保存したままにするのは、Windowsプログラムでは
可能なんでしょうか?
DOSのコードならばMain関数内で宣言して使えばいいわけ
でしょうけれど、WindowsだとWinMainだけでなく
ウインドウプロシージャ(ウインドウ関数)がありますよね?
ここに制御が行ったとき、変数は失われたりしないのでしょうか?
バカな質問ですみませんが、よかったら教えてください
0095デフォルトの名無しさんNGNG
>94
ちょっと質問の意味が正確にわからないんだが、main()だろうがWinMain()だろうが、プログラムのルールはC/C++と同じ。
だから、ローカル、グローバルの違いもC/C++言語の本に書いてあるとおり。

WinMain()とプロシージャーで同じ変数を使いたいときは、グローバル変数にすれば、両方で使える。
グローバル変数を使いたくなければ、補足ウィンドウデータ(WNDCLASSEX構造体のcbClsExtraやcbWndExtra)を使ってWinMain()からプロシージャーに値を渡す。

プロシージャー内で同じ変数を使い続けるにはグローバル変数かstatic変数を使う。

というか、C/C++を勉強するなら、DOSプログラムから始めた方がいいと思うが。
いきなりAPIは難しい。
009694NGNG
なるほど、ありがとうございます。
やはりグローバル変数を使うのが基本なのですね。
要は使い分けでしょうか。

>いきなりAPIは難しい
よく言われるんですが、Winで作りたいものがあるので
根性でやってます(汗笑
C/C++の基本的なことにも毎回辞書を引いたりしてるので
遅々として進みませんが・・・。
0097デフォルトの名無しさんNGNG
Globalの使用を肯定すんなよ>>95
アホスレの1ならしょうがないけど。
ローカル関数内でのstatic変数も使うな。>>96
WindowsのコールバックにはGet/SetWindowLong使え。
0098デフォルトの名無しさんNGNG
>>97
>WindowsのコールバックにはGet/SetWindowLong使え。

WM_CREATE のハンドラでは CreateWindow から戻る前に呼ばれるわけ
だけど、そこでは GetWindowLong できないよね。シンプルな解決法ある?
0099デフォルトの名無しさんNGNG
ヘルプのCreateWindowの最後に渡す引数を参照>>98
WM_CREATEで受け取ったら、それをSetWindowLongしとく。
0100デフォルトの名無しさんNGNG
100!
0101デフォルトの名無しさんNGNG
>>97
他スレで議論があったらしいけど、
杓子定規に「○×は使うな、△□を使え!」って論法は危険だと思うぞ。

特に学習の途上なら、
その人のスキルに応じた段階を踏んでいくべきじゃないだろうか。

>>94 はまず、メッセージ駆動によるプログラミングを収得することが目的なわけだから、
初めの一歩としては、それ以外の要素はすべて捨ててもいいと思う。

自分で作ったウィンドウクラスから複数のインスタンスを作るとき、
「なるほど、グローバル変数じゃ、無理だな」と気がつくはず。
そのとき、次の段階へ進めばいいだけ。
■ このスレッドは過去ログ倉庫に格納されています