1 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:33:42 ] スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。 やさしいお兄さんやお姉さんたちが答えてくれるかも。 過去スレ、関連リンクは>>2-10 くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build65 pc11.2ch.net/test/read.cgi/tech/1208847084/
193 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:48:53 ] >>192 Declared in Commdlg.h, include Windows.h てっか、WindowsSDK入れてる?
194 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:00:45 ] >>192 WIN32_LEAN_AND_MEAN
195 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:02:04 ] >>191 WM_CREATE等最初に合成したものを WM_PAINT時に使うということですか?
196 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:14:25 ] >>182 ソースが突込み所満載なんだがまさか釣りじゃないよな? 本気で書いたソースならC言語についてもやばいぞ
197 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:20:08 ] >>196 早く突っ込んでくれ
198 名前:192 mailto:sage [2008/05/21(水) 22:22:28 ] >>194 自動で定義されていたそれをコメントアウトしたら解決しました。 ありがとうございます。 >>193 さんもありがとうございました。
199 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:27:37 ] >>197 なんでやねん
200 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:39:34 ] >>197 じゃあケツ出せよ
201 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:41:15 ] >>156 WM_ACTIVATEでフォーカスを失った時にブレークにはかかったのですが、 カスタムドローするのに必要なパラメータがなかったのでできませんでした。 オーナードローで頑張ればできるのでしょうか?
202 名前:デフォルトの名無しさん [2008/05/21(水) 22:52:33 ] 聞きたいのですが、 BITMAPの合成はどうやればよいのですか?
203 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:33:54 ] >>195 別にWM_CREATE時じゃなくていいよ。 ちらつきを抑えたいからダブルバッファしたいんだろうからBMPは常にメモリ上にあるという仮定で、 WM_CREATEがきたときに別途mallocでもnewでもいいからバッファを確保して そのバッファに背景BMPと表示したいBMPを合成したものを作成。 それをBitBltやStretchDIBitsのような描画関数で表示。
204 名前:デフォルトの名無しさん [2008/05/22(木) 00:00:22 ] WindowsX.h にある HANDLE_MSG() マクロを WM_COMMAND に対して使うとき、なんで return 0; になるんだ? HANDLE_MSG() に渡すfn は void func(HWND...) でvoid型だし、HANDLE_MSG() 自体も #define HANDLE_MSG(hwnd, message, fn) ¥ case message):return ((fn)(hwnd,...),0L) でマクロ展開で「return 0;」が出てくる理由がよく解らん。 case message: return func(hwnd,...); //func() はvoid型 になるんじゃないの?
205 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 00:10:42 ] カンマ演算子 return a, b; returnされるのはbの値。
206 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 06:15:18 ] メッセージクラッカって定義おかしくね? WM_DRAWITEMとか、 > If an application processes this message, it should return TRUE. って書かれてるのにvoidでreturn 0;されてるし
207 名前:デフォルトの名無しさん [2008/05/22(木) 06:17:56 ] さんくす>>205 カンマ演算子、か。K&Rの演算子の表の一番下に確かにそんなのあるな。いままで意識した事無かった ありがと
208 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 08:01:40 ] >>205 間違っています。 以上。 ↓次の方どうぞ
209 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 08:58:29 ] キモ
210 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 09:05:15 ] キモ
211 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:19:57 ] ゲーム作ってるんだけど、メモリ内のデータ書き換え防止する方法とかある? 外部アプリからメモリ内サーチして書き換えるやつ防止したい。助言よろ。
212 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:34:36 ] PCの電源切れ
213 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 11:03:18 ] >>211 オンラインゲームじゃないなら、改造対策は不要では? 俺もゲーム作ってるんだが、ブログで改造対策のこと書いたら、 「改造対策する時間があるなら、ゲームのボリュームを増やすこととか、 もっとまともなことに使って欲しい」ってコメントが多かったよ。 改造するかはユーザーの自由なんだし、ユーザーとしては当然のコメントだが。 あと、いまどきの改造は、プロセスメモリエディタ+ルートキットで やるから、改造を防止するなら、ユーザーから非難されることを覚悟のうえで ルートキットじみたことをするしかないでしょうね。
214 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:37:49 ] VC++のリソースエディタでダイアログボックスが作れますが、 そのような外観の(ダイアログでない)ウィンドウを、 ウィンドウクラスで作ったウィンドウに、コントロールぺたぺた貼って作ろうと思ったら、 (CWndではなく、RegisterClassEx、CreateWindow使って) ・ウィンドウの背景色は何故かCOLOR_BTNSHADOWが(ダイアログと)等しい ・エディットボックスはCreateWindowExの第1引数にWS_EX_CLIENTEDGEにしないと立体の縁にならない ・フォントはWM_SETFONT使ってサイズを変更しないと文字がでかい ・そもそもデフォルトのフォントが当然MS shell dlgではないようで、よくわからない (ただ、画面のプロパティから、故意にダイアログとウィンドウのフォントを違うものにした覚えはない…) 実際CreateDialogマクロでダイアログが作られるとき、ここら辺の設定ってどうなっているのですか? このマクロもCreateWindowExを使ってウィンドウを作ると書いてあるので、 同じようなことが再現できるのではと思ったのですが… (CreateDialogがウィンドウの大きさを決めるとき、フォントを元に作ってあるのはわかったのですが…)
215 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:05:33 ] Process Explorerで表示できるWindow Titleと同じものを取得したいと思っています。 どうもGetWindowTextで取得できるものとは別物らしく、 Process ExplorerでJuneブラウザのWindow Titleを見ると、 GetWindow〜で取得した名前とは違うものを表示しているのがわかります。 一体Process Explorerで表示できるWindow Titleとは何者か、 どうすれば取得できるのでしょうか?
216 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:19:39 ] >>215 ttp://msdn.microsoft.com/en-us/library/ms633520.aspx > GetWindowText cannot retrieve the text of a control in another application.
217 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:34:18 ] 使えないAPIなんですか。エディットコントロールじゃなければいいはず…ですよね。 そうするとWindow Titleってなんだろうという話になりまして、 たとえばJaneブラウザを表示したとき、以下のようになります。 ・キャプションバー、およびProcessExplorer上WindowTile列の表示 →”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66” ・GetWindowText、およびタスクマネージャ上の表示 →”Jane” ”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66”の文字列を取得したいわけですが、 その方法はご存知でしょうか?
218 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:44:31 ] Delphiアプリケーションには実は見えないアプリケーションウィンドウがあって・・・
219 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:00:33 ] >>218 VBアプリもそんな感じだったな だからタスクバーに表示しないプロパティなんてのがあるんだけど
220 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:07:52 ] spy++ とか眺めてみるといいと思う
221 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:14:12 ] あー…なんとなくイメージ掴めてきました メインウィンドウに見えたのは子ウィンドウで、だから取得できなかったと。 子ウィンドウのウィンドウタイトルの取得とか、そのあたりを調べてみます。 ありがとうございます
222 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:14:17 ] >>217 こんなんでいいのかな? #include<windows.h> #include<stdio.h> int main(void){ char title_buf[256], *class_name="TMainWnd"; int title_len; HWND hwnd; hwnd=FindWindow(class_name, NULL); if(hwnd==NULL){ printf("Window not found. class name [%s]\n", class_name); return 1; } title_len=GetWindowText(hwnd, title_buf, sizeof(title_buf)-1); if(title_len>=0) printf("%s\n", title_buf); return 0; }
223 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:59:33 ] >>222 どうもです 実行結果とSpy++を併せて見て、おおよそ理解できました。 デルファイでもVBでもデフォルトのクラス名でウィンドウを検索したのち、 目的の名前を取得する事ができました ありがとうございます
224 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 15:05:00 ] WM_GETTEXTでいいのでは
225 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:22:09 ] > title_len=GetWindowText(hwnd, title_buf, sizeof(title_buf)-1); 今時こんなソース書く奴はJavaか.NETで開発してろよと思う
226 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:25:53 ] >>225 この場合同書くのがいいのかも示して欲しいです
227 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:28:58 ] >>225 >>226 に同意 どう書けばよいのでしょう? TCHARの話でしょうか?
228 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:29:51 ] TCHARじゃないとかARRAYSIZE, _countofを使えとかnullは考慮されてるから-1はいらないとか あたりじゃない?
229 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:54:54 ] grep で include 内を探したけど ARRAYSIZE と _countof とは無かった (使用しているのは MinGW)
230 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:59:28 ] >>229 ARRAY_SIZE と countof はあったの?
231 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:01:22 ] >>230 無いです
232 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:12:16 ] _countofはMFCで定義されていてVC2005ぐらいからCRTでも定義されてた気がする SDKにはwinnt.hにRTL_NUMBER_OFがある いずれにしろ>>222 は人に教えられる立場で無いのは確か
233 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:20:27 ] 結局は、どう書くのが模範解答になるんでしょう?
234 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:24:19 ] WinAPIはよく知らんのだが、GetWindowText()の戻り値ってエラーチェックくらいしか使い途ないのかな。 >222もエラーチェックにしか使ってないようだし、>228によればナルターミネートはしてくれているようだし。 つーか、溢れたかどうかは単純には判らないのね。
235 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:27:19 ] >>222 は if(title_len>=0) printf("%s\n", title_buf); を if(title_len>0) printf("%s\n", title_buf); にしないとエラーチェックになってない
236 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:18:19 ] >>234 GetWindowTextLengthで事前にバッファ長を調べておけば済むだろ
237 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:27:58 ] GetGlyphIndices()という、文字列からグリフインデックスに変換するAPIがありますが、 この逆のことをするAPI、つまりグリフインデックスから文字列に変換する方法って解りますか?
238 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:28:29 ] バッファ足りなくてもバッファサイズまでコピーする仕様なの? そうだとしても戻り値にNULL文字は数えないって書いてあるから 指定サイズ==戻り値ならあふれてるのでは。
239 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:31:24 ] >>238 馬鹿丸出し
240 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:37:47 ] >>236 しかし長さを調べた直後には別のウィンドウタイトルに変わっているかもしれない そのアプリケーションがどう振舞うか想定できない
241 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:50:52 ] そんな事を気にするなら他プロセスのテキスト取得なんて考えないことだ (そろそろフックネタ出す奴が現れる頃か)
242 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:50:58 ] 仮にバッファ長が100だったとして、GetWindowTextLength()が99を返した後GetWindowText()が99を返しても、 その間にタイトルが書き換わっていたら溢れたかどうかは判らないのね。
243 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 19:10:58 ] >>240 >>242 必要十分なサイズのバッファを渡せば溢れる可能性は無くなる。 LPTSTR buffer = (LPTSTR)malloc(sizeof(TCHAR) * 0x7fffffff); if (buffer == NULL) { MessageBox(NULL, _T("この環境では使用できません"), _T("メモリ買いましょう"), 0); exit(-1); } GetWindowText(hwnd, buffer, 0x7fffffff);
244 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:36:32 ] 32bit環境だと/3GBスイッチ使っても厳しそうだ。 VirtualAllocのMEM_RESERVEでアドレスだけ確保して、 SEHで動的にメモリを割り当てるのが現実解だな。
245 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:59:09 ] ヒント:APIフック
246 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:19:35 ] >>245 ヒント:お前は馬鹿
247 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:23:10 ] たまにはブローとかアッパーとかさぁ
248 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:34:08 ] まずはジャブから
249 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:51:37 ] このスレの質が低下したのは、優秀な人は.NETに移ったからかもな。
250 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:58:09 ] 正解
251 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:06:48 ] 今頃気付いたのか
252 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:25:19 ] Advanced Windowsの著者だって.NETの本を書くこんな世の中じゃ
253 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:38:50 ] poizun
254 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:47:16 ] poison
255 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:49:58 ] prison
256 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:57:59 ] ぬるぽ
257 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 00:07:37 ] ga
258 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 00:35:25 ] てか、sizeof(title_buf)-1を最後の引数に指定してるから、 溢れる可能性など皆無だが? 溢れるとかなに言ってるんだ?
259 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 00:47:09 ] ↑理解していない何か
260 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 06:45:56 ] ↑話を理解している天才
261 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 10:20:45 ] ↑流れを読む天才
262 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 10:22:11 ] ↓通常の流れに戻すという偉業を成し遂げた天才
263 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 10:30:46 ] #include<stdio.h> #include<windows.h> int main(void) { /**/MSG msg; /**/while(0 < GetMessage(&msg,NULL,0,0)){ /******/switch(msg.message){ /**********/case WM_KEYDOWN: /**************/puts("keydown"); /**************/break; /******/} /**/} /**/return 0; } これで何かkey押してもダメなんだけどどうすればいい?
264 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 11:01:41 ] ウィンドウが無いじゃんか
265 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 11:06:59 ] コンソールに表示させたいん
266 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 11:52:02 ] な ん で ( ´∀` ) や ね ん !
267 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 12:31:48 ] プロシージャならメッセきたら処理するけど コンソールの場合はどうやるのか気になって
268 名前:デフォルトの名無しさん [2008/05/23(金) 13:12:02 ] CreateWindowでスタティックテキストを作りました。 テキストの背景色を透過したいんだけど、いい方法ありませんか? hStatic = CreateWindowEx(0, "STATIC", cString, WS_VISIBLE | WS_CHILD | SS_SIMPLE, X, Y, Width, Height, hWnd, (HMENU)Static, (HINSTANCE)hInst, NULL);
269 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:20:55 ] WS_EX_TRANSPARENTじゃダメ?
270 名前:268 mailto:sage [2008/05/23(金) 13:31:00 ] >>269 ダメでした。。 レバーコントロールに入れたツールバーにスタティックテキスト置いてます。 hStatic = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", cString, WS_VISIBLE | WS_CHILD | SS_SIMPLE, X, Y, Width, Height, hWnd, (HMENU)Static, (HINSTANCE)hInst, NULL);
271 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:39:40 ] ツールバー、もしくはメニューの背景にブラシを使う事は出来ますか?
272 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:40:07 ] WM_CTLCOLORSTATICでNULL_BRUSHを返す
273 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:12:15 ] あるプロセスが、自分を起動したプロセス(親プロセス)を知る方法はありますか。
274 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:20:00 ] ある
275 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:21:19 ] レバーじゃなくてリバーだと思う
276 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:23:18 ] "レバーコントロール" の検索結果 約 1,270 件中 1 - 10 件目 (0.13 秒) "リバーコントロール" の検索結果 約 185 件中 1 - 10 件目 (0.13 秒)
277 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:27:41 ] >>276 それ「レバー」「コントロール」別単語として検索した結果だから
278 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:27:45 ] どっちもすくな!
279 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:28:42 ] リバーコントロールでググると もしかして: レバーコントロール と出るなw
280 名前:268 mailto:sage [2008/05/23(金) 14:28:43 ] >>272 どうも。WM_CTLCOLORSTATICメッセージ勉強してみます。
281 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:41:49 ] >>277 馬鹿
282 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:02:53 ] レバー ReBar に一致する日本語のページ 約 268 件中 1 - 30 件目 (0.03 秒) リバー ReBar に一致する日本語のページ 約 277 件中 1 - 30 件目 (0.24 秒)
283 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:28:05 ] rebarの発音はrí:bà:rだからリバーと読む方が実際の発音に近い つまりレバーと読みたいならパーチーとかボデーとか言ってろってこった
284 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:33:15 ] ↑アホ
285 名前:デフォルトの名無しさん [2008/05/23(金) 15:35:16 ] ↑話を理解してない馬鹿
286 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:36:33 ] ReBarをレバーっていうのは斬新だなw
287 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:39:09 ] ↑馬鹿
288 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:40:32 ] >>281 =>>284 =>>287 =大馬鹿
289 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:41:46 ] ↑はずれ
290 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:43:10 ] >>281 ,>>284 ,>>287 ∈大馬鹿 という意味だろ さすが大馬鹿
291 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:45:37 ] レバーという表現は日本語としても定着してるんだからいんじゃね?
292 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:49:00 ] >>290 はずれ
293 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 15:51:19 ] 意味が通じるなら、それでおk。