■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
Win32API質問箱 Build47
251
名前:
デフォルトの名無しさん
:2006/11/21(火) 15:50:27
?2BP(200)
>>246
>>248
その場合はコンパイル環境とターゲット環境が一致している限りは問題ない。
sizeof自体が役に立たないのは、BITMAPINFOみたいな可変長メンバを含む場合。
252
名前:
デフォルトの名無しさん
:2006/11/21(火) 16:41:25
>>251
一致してれば、な
253
名前:
デフォルトの名無しさん
:2006/11/21(火) 17:01:43
>>251
お客さんのPCのGDI32.DLL の類がどんな環境で
いつコンパイルされたかなんか普通わからんと思うぞ。
254
名前:
デフォルトの名無しさん
:2006/11/21(火) 17:33:52
?2BP(200)
>>252
ま、それは要件によるが。
>>253
何の話してるのかね。
255
名前:
デフォルトの名無しさん
:2006/11/21(火) 17:38:04
>>254
>何の話してるのかね。
Win32 API のヘッダで構造体のメンバに構造体のサイズを設定するフィールドがあるのはなぜ、という話で、
「後で拡張されてサイズが増える場合があるから」という答えに対して
「コンパイル環境とターゲット環境が一致している限りは問題ない」とアフォな返しをする奴がいたので、
ターゲット環境がわかるケースは一般的ではないと指摘してみたんだが・・・
256
名前:
デフォルトの名無しさん
:2006/11/21(火) 17:38:46
?2BP(0)
具体例を出さんと
>>254
は解らなさそうだ
257
名前:
245
:2006/11/21(火) 17:55:20
>>246-256
ビットマップをいじるプログラムをさわったらなんとなくわかってきました。
教えてくれて、ありがとう。
あと、C言語ポインタ完全制覇という本に構造体の一番後ろで拡張するタイプの話がのってたので、
そっちも読んで理解してみます。な〜んでだろっていうのがすっきりして助かりました。
258
名前:
デフォルトの名無しさん
:2006/11/21(火) 18:37:27
>>257
ヘッダを開いて、それぞれの構造体の宣言部を見てみるのもいいと思うぞ
#ifdef _WIN_VER〜#endifとかあるから
259
名前:
デフォルトの名無しさん
:2006/11/21(火) 18:47:33
質問です。
C言語をベースに勉強していて、
テキストエディタを作っています。
コモンダイアログの「検索」を出して、
エディタ内の文字列を探す所まではなんとかできたのですが、
その結果をエディタに表示する方法がよくかりません。
エディタの内容をchar配列に移して、
そこからstrstrで検索して、
見つかったら戻り値のポイントを調べて、
SendMessage(MyDataGet_hEdit(), EM_SETSEL,[戻り値], [戻り値 + 検索文字数]);
で結果を明示しようとしています。
見つかった文字列がエディタ内に表示されている状態ならば、
これでもよさそうなのですが、
表示されていない場合、スクロールを自分で動かして、
どこが選択されているか調べないといけないという、
検索した意味のない状態になってしまっています。
どうしたら普通の検索のように、
検索結果(選択状態の文字列)まで、
画面表示を自動スクロールさせられるのか、ヒントをください。
260
名前:
デフォルトの名無しさん
:2006/11/21(火) 18:54:07
?2BP(200)
>>255
ターゲット環境が「分かる」必要なんか無いだろ。
ターゲット環境は「作るときに決める」物なんだから。
「ターゲットを決めうちする限りは問題ない」とする回答に「ターゲットが分からない」と
返す方がよっぽどAFOだと思うが。
261
名前:
デフォルトの名無しさん
:2006/11/21(火) 19:08:29
なんでおまえの限定の話に乗っからないといけないんだよ
262
名前:
デフォルトの名無しさん
:2006/11/21(火) 19:29:22
>>245
biSizeは言ってみれば構造体のバージョンナンバー。
BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADERのように
構造体が拡張された場合に、API側がbiSizeを見てどの構造体なのか
判断している。
これのおかげで、BITMAPINFOHEADERを要求するAPIにV4やV5の
構造体を渡すことができる。
263
名前:
デフォルトの名無しさん
:2006/11/21(火) 19:37:02
?2BP(200)
>>261
ターゲットが分からないなんてのもお前限定の話だろ。
客のターゲットも調べないで要件を定義するのか?
264
名前:
259
:2006/11/21(火) 19:50:09
流れ無視してゴメンなさい。自己解決しました。
SendMessage(HANDLEエディタ, EM_SCROLLCARET, 0, 0);
基本的なメッセージ関連を勉強しなおしてきます。orz
265
名前:
デフォルトの名無しさん
:2006/11/21(火) 19:55:23
ターゲットを限定しないとバージョンアップのたびに金を取れないだろ。
266
名前:
デフォルトの名無しさん
:2006/11/22(水) 08:17:04
>>262
>biSizeは言ってみれば構造体のバージョンナンバー。
同意同意。
本当はマズいんだと思うんだけどね。
過去バージョン互換とか考えるとなー。
267
名前:
デフォルトの名無しさん
:2006/11/22(水) 09:47:00
ビットマップ等の場合、渡されるOS側がサイズを確定できないのだから仕方が無い
Windows3.0以前から一応ソースレベルの互換性を維持してきたツケだな
268
名前:
デフォルトの名無しさん
:2006/11/22(水) 13:03:41
ここでGDI+の質問してもOKでしょうか?
FillRectangle + LinearGradientBrushを使って四角形を描画すると
Rectのサイズによってはグラデーション開始位置に、グラデーション終了色が
出ます。(LinearGradientModeVerticalモード時は上1行だけ)
これはどうやれば防げるんでしょうか?
269
名前:
デフォルトの名無しさん
:2006/11/22(水) 13:30:27
どういうコード書いてるかも言わずに解るわけないだろ
270
名前:
268
:2006/11/22(水) 13:50:10
失礼しました。以下のコードです。
Graphics g(hdc);
Rect rect(10, 10, 100, 11);
LinearGradientBrush brush( rect, Color(255,255,0,0), Color(255,0,0,0), LinearGradientModeVertical );
g.FillRectangle(&brush, rect);
四角形の上が赤、下が黒になるはずなんですが、一番上の行が黒になってしまいます。2行目以降は
正常です。Y座標を変えると全て正常に表示されることもあります。
271
名前:
デフォルトの名無しさん
:2006/11/22(水) 13:52:17
GetMessageの戻り値が負になるのはどういう時でしょうか。
終了の0の時は、閉じるボタンorWM_CLOSEをPost、
WM_CLOSEはDefWindowProcで処理、
WM_DESTROYが来て、そこでPostQuitMessage(0)、
WM_QUITが来た時、同時にGetMessageの戻り値が0になり
メッセージループを抜けるという感じだと思うんですけど。
272
名前:
デフォルトの名無しさん
:2006/11/22(水) 14:45:03
>>271
MSDNくらい嫁や
273
名前:
デフォルトの名無しさん
:2006/11/22(水) 15:22:58
>>271
わん わん わわわん わん わん くんくん
(GetMessage関数は、WM_QUIT以外のメッセージを取得した場合は、TRUEを返すんだよ)
わん わん わわわん わん わん
(また、WM_QUITメッセージを取得した場合は、FALSEを返すんだよ)
わん わん くーん?
(わかったかな?)
274
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:03:37
>>273
>>272
275
名前:
271
:2006/11/22(水) 16:21:50
ありがとうございます。
>>223
エラーが発生した場合、-1が返ると書いてあります。
しかし、それで戻り値がintでなくBOOLなのがなぞですが。
WM_CLOSE、WM_DESTROY、WM_QUITを経由して
-1を返してくるか、いきなり-1を返すのかが分かりません。
実験しようにも-1戻り値エラーが発生したことがありませんし。
276
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:30:37
typedef int BOOL;
277
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:45:15
そういやさ、MSDNのGetMessageの解説には、
GetMessageは「0、-1、other」の3種類の戻り値が有るから「while (GetMessage(lpMsg, hWnd, 0, 0))」は良くないって書いてあるけど
VCが自動生成するメッセージループって「while (GetMessage(lpMsg, NULL, 0, 0))」なんだよな
これってどうなんかねw
278
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:48:57
>>275
> それで戻り値がintでなくBOOLなのがなぞですが。
GetMessageの戻り値は以前はTRUEとFALSEだけだった。
279
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:50:37
GetMessageのウィンドウハンドルの引数に無効な値(削除されたウィンドウのハンドルなど)
を渡すと-1が帰ってくると聞いたことがある。
280
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:55:46
>>279
そうか、そういう場合に失敗するのか。
いや、いままでGetMessageが失敗したことなんて無いもんだから。
面倒だから、こういうやり方してしまっているけど
while ( GetMessage( &msg, NULL, 0, 0) > 0 )
{
}
281
名前:
デフォルトの名無しさん
:2006/11/22(水) 16:59:55
つか、MSDNの警告に従えば、GetMessageはwhileの条件式に書かないほうがいいってことだから
while(true)とかで回すことになって、益々ヤバイことにならんか
282
名前:
271
:2006/11/22(水) 18:30:03
>>279
なるほど。
こわいですが、わざと変な値を使ってエラーさせて実験してみます。
283
名前:
デフォルトの名無しさん
:2006/11/22(水) 18:48:41
他のプログラムの出しているウィンドウへのキー入力もフックに引っかけたくて、
DLLを記述して、
hhk = SetWindowsHookEx(WH_KEYBOARD,// フックタイプはキーストローク
hHOOKKEY, // フック処理プロシジャへ
hInstDLL, //フックプロシジャは同一ファイルで記述
NULL); // 対象スレッドはすべて
if (hhk == NULL)
MessageBox( NULL,TEXT("フックかけられない"),TEXT("Error"),MB_OK)
と記述したところ、フック設定は毎回うまく行っているように見えるのですが、
自分で作成しウインドウへの入力は拾えても、他のプログラムの出した窓への入力
は拾えません。「グローバルフック」はキーロガーのように全部拾ってくれる
と思っていたのですが、こんなもんなんでしょうか。
WinXP,VisualC++2005 です。
284
名前:
デフォルトの名無しさん
:2006/11/22(水) 19:35:05
>>283
拾えるのはDLLの注入されたプロセス自身だけ
他のプロセスのメッセージを拾いたいなら、
何らかのプロセス間通信を使って自分のプロセスに送らないと駄目
285
名前:
デフォルトの名無しさん
:2006/11/22(水) 19:43:55
?2BP(200)
>>283
グローバルフックを仕込んだdllをパスの通ったディレクトリに置く。
286
名前:
デフォルトの名無しさん
:2006/11/22(水) 19:53:25
>>285
パスが通ってる必要はない
287
名前:
デフォルトの名無しさん
:2006/11/22(水) 22:04:48
フックプロシージャでメッセージを受け取るウィンドウのハンドルを取得することはできないのでしょうか?
フックの種類はWH_CBTです
288
名前:
デフォルトの名無しさん
:2006/11/22(水) 22:16:12
>>287
>>272
289
名前:
287
:2006/11/22(水) 22:21:17
>>288
MSDN見たら書いてありましたorz
nCodeによってはwParamとかに入ってるんですね
スレ汚ししてしまってすみませんでした
290
名前:
デフォルトの名無しさん
:2006/11/23(木) 00:02:42
SetStdHandleでググって見つかるサンプルって子プロセスの標準出力等を親からReadFileで読み出す感じなのが大半だと思うのですが
自プロセスでputsとかで出力したものをコンソールに出力せずあとでReadFileでまとめて取得したくて下記のようなコードを書いたのですがうまくいきません
int main() {
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if(!CreatePipe(&hRead, &hWrite, &sa, 0)) {
puts("error CreatePipe");
return 1;
}
if(!SetStdHandle(STD_OUTPUT_HANDLE, hWrite)) {
puts("error SetStdHandle");
return 1;
}
const char msg[] = "Hello from new stdout";
puts(msg); // 新しく設定されたstdoutに出力
fflush(stdout);
FlushFileBuffers(hRead);
FlushFileBuffers(hWrite);
char buf[1024] = {0}; DWORD read = 0;
ReadFile(hRead, buf, sizeof(buf)-1, &read, NULL);
if(strcmp(buf, msg) != 0) {
puts("failed");
return 1;
}
return 0;
}
291
名前:
デフォルトの名無しさん
:2006/11/23(木) 01:50:30
>>290
的外れだったらすまんが
CreateConsoleScreenBuffer
関連を使えばバックバッファを作成できるけど
292
名前:
290
:2006/11/23(木) 03:18:04
>>291
レスありがとうございます
CreatePipeのくだりを消して
HANDLE hWrite = CreateConsoleScreenBuffer(
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CONSOLE_TEXTMODE_BUFFER,
NULL);
SetConsoleActiveScreenBuffer(hWrite);
を追加したのですがReadFileではなにも読めませんでした
rubyで実現できたのですがこれをWin32APIでもやりたいです
下記は標準出力を横取りしてフィルタリングや整形などを行えます
$stdout_sv = STDOUT.dup # STDOUT を保存
class MyOut < IO
def write(str)
return $stdout_sv.write("-->" + str) #デコレーションして本物の標準出力に
end
end
STDOUT.reopen(MyOut.new(0)) #フィルタ設置 (ファイルディスクリプタ適当
puts "Hello from new stdout\n"
STDOUT.flush
STDOUT.reopen($stdout_sv)
293
名前:
デフォルトの名無しさん
:2006/11/23(木) 07:37:04
rubyのソースを読めば方法がわかる予感。
294
名前:
デフォルトの名無しさん
:2006/11/23(木) 08:58:52
ていうか標準関数を使うべきかと
以前、win32アプリでAllocConsoleを使ってコンソールを作成した後標準出力をコンソールスクリーンに割り当てる
って事をやったんだけどAPIでやるとcoutやprintfは機能しなかった。
だけど標準関数(たしかfreopen)を使うとちゃんと出力されたし、
GetStdHandleを使って調べてもちゃんとスクリーンのハンドルが返ってきた
ちなみにcoutを開き直すのは駄目でした(coutはちゃんと出力できたけどprintfとかが駄目)
295
名前:
デフォルトの名無しさん
:2006/11/23(木) 09:02:34
あと入出力の関数は標準関数かAPIかで統一した方がいいと思う
296
名前:
デフォルトの名無しさん
:2006/11/23(木) 10:25:35
そもそもAPIで標準出力の出力先を変更しようというのではなく、
プログラム内で出力先を選べるようにしたほうが楽だと思う。
C++ならstd::ostreamを引数にとって、呼ぶ側が必要に応じて
std::ostringstreamのオブジェクトを渡すようにするとかさ。
297
名前:
デフォルトの名無しさん
:2006/11/23(木) 19:37:22
質問があります。
拡張子がrtfのファイルに関連するアイコンデータがプログラムから
ひつようなのですが、レジストリエディタで確認すると
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1
になっていました。
このリソースIDは何番にしたらいいですか?ワードパッドみても
リソースIDが一番のアイコンはありませんでした。
よろしくお願いします
298
名前:
デフォルトの名無しさん
:2006/11/23(木) 19:51:50
標準のスタティックコントロールが自動折り返しの設定になっているときに、
複数行の文字列が表示される領域を正確に知りたいのですがどうすればいいでしょうか?
GetTextExtentPoint32だと折り返しがある場合に位置がずれてしまうのです。
299
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:01:14
>>297
正の値 : 0から始まるアイコンのインデックス
負の値 : リソースID(ex. -3 -> リソースID 3)
300
名前:
297
:2006/11/23(木) 20:14:53
>>299
理解できました。
ありがとうございました。
301
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:24:37
fopen fout
と
CreateFile
WriteFile
は
どっちが速い?
302
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:29:01
>>301
実装と用途による。
303
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:30:54
>>301
foutが何かは知りませんが、大き目のファイルを一気に書くような用途では
ストリームを使ってもAPIを直接使っても大して速度は変わらないと思います。
∵一般的にI/Oに時間が掛かりますから。
304
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:34:39
根拠なしに適当いうと
たぶんfopen()とかはCreateFileで実装されてる
305
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:41:39
それ以外でどう実装しろと
306
名前:
デフォルトの名無しさん
:2006/11/23(木) 20:58:57
直にディスクアクセスする方法がある。
って結局ドライブ自体かvwin32をCreateFileで開かないといけないわけか。
307
名前:
デフォルトの名無しさん
:2006/11/23(木) 21:00:06
隠しAPIがあるとか
308
名前:
デフォルトの名無しさん
:2006/11/23(木) 21:19:00
NtCreateFileとかZwCreateFileとか
309
名前:
デフォルトの名無しさん
:2006/11/23(木) 21:53:00
Cランタイムのソースコードは誰でも見れるだろ。
正解は304
310
名前:
デフォルトの名無しさん
:2006/11/23(木) 22:08:18
解放し忘れたメモリもプロセスが終了するときに解放されると聞いたことがあるのですが、
同様にLoadLibraryで読み込まれたDLL内で確保したメモリがFreeLibraryで解放されるのでしょうか?
311
名前:
デフォルトの名無しさん
:2006/11/23(木) 22:18:51
>>310
されない
DLL作る人は気をつけよう
312
名前:
デフォルトの名無しさん
:2006/11/23(木) 22:32:56
>>311
レスありがとうございます
解放されないんですね、気をつけます
313
名前:
デフォルトの名無しさん
:2006/11/23(木) 22:35:23
されないのか、知らんかった
・・・考えたら、されたら困るよな・・・
314
名前:
デフォルトの名無しさん
:2006/11/23(木) 22:58:05
COM最強杉とだけ言っておこう
315
名前:
デフォルトの名無しさん
:2006/11/23(木) 23:00:09
>>314
違う最強なのは僕
316
名前:
デフォルトの名無しさん
:2006/11/23(木) 23:01:35
なのは最強
317
名前:
デフォルトの名無しさん
:2006/11/24(金) 00:14:51
最強はケンイチ
318
名前:
デフォルトの名無しさん
:2006/11/24(金) 01:55:46
アニメーションを行うためにタイマーイベントでWM_PAINTを発行して、
WM_PAINT内に以下の記述をしています。
draw() // OpenGLの描画関数
SwapBuffers(wglGetCurrentDC());
HDC hdc = BeginPaint(hwnd, &ps);
〜マウスドラッグによる四角の描画〜
EndPaint(hwnd, &ps);
すると、マウスドラッグで描かれた四角の部分がチラついてしまいます。
このチラツキを防止するにはどうすればよろしいでしょうか。
319
名前:
デフォルトの名無しさん
:2006/11/24(金) 01:57:53
画面に直接書かずバックバッファのほうに書け
320
名前:
318
:2006/11/24(金) 02:25:33
>>319
どうも。以下にようにしてもチラつきました。
何か間違ってるでしょうか?
HDC hdc_bkbuf = CreateCompatibleDC(hdc);
HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height);
HBITMAP hbmp_old = (HBITMAP)SelectObject(hdc_bkbuf, hbmp);
〜hdc_bkbufに四角を描画〜
BitBlt(hdc, posx, posy, width, height, hdc_bkbuf, 0, 0, SRCCOPY);
SelectObject(hdc_bkbuf, hbmp_old);
DeleteObject(hbmp);
DeleteDC(hdc_bkbuf);
321
名前:
デフォルトの名無しさん
:2006/11/24(金) 02:33:51
WM_TIMERの代わりにWM_MOUSEMOVEで更新するとか
SendMessageじゃなくPostするとか
322
名前:
デフォルトの名無しさん
:2006/11/24(金) 02:35:20
>>320
SwapBuffersはどこ行った?
323
名前:
318
:2006/11/24(金) 02:44:33
>>322
draw(); // OpenGLの描画関数
SwapBuffers(wglGetCurrentDC());
HDC hdc = BeginPaint(hwnd, &ps);
〜320のコード〜
EndPaint(hwnd, &ps);
SwapBuffers(hdc);
てな具合です。
>>321
すみません。いまいちよく分かりませんでした。
324
名前:
デフォルトの名無しさん
:2006/11/24(金) 02:53:47
それじゃまったく意味ないだろ。
OpenGLの裏画面ってGDIじゃ描画できないんだっけ?
325
名前:
318
:2006/11/24(金) 03:00:17
そうですね。意味ないですね…。
> OpenGLの裏画面ってGDIじゃ描画できないんだっけ?
GLとGDIでコンテキストを分けてそれぞれ独立に描画できれば
自由度があって便利なんですが、やり方がよくわからず。
326
名前:
321
:2006/11/24(金) 03:00:32
case WM_TIMER
・・・
WM_PAINを発行
を
case WM_MOUSEMOVE
if(ドラッグの最中){
PostMessage(自分,WM_PAINT・・・)
}
な具合。
327
名前:
デフォルトの名無しさん
:2006/11/24(金) 03:06:06
WM_PAINTって自分で送るものじゃないんじゃないの?
328
名前:
318
:2006/11/24(金) 03:11:08
>>327
InvalidateRectでいいですよね。
>>326
それだとドラッグの最中に四角が描画されて、
同時にタイマーでアニメーションが描画されて、結局チラついちゃう気が…。
GL側で全部描こうかなぁ。
半透明とか楽だし…。
329
名前:
デフォルトの名無しさん
:2006/11/24(金) 04:24:41
> GL側で全部描こうかなぁ。
GDIで書く方法が不明ならそれが一番いいかと。
330
名前:
デフォルトの名無しさん
:2006/11/24(金) 06:39:42
そもそもWM_PAINTで描くからチラつくんだが
WM_PAINTはあくまで再描画するためのイベントだ
それ以外の描画は他タイミングで描け
つか、タイマー使ってんならWM_TIMERで描きゃいいじゃないかよ
331
名前:
デフォルトの名無しさん
:2006/11/24(金) 09:25:43
WM_ERASEBKGNDで描けばいいんじゃね
332
名前:
298
:2006/11/24(金) 15:23:54
API組み合わせたら、たぶん自己解決しました
333
名前:
デフォルトの名無しさん
:2006/11/24(金) 15:40:37
腰痛い
334
名前:
デフォルトの名無しさん
:2006/11/24(金) 16:56:55
ダブルバッファリングでちらつくのは
InvalidateRect(hWnd, NULL, TRUE);ってやってるからじゃないかな
最後FALSEでやっていろいろ調整するといいかも
その前にマウスドラッグで四角書くのにタイマー使う必要があるのかが謎だけど
335
名前:
デフォルトの名無しさん
:2006/11/24(金) 17:59:40
LoadLibraryEx()でDLLのインスタンスハンドル入手した後
どうやって解放すればいいですか?
どなたかお願いします。
336
名前:
デフォルトの名無しさん
:2006/11/24(金) 18:04:39
>>335
ハンドルというかただのアドレスだ。開放する必要はない。
DLLの開放という意味ならMSDNを見れ
337
名前:
デフォルトの名無しさん
:2006/11/24(金) 18:39:04
>>324-325
OpenGL のレンダーターゲットを BMPイメージonメモリDC にして そっちを GDI 描画
WM_PAINT はBMPを(BitBlt で)可視化 で多少融通が利くよ
338
名前:
デフォルトの名無しさん
:2006/11/24(金) 18:48:46
ハードウェアアクセラレーション利く環境少ないけどな。
339
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:21:01
ウィンドウプロシージャをC++のクラスでうまくラッピングしてるライブラリってない?
JavaのWindowListenerみたいな感じのが欲しいんだけど・・
340
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:25:17
ライブラリを求めるんならMFCでも使っとけば?
他人が作ったライブラリを中途半端に使うより、自分で必要な機能を盛り込んで作った方がいいけどな
341
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:26:51
windowsx.h
342
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:28:36
MFC・windowsx.hはイベントハンドラ定義するのにマクロ使うんで
個人的に好みじゃないんだよな・・
適当に作ってみるか。レスありがとう。
343
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:36:55
バッチファイルをアプリを起動することなく、
(すなわち自分のプロセス内で)実行する方法って
ありますでしょうか?
344
名前:
デフォルトの名無しさん
:2006/11/24(金) 19:40:36
>>343
バッチファイルを実行するコードを全部自分で書く。
345
名前:
デフォルトの名無しさん
:2006/11/24(金) 20:07:33
cmd.exe/command.comを介入させたくないのか、
バッチの中に書いてあるコマンドも内蔵させる必要があるのかだな。
あるいは単にコンソールウインドウを不可視にしたいだけのかな?
346
名前:
デフォルトの名無しさん
:2006/11/24(金) 21:42:42
>>342
.NET FrameworkのWindows Forms。
あとMS発祥といえばATL/WTL。こっちはマクロ使うけど。
347
名前:
デフォルトの名無しさん
:2006/11/24(金) 22:25:52
Qt4はどうよ
348
名前:
343
:2006/11/24(金) 22:53:39
シャットダウン中にバッチファイルを実行したいんです。
WM_QUERYENDSESSION?かなにかが飛んできたときはもう
新規実行はできないと思うので、自分でやりたいのです。
349
名前:
デフォルトの名無しさん
:2006/11/24(金) 23:20:05
>>348
>>344
新プロセス起動できないんなら、外部コマンドも取り込まないとな。
350
名前:
tsurarete yarou.
:2006/11/24(金) 23:42:25
>>348
OS は何?
すれ違いだけど、Windows 2000/XP/Server 2003 なら
http://q.hatena.ne.jp/1140862112
が参考になるかも。
351
名前:
デフォルトの名無しさん
:2006/11/24(金) 23:42:44
>>348
直接の答えではないけれど、ログオフスクリプトではだめか?
352
名前:
デフォルトの名無しさん
:2006/11/24(金) 23:57:23
mem_bmp = CreateCompatibleBitmap(hdc, 800, 800);
mem_hdc = CreateCompatibleDC(hdc);
SelectObject(mem_hdc, mem_bmp);
int a = GetDeviceCaps(mem_hdc, HORZRES);
int b = GetDeviceCaps(mem_hdc, VERTRES);
aとbの値が800にならないんだけどなんでだろう
353
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:07:56
実際にはどうなるんだよ
354
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:08:29
言語スレ行って質問したらWin32APIのほうが質問場所は良いって
言われたので来ました。
ttp://support.microsoft.com/kb/403844/ja
PGが起動してるときだけスクリーンセーバが動かないPGを作ってるんだけど
リンク先のやり方だとパスワード保護されてるとうまく動かないんです
パスワード保護の時って発行されてるメッセージって違うみたいですが
どうすればフック出来るか知りたいんですが
355
名前:
352
:2006/11/25(土) 00:09:53
>>353
実際にはデスクトップ領域の解像度が入った
1600と1200みたいな
356
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:10:16
>>352
解像度が800x800のディスプレイを接続すればいいと思うよ。
357
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:24:15
>>352
対象がビットマップじゃなくてデバイス(スクリーン)だから
358
名前:
352
:2006/11/25(土) 00:37:44
>>357
スクリーンと互換のデバイスってことでスクリーンの値を取得してるのか・・・
ビットマップの値を取得する方法はないですか?
359
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:42:04
>>358
GetObject
360
名前:
デフォルトの名無しさん
:2006/11/25(土) 00:47:37
>>354
WlxIsLockOk
361
名前:
352
:2006/11/25(土) 00:47:37
ありがとう
GetBitmapDimensionEx(mem_bmp, &sz);
でいけた
362
名前:
デフォルトの名無しさん
:2006/11/25(土) 01:01:11
初めて知った<GetBitmapDimensionEx。
363
名前:
352
:2006/11/25(土) 01:18:04
と思ったら2回目以降使えなくなった
あらかじめSetBitmapDimensionExでサイズを設定しておかなきゃいけないらしい
なんで初めだけ取得できたんだろ・・・?
364
名前:
デフォルトの名無しさん
:2006/11/25(土) 05:00:54
セイント聖矢のジェミニを思い出したのは俺だけで良いはずだ
365
名前:
デフォルトの名無しさん
:2006/11/25(土) 09:27:29
>>361
それで得られるサイズの単位はピクセルじゃないぞ
366
名前:
デフォルトの名無しさん
:2006/11/25(土) 09:31:38
どうせユーザ定義なんだから何でも良いんじゃね?
367
名前:
デフォルトの名無しさん
:2006/11/25(土) 09:59:12
>>359
で答えが出てるのに、何悩んでるんだろう?
368
名前:
デフォルトの名無しさん
:2006/11/25(土) 10:02:37
ここで聞くべきかDirectXスレで聞くべきか
COMスレで聞くべきか迷ったのですが…
FrapsやGameCamなどのDirectX乗っ取り型のキャプチャソフトなんですが
どうもキャプチャ動画を見たところDirect3Dのフロントバッファ(かバックバッファ)を
直接取得して録画してるみたいなんですが、どうやって取得しているのかその挙動が良く分かりません。
最初はSetWindowsHookEx()で全プロセスにdllをマッピングして、PEヘッダを見て
Direct3Dの初期化関数(Direct3DCreate8()等)を見つけたらフックして、
出てきたインターフェース(IDirect3DDevice8等)のGetFrontBufferData()を呼び出して
フロントバッファをコピーしているのかと思ったのですが、PEヘッダが暗号化されて
INTにDirect3DCreate8等が存在しないゲーム(具体的にはMaster of Epicというゲームです)でも
ちゃんと録画が可能な上に、この方法だとゲーム起動前にキャプチャプログラムを
起動しないといけない(Direct3DCreateをゲームが呼び出す前にフックしないといけない)ので
ゲーム起動後に起動してもちゃんと動作するFraps等では違った技法を使ってると思うのですが、
その方法がどうしても思い浮かびません。漠然とですがもしかしてIDirect3DDeviceには
メモリ検索で探せるような特定のメモリパターンがあるのかな?と思ったりするのですが…
ご存知の方いらっしゃいましたら是非ご教授お願いしたいです。
しかし…見返してみると…長文杉でホント申し訳ないorz
369
名前:
デフォルトの名無しさん
:2006/11/25(土) 10:15:20
>>368
CLSID乗っ取って、アプリとDirectXの間に一枚噛ませてるんじゃね?
370
名前:
デフォルトの名無しさん
:2006/11/25(土) 11:10:56
>>360
dクス
371
名前:
デフォルトの名無しさん
:2006/11/25(土) 11:13:18
エクスプローラでファイルを自ウィンドウにD&Dして、フォルダパスを取得することはできるのですが、
逆に自ウィンドウからD&Dして(Spy++のファインダツールのように)エクスプローラを指定→
フォルダパスを取得する方法はどのようにすればいいですか?
アドレスバーから取得する方法を試してみたのですが、
非表示の環境の場合に取得できないのでうまくいきませんでした。
CabinetWClass
-WorkerW
-RrBarWindow32
-ComboBoxEx32
-ComboBox
-Edit ←ここにWM_GETTEXTを投げてみました
372
名前:
デフォルトの名無しさん
:2006/11/25(土) 12:12:13
>>371
無理じゃね?
DnDのファイルコピーとかのオペレーションは受けとり側が操作するから。
ターゲットソースは受け取り側にファイル名渡すだけ。
373
名前:
デフォルトの名無しさん
:2006/11/25(土) 13:00:10
イベントの飛ぶ順序ってどの本に載ってるの?
例えばダイアログをリサイズしたときに、
どういうイベントがどういう順番で飛ばされるのか、などを知りたいのだけど
374
名前:
371
:2006/11/25(土) 13:02:15
>>372
そうですか(´・ω・`)
残念。。
375
名前:
デフォルトの名無しさん
:2006/11/25(土) 13:07:11
>>373
つ[Spy++]
376
名前:
デフォルトの名無しさん
:2006/11/25(土) 13:08:45
>>373
MSDN
>Size and Position Messages
ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowfeatures.asp
377
名前:
デフォルトの名無しさん
:2006/11/25(土) 14:27:21
>>368
全く同じことしようとしている人がいて驚愕>MoE
378
名前:
デフォルトの名無しさん
:2006/11/25(土) 16:02:34
簡単なサンプルプログラムをコンパイルするのに、
>cl test.c user32.lib gdi32.lib
みたいに*.libっていうファイルをリンクしないとエラーが出るんですが、
これって静的リンクになっちゃってるってことですか?
379
名前:
デフォルトの名無しさん
:2006/11/25(土) 16:48:20
そのLIBはDLLへの参照を含んでいるインポートライブラリ。
静的ライブラリがリンクされているわけではない。
380
名前:
デフォルトの名無しさん
:2006/11/25(土) 17:17:15
>>379
なるほどそうなんですか。
.libファイルをインポートライブラリ・スタティックリンクライブラリと
見分ける方法でもあるのかな??
381
名前:
デフォルトの名無しさん
:2006/11/25(土) 17:43:15
>>380
dumpbinでどうよ?詳しく使った事無いけど。
382
名前:
デフォルトの名無しさん
:2006/11/25(土) 17:55:00
383
名前:
デフォルトの名無しさん
:2006/11/25(土) 18:55:14
>>381
dumpbinは有料のVS買わないと付いてこないみたいですね。
.libの中でも、
インポートライブラリというのはシンボルテーブルだけのオブジェクトファイルのアーカイブ
静的リンク用ライブラリは実コードも入ったオブジェクトファイルのアーカイブ
ってことで、arなんかのツールでファイル取り出してobjdumpして確認するのがいいみたいですね。
384
名前:
デフォルトの名無しさん
:2006/11/25(土) 18:56:19
他のプロセスで作ったメモリデバイスコンテキストのハンドルを自分に渡して
自分からメモリデバイスコンテキストを使うことはできる?
フックと併せて作ったんだけどローカルではできてもグローバルでは失敗する・・・
385
名前:
デフォルトの名無しさん
:2006/11/25(土) 19:45:42
HDCはローカルなハンドルなのでHDCを操作するのも対象のプロセス内で行う必要がある。
386
名前:
デフォルトの名無しさん
:2006/11/25(土) 20:18:16
>>385
なるほど。SendMessageで自分のウィンドウで処理した方が良さそうだな・・・
387
名前:
デフォルトの名無しさん
:2006/11/25(土) 20:44:20
>>374
http://www.geocities.com/SiliconValley/4942/cabmsgs.html
このページをShellGetPathで検索
388
名前:
デフォルトの名無しさん
:2006/11/25(土) 21:33:50
>>375-376
サンクス
389
名前:
デフォルトの名無しさん
:2006/11/26(日) 01:10:58
C#で遊んでるんですが、
参考にしているソースに"CCFree"って関数がでてきたんです。
これはなんでしょう?
http://bcbjournal.com/free_issue/June03-01.htm
のコードの一部です
// global PIDL, use CCFree()
ITEMIDLIST* pidl = static_cast<ITEMIDLIST*>(hMem);
if (pidl != NULL)
{
ITEMIDLIST* pidlcopy = shutils::ILClone(pidl);
shutils::CCFree(pidl);
return pidlcopy;
}
相当するWin32APIとかマネージAPIとかありましたら教えてください
390
名前:
デフォルトの名無しさん
:2006/11/26(日) 01:20:29
PIDLを解放するのに使っているから、CoTaskMemFreeやMarshal.FreeCoTaskMemに相当するものだと思う。
391
名前:
デフォルトの名無しさん
:2006/11/26(日) 02:19:21
いまさらVS6が欲しくても
もう売ってない
どうすればいいの?
392
名前:
デフォルトの名無しさん
:2006/11/26(日) 02:21:34
Javaの関係でMSDNからも削除されてたな
393
名前:
デフォルトの名無しさん
:2006/11/26(日) 02:21:42
エアーVS6でガマンする
394
名前:
デフォルトの名無しさん
:2006/11/26(日) 03:14:06
>>368
メモリにロードされたあとにも暗号化されてるのか?
395
名前:
名無しさん
:2006/11/26(日) 03:50:46
マルチポストだめもとで、投稿しますすみません。
現在、WindowsXP Pro+ VS2005 Proを使って開発中です。
1を入力されるとIMEがONになって、'あ' と表示するプログラムの作成中です。
以下のコードではIMEがONになってくれなくて、'a' と表示されます。
ご指摘お願いします。
void fnConvert(MSG *pMsg)
{
static int iCnt= 1;
if( (pMsg->wParam == 0x31) && (pMsg->message == WM_KEYDOWN) )
{
pMsg->wParam= 0x41;
break;
}
}
396
名前:
デフォルトの名無しさん
:2006/11/26(日) 03:54:31
>>395
IMEをオンにするコードはどこにあるんだよ
397
名前:
395
:2006/11/26(日) 04:06:23
395です。
>>396
さん
IMEをONにするコードがわからないのですが、、、
ご教授尾根がいします。
398
名前:
デフォルトの名無しさん
:2006/11/26(日) 04:12:22
while(1){
MessageBox(NULL, "IMEをONにしてください", "", MB_OK);
if(MessageBox(NULL, "IMEをONにしましたか?", "", MB_YESNO | MB_ICONQUESTION) == IDYES) {
break;
}
}
399
名前:
デフォルトの名無しさん
:2006/11/26(日) 04:14:58
>>397
というか最初からそれを聞けよwwwwww
IMEの操作なら
>>4
の猫でもわかるをみとけ
400
名前:
デフォルトの名無しさん
:2006/11/26(日) 04:15:29
?2BP(0)
>>395
ImmSetOpenStatus
401
名前:
395
:2006/11/26(日) 04:22:14
>>396
>>400
ご教授ありがとうございます。
完成したら、報告します。
402
名前:
デフォルトの名無しさん
:2006/11/26(日) 06:49:25
所詮、マルチ厨なんてこの程度か
403
名前:
デフォルトの名無しさん
:2006/11/26(日) 11:22:27
>>369
CLSID乗っ取り…というのが良く分からないのですが、
IDirect3DDeviceのCLSIDを書き換えるという感じでしょうか?(超適当)
実はCOMはバイナリ互換のコンポネートモデルであるという程度しか
知識が無いもので、お恥ずかしながらその辺りの応用に疎いのです。
>>377
なんと同じ事をしようとしている人が居るとは!
プログラム自体はキャプチャプログラムをMoEに限定するならd3d8.dllクローンを作って
偽Direct3DCreate8を作れば簡単にMoEのフロントバッファは取得出来るのですが、
Fraps等はどうやって認識しているんだろうな〜という知的好奇心から質問させてもらいました。
>>394
ちょっとグレーな話になるんですが、ゲームはASProtectで圧縮されてるみたいで、バイナリ自体を見ても
インポートされてる関数が明らかに少ないのです(おそらく元インポートテーブル展開用ルーチン)。
そしてロードされた後(正確にはゲームウィンドウが出た時)のメモリ上のヘッダでは、
INTが消されてIATがあるだけという状態になっています。もちろんIATがあるならd3d8.dllの
Direct3DCreate8をGetProcAddressでアドレスを取得し、アドレスを決め打ちで書き換えてもいいんですが、
どうもIATの展開が終わった時には既にD3Dの初期化は完了しているみたいで、
IATを書き換えた所でDirect3DCreate8を呼び出される事はありませんでした。
また長文で申し訳ない。
もっと簡潔に書けないのか自分はorz
404
名前:
389
:2006/11/26(日) 11:45:34
>>390
レスありがとう
pidlはいつもCoTaskMemFreeで解放するものなんですか?
405
名前:
デフォルトの名無しさん
:2006/11/26(日) 12:12:35
DDEってまだ使えるのかね
406
名前:
デフォルトの名無しさん
:2006/11/26(日) 12:17:36
>>403
>CLSID乗っ取り…というのが良く分からないのですが
CoCreateInstanceとかはレジストリを見てCLSIDから必要なdllやexeをロードするわけだから
DirectXのCLSIDに自分のモジュールを登録しておくの。
やったことないし、できるのかもわからんけど。
407
名前:
デフォルトの名無しさん
:2006/11/26(日) 12:18:32
>>404
MSDN読め
408
名前:
デフォルトの名無しさん
:2006/11/26(日) 12:57:39
>>403
Sorceforgeあさってて見つけたんだが
http://sourceforge.net/projects/taksi/
これは参考にならんかね
409
名前:
デフォルトの名無しさん
:2006/11/26(日) 12:58:44
>>405
Vistaでは使えない。
410
名前:
デフォルトの名無しさん
:2006/11/26(日) 13:17:03
>>409
NetDDE が使用不能になるってのは見つけたが、DDE そのものが使用不能になるって記事が見つからんのだが。
411
名前:
デフォルトの名無しさん
:2006/11/26(日) 13:32:20
DDE使えなくなったら動かなくなるアプリが大量にでないか?
412
名前:
デフォルトの名無しさん
:2006/11/26(日) 13:40:24
もともと動かなくなるアプリ大量にあるから問題なくね?
413
名前:
デフォルトの名無しさん
:2006/11/26(日) 13:45:38
今ちょっと試してみたら、
VistaのエクスプローラのフォルダウインドウじゃDDE使ってないみたいね
レジストリ(HKEY_CLASSES_ROOT\Folder)もなくなってる
>>389
も無駄な技術になったか
414
名前:
デフォルトの名無しさん
:2006/11/26(日) 13:46:23
>>410-411
実際、Vistaで動かしてみそ。ほとんど動かないから。(DDEサーバーがほぼ使えない)
ただ、中途半端にスダブが残っているので、その機能だけなら動くけど
415
名前:
デフォルトの名無しさん
:2006/11/26(日) 14:22:44
もしかすっとIE7にDDEでURL渡せないとか?
416
名前:
デフォルトの名無しさん
:2006/11/26(日) 15:14:15
>>408
DLL Injecttionで相手先のIDirect*インターフェースの
vtable乗っ取りしてるっぽいね。やっぱりこれしかないか
417
名前:
デフォルトの名無しさん
:2006/11/26(日) 15:31:53
めんどくさいなぁ。
いくつか書き直さないといけなくなるな。
418
名前:
デフォルトの名無しさん
:2006/11/26(日) 15:51:32
DDEって良く分からんが、何のためにあるの?
419
名前:
デフォルトの名無しさん
:2006/11/26(日) 15:54:22
お気楽プロセス間通信と理解している
420
名前:
デフォルトの名無しさん
:2006/11/26(日) 15:59:04
IPCは
・DDE
・window message
・named pipe(NT系)
・DCOM
が用意されてるんだが
DCOMはレジストリがウザい
named pipeは98系で使えない
ってことでwindow messageかddeになるのよね
他にあったら教えてたもれ
421
名前:
デフォルトの名無しさん
:2006/11/26(日) 16:03:04
socket
mailslot
RPC
後者2つは使ったこともないが
422
名前:
デフォルトの名無しさん
:2006/11/26(日) 16:06:57
名前なしのパイプ
メールスロット
RPC
(メッセージの一種だけど)WM_COPYDATA
423
名前:
デフォルトの名無しさん
:2006/11/26(日) 16:14:58
これこれ、共有メモリを忘れていますよ
424
名前:
デフォルトの名無しさん
:2006/11/26(日) 16:21:21
>>423
イベント通知ができません...
425
名前:
デフォルトの名無しさん
:2006/11/26(日) 16:56:40
>>424
名前付きイベントと組み合わせれば・・・
426
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:06:45
>>406
成程、CoCreateInstanceはレジストリのCLSID見てモジュールをロードするんですか、勉強になります。
しかしDirect3Dに関してはCOMで作ってるクセにDirectX8からCOMを逸脱しているらしく
CLSIDが登録されていない(=CoCreateInstanceでインスタンスを作れない)みたいです。
なんでこんな仕様になったのか理解不能なんですが、ともあれCLSIDからの乗っ取りアプローチは
Direct3D8に関しては無理みたいです(´・ω・`)
>>408
おお…これは、すごい。動画処理をVfWでやってるのが多少残念ですが(僕のプログラムでも
最初の実装ではVfWでしたが、処理が遅い+マルチスレッドを想定していないらしく、
プログラミングしづらい上に、2GB制限等のユーザー側の利便性を損なう欠点が多々見つかった事から、
DirctShowへの乗り換えを検討しています。)参考になりそうな部分はとても多いです。
実は僕C++は始めたばかりで、テンプレートクラス等個人的に見慣れない部分はありますが
がんばって解読してみようと思います。情報有難うございました。
そろそろ長引いちゃってアレなのでこの辺りで消えます。
付き合ってくださった皆さん本当に有難うございましたm(_ _)m
427
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:07:34
つまりwin9xしねばいいのにってことだな
428
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:14:50
>>413
Firefoxでフォルダ開くとどんどん新しい窓ができるのはそのせいカー
429
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:15:33
>>426
多分知ってると思うが
ttp://saw.minidns.net/software/
DirectXのHookはこれも参考になる
430
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:18:25
今SetWindowPosを使ってWindowを常に最前面に出しているのですが
フルスクリーンのゲームなどより前に出てきません。
フルスクリーンより前に持ってくることはできるのでしょうか?
431
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:24:15
>>430
ゲームがフルスクリーンになったあとに最前面にもってくる
432
名前:
デフォルトの名無しさん
:2006/11/26(日) 17:29:58
>>431
ゲームを起動した後に起動するということですよね?
それをしても負けてしまうのです;
433
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:04:40
>>432
タイマーで定期的に最前面にもってきてもだめか?
434
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:07:09
誰一人、ゲームが再描画の度に最前面に持ってきているのでは
という事に、ツッコミを入れない件について
435
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:23:17
>>433
タイマーで呼んだらきました。WM_CREATEでつくってそれっきりでした。
ありでした
436
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:29:51
>>434
そんなコード誰も書かないだろ
常識的に考えて
437
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:33:16
プログラマの常識的に考えて〜〜しない
そんな風に考えて(ry
まあ、解決したようでなによりだけどな
438
名前:
デフォルトの名無しさん
:2006/11/26(日) 18:33:51
すまんな
SetWindowPosで最前面にできないなら、ゲーム側で
何かしているとしか、考えられない。
それに、ベクターにいけば、そんなウンコアプリなんて
いくらでも存在してるから、恐ろしいのだよ。
439
名前:
デフォルトの名無しさん
:2006/11/26(日) 19:28:40
Createじゃタイミングが悪いんじゃないの?
まだウインドウないんだし
440
名前:
デフォルトの名無しさん
:2006/11/26(日) 19:38:35
いやフルスクリーンのゲームもまた最前面ウィンドウなんだから
最後にアクティブになるゲーム画面が前面に出ちゃうでしょ
だからフルスクリーンになった後に最前面化させないと出てこない
441
名前:
デフォルトの名無しさん
:2006/11/26(日) 20:31:06
ゲームのウィンドウをオーナーに指定すれば必ず手前に出る
442
名前:
デフォルトの名無しさん
:2006/11/26(日) 20:40:21
DirectXのフルスクリーンだと、どうしようもないんじゃね?
443
名前:
デフォルトの名無しさん
:2006/11/26(日) 20:41:32
フルスクリーンだとGDIのクリッピングを無視するから
ゲームの描画で上書きされる可能性はあるけど
ウィンドウマネージャ的には手前に出せる
444
名前:
デフォルトの名無しさん
:2006/11/26(日) 21:08:40
Vistaはまた挙動が違うんだろうなあ・・・
445
名前:
デフォルトの名無しさん
:2006/11/26(日) 21:12:10
ウィンドウズプログラムで質問したい事があります。
開発環境はVS2003です。SDKで作っています。
リストビュー(レポート)の中でドラッグの開始位置と終了位置のアイテムとサブアイテムを取得するために、
リストビューをサブクラス化してWM_LBUTTONDOWNとWM_LBUTTONUPを受け取ろうとしたのですが、
WM_LBUTTONDOWNは通知されるのに、WM_LBUTTONUPはプロシージャに通知されず困っています。
WM_LBUTTONUPを取得する方法を教えていただけないでしょうか?
446
名前:
デフォルトの名無しさん
:2006/11/26(日) 21:22:00
VistaのAeroモードでウィンドウの内容をBitBltすると
画面外の情報もちゃんと取れたのにちょっと感動
447
名前:
445
:2006/11/26(日) 21:24:58
補足します。
ダブルクリックの後にはWM_LBUTTONUPが通知されました。
プログラムはこのHPのサンプルを書き換えました。
ttp://wisdom.sakura.ne.jp/system/winapi/common/common15.html
WNDPROC DefListProc;
LRESULT CALLBACK ListProc(
HWND WH_Window,
UINT msg,
WPARAM wp,
LPARAM lp)
{
switch(msg)
{
case WM_LBUTTONUP:
MessageBox(WH_Window,"","",MB_OK);
break;
}
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
}
hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT ,
0 , 0 , 10 , 10 , hWnd , (HMENU)1 ,
((LPCREATESTRUCT)lp)->hInstance , NULL);
DefListProc = (WNDPROC)GetWindowLong(hList,GWL_WNDPROC);
SetWindowLong(hList,GWL_WNDPROC,(LONG)ListProc);
よろしくお願いいたします。
448
名前:
デフォルトの名無しさん
:2006/11/26(日) 21:38:59
試しにSpy++でマイコンピュータのリストビューのメッセージを見てみたが
ちゃんと、LBUTTONDOWN→MOUSEMOVE→LBUTTONUP来てたがね
まぁ、何かやってることがおかしいんだろうけど・・・
449
名前:
デフォルトの名無しさん
:2006/11/26(日) 21:57:43
フルスクリーンうぜぇ。
画面全体を有効に使っているならまだしも、
黒いスペースが埋められているだけだし。
せめてタクスバーを残してくれ。
450
名前:
445
:2006/11/26(日) 22:18:17
>>448
問題のプログラムをSpy++で覗いた所WM_LBUTTONUPは発行されていました。
ためしに
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
↓
return DefWindowProc(WH_Window,msg,wp,lp);
に変えてみたところ、WM_LBUTTONUPメッセージを取得できました。
リストビューのプロシージャが悪さをしているようなので、調べてみます。
ありがとうございました。
451
名前:
デフォルトの名無しさん
:2006/11/26(日) 23:35:16
教えてください。
CreateWindowExで拡張ウィンドウスタイルを使わないようにするには
CreateWindowを使えばいいんですがExのみを使うっていう前提の場合、
CreateWindowEx(NULL,・・・);でいいんでしょうか?
452
名前:
デフォルトの名無しさん
:2006/11/26(日) 23:55:05
>>451
イエス。拡張ウィンドウスタイルは(普通のスタイルもそうですが)スタイルを示すビットフラグの
論理和で示されるので、全てのビットが0=NULLを指定すれば拡張ウィンドウスタイルは無効になります。
正確には、なると思います。実際やって見た事がないので。
453
名前:
451
:2006/11/27(月) 00:08:22
>>452
ありがとうございます。
WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR
の定義も0x00000000なんですがこれはデフォルトでそうなってると解釈しました。
454
名前:
デフォルトの名無しさん
:2006/11/27(月) 00:15:24
>>453
その通り。それらは拡張スタイルを指定しなくても自動でそうなっているスタイル、
要するに拡張スタイルの指定と対比させるために敢えて定義された定数です。
455
名前:
デフォルトの名無しさん
:2006/11/27(月) 00:26:34
>>451
細かいことと思うかもしれないが、NULLはポインタ専用だ。そこには0使え。
456
名前:
デフォルトの名無しさん
:2006/11/27(月) 00:27:13
>>455
haxa?
457
名前:
451
:2006/11/27(月) 00:28:33
>>455
その辺はワーニング対策で#define DF_NULL 0x00000000を定義してそれ使ってます。
458
名前:
デフォルトの名無しさん
:2006/11/27(月) 00:44:57
CreateWindowは0Lを渡してるな。
459
名前:
デフォルトの名無しさん
:2006/11/27(月) 04:39:11
ものすごく見当違い名事をいってたらすいません
この先、microsoftが提供する開発環境って
platform sdk が無くなって、.net flameworkだけになるってことはありますか?
ちょっと疑問に思っただけなんですが
460
名前:
デフォルトの名無しさん
:2006/11/27(月) 04:51:25
Platform SDKと.NET Framework SDKはすでに統合されてWindows SDKになったけど
従来のPlatform SDKの内容(+Vistaの新API)は今のところそのまま入ってる。
将来的には(かつてのWin16 APIみたいに)Win32 APIはWDKに追いやられて
ユーザーモードアプリはWinFX API一本になるということもあるかもね
461
名前:
デフォルトの名無しさん
:2006/11/27(月) 06:56:20
CreateWindowも実は、CreateWindowExのマクロだからな・・・
ウィンドウ関係のAPIラッパクラスを作ってる時にはじめて知ったわ
462
名前:
デフォルトの名無しさん
:2006/11/27(月) 12:08:07
>>445
LVN_BEGINDRAGでメッセージループを廻しているかDoDragDropしているのか
463
名前:
デフォルトの名無しさん
:2006/11/27(月) 12:38:15
354と似た話になりますが、スクリーンセーバーのパスワード保護の
チェックが付いているかどうかって、レジストリから確認できるの
でしょうか。
464
名前:
デフォルトの名無しさん
:2006/11/27(月) 13:04:26
PC初心者
http://pc7.2ch.net/pcqa/
Windows
http://pc8.2ch.net/win/
465
名前:
デフォルトの名無しさん
:2006/11/27(月) 14:13:54
>>463
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
466
名前:
465
:2006/11/27(月) 14:16:37
>>463
間違えた・・・・
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
だ。
467
名前:
デフォルトの名無しさん
:2006/11/27(月) 18:31:49
質問いたします.
クリップボード内のデータの履歴を取り,再利用するものを想定しています.
テキストだけでなく,画像やリンクなどを含めたデータをクリップボードから取り出し,
保存するにはどのようにしたらよいでしょうか?
468
名前:
デフォルトの名無しさん
:2006/11/27(月) 18:42:38
調べたらわかりそうな気がするんだけど
469
名前:
デフォルトの名無しさん
:2006/11/27(月) 18:47:21
>>467
取り出すのはOpenClipboard, EnumClipboardFormats, GetClipboardDataなど。
保存は御自由に。
わからない事をもっと具体的に端的に質問することをお勧めします。
470
名前:
デフォルトの名無しさん
:2006/11/27(月) 18:49:52
http://pc8.2ch.net/test/read.cgi/tech/1162215248/817
471
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:01:30
>>455
今の規格上はNULLはゼロと同じ。
472
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:04:37
そういう問題じゃ無いと思うが
473
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:11:36
じゃあどういう問題なんだ?
474
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:30:47
FtpGetFile()でのダウンロード処理って途中で中断できないんでしょうか。
他にFtpでのダウンロードを中断する方法があったら教えてください。
お願いします、ほんとに。
環境はWinXP+VS2005のMFC+SDKです。
Win2000以降のみ対応できればよいです。
475
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:36:06
NULLはOSによっては0じゃない場合もあると昔聞いた事がある。-1も有りうると。記憶が頼りだけど。
476
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:37:49
NULLが実行環境に依存するのか?
コンパイラによって、ならまだ解るが。
477
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:39:24
折角Win32APIスレなのに
478
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:40:31
実行環境には依存しないがな
コンパイル環境によっては0じゃない場合もあるのは確か
479
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:51:25
>>474
WinINet使えば?
480
名前:
デフォルトの名無しさん
:2006/11/27(月) 22:59:04
が、うまくゼロであるとみなせるようにすることが規格として求められてる。 <NULL
481
名前:
デフォルトの名無しさん
:2006/11/27(月) 23:03:28
C と C++ でも違うんじゃなかったっけか
482
名前:
デフォルトの名無しさん
:2006/11/27(月) 23:21:24
ぬるぽの話題ここまで
483
名前:
デフォルトの名無しさん
:2006/11/27(月) 23:26:00
■━⊂( ‘ー‘)☆彡 ガッ☆`Д´)ノ
484
名前:
デフォルトの名無しさん
:2006/11/27(月) 23:58:51
>>467
>>769
OleGetClipboardのほうが形式を考えなくてすむから楽だと思うぞ。
485
名前:
デフォルトの名無しさん
:2006/11/28(火) 01:24:15
>>460
大変遅くなって申し訳ありませんがレスをいただきありがとうございました。
恥ずかしながらWindows SDKやWinFX APIというのは意味をよく知りませんでしたので
勉強になりました。ありがとうございます。
486
名前:
デフォルトの名無しさん
:2006/11/28(火) 02:47:44
>>475
内部表現の話とごっちゃにしてる。ここはWin32 APIスレだし。
それともWin32sではヌルポインタをアクセス違反にするためWin32アプリから見える
アドレスとVxDから見えるアドレスが64KBずれてるなんてトリビアを話したいのか。
487
名前:
デフォルトの名無しさん
:2006/11/28(火) 06:49:16
>>479
具体的にはどの関数を使えば…
488
名前:
デフォルトの名無しさん
:2006/11/28(火) 08:40:42
Win32環境だと0番地でいいけど、セグメンテーションだかの関係で0じゃない環境もあると聞いたな。
489
名前:
デフォルトの名無しさん
:2006/11/28(火) 08:52:56
NULLは、あくまでも無効(?)番地であって。数値の0をマクロで使えるようにしたものじゃない。
目的と手段を逆に取り違えている奴が世の中多すぎ。
490
名前:
デフォルトの名無しさん
:2006/11/28(火) 08:59:10
NULLが0なのではなく、0がNULLなのです。
491
名前:
デフォルトの名無しさん
:2006/11/28(火) 09:04:36
どうでもいい
492
名前:
デフォルトの名無しさん
:2006/11/28(火) 09:38:17
某流出ソースの中見てみたら数値の0として使ってますよ。
493
名前:
デフォルトの名無しさん
:2006/11/28(火) 09:42:13
「Half Life 2」のソース?
494
名前:
デフォルトの名無しさん
:2006/11/28(火) 09:45:11
>>487
それぐらい自分で調べろよ。
495
名前:
デフォルトの名無しさん
:2006/11/28(火) 09:52:26
HOGE* p = 0;
は、ヌルポインタの値が0でなくても、コンパイラによってその型のヌルポインタの値に変換される
と聞いたことがある。
だからC++ではNULLと0は等価らしい。
496
名前:
デフォルトの名無しさん
:2006/11/28(火) 10:23:31
MSDNのsdkのサンプルでこんなのが見つかるけど
FONTEDIT\FONTEDIT.C(566): (HWND)NULL, /* no parent */
FONTEDIT\FONTEDIT.C(567): (HMENU)NULL, /* use class menu */
497
名前:
デフォルトの名無しさん
:2006/11/28(火) 10:26:15
おまえらぬるぽ好きだな
498
名前:
デフォルトの名無しさん
:2006/11/28(火) 10:28:52
>>474
Wininetよく知らないからなんともいえないけど、
FtpOpenFileとInternetReadFileでやるんじゃない?
もしGUIアプリ作ってるんなら、これをスレッドでやる方法と
内部でメッセージループでやる方法があると思う。
結構大変だよ。
499
名前:
デフォルトの名無しさん
:2006/11/28(火) 11:19:22
>>496
SDKは空ハンドルにもNULL使うよな
500
名前:
デフォルトの名無しさん
:2006/11/28(火) 11:40:40
>>499
それとは別に INVALID_HANDLE_VALUE も使うし ややこしい
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.