Win32API質問箱 Build47
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/13(月) 08:56:12やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0257245
2006/11/21(火) 17:55:20ビットマップをいじるプログラムをさわったらなんとなくわかってきました。
教えてくれて、ありがとう。
あと、C言語ポインタ完全制覇という本に構造体の一番後ろで拡張するタイプの話がのってたので、
そっちも読んで理解してみます。な〜んでだろっていうのがすっきりして助かりました。
0258デフォルトの名無しさん
2006/11/21(火) 18:37:27ヘッダを開いて、それぞれの構造体の宣言部を見てみるのもいいと思うぞ
#ifdef _WIN_VER〜#endifとかあるから
0259デフォルトの名無しさん
2006/11/21(火) 18:47:33C言語をベースに勉強していて、
テキストエディタを作っています。
コモンダイアログの「検索」を出して、
エディタ内の文字列を探す所まではなんとかできたのですが、
その結果をエディタに表示する方法がよくかりません。
エディタの内容をchar配列に移して、
そこからstrstrで検索して、
見つかったら戻り値のポイントを調べて、
SendMessage(MyDataGet_hEdit(), EM_SETSEL,[戻り値], [戻り値 + 検索文字数]);
で結果を明示しようとしています。
見つかった文字列がエディタ内に表示されている状態ならば、
これでもよさそうなのですが、
表示されていない場合、スクロールを自分で動かして、
どこが選択されているか調べないといけないという、
検索した意味のない状態になってしまっています。
どうしたら普通の検索のように、
検索結果(選択状態の文字列)まで、
画面表示を自動スクロールさせられるのか、ヒントをください。
ターゲット環境が「分かる」必要なんか無いだろ。
ターゲット環境は「作るときに決める」物なんだから。
「ターゲットを決めうちする限りは問題ない」とする回答に「ターゲットが分からない」と
返す方がよっぽどAFOだと思うが。
0261デフォルトの名無しさん
2006/11/21(火) 19:08:290262デフォルトの名無しさん
2006/11/21(火) 19:29:22biSizeは言ってみれば構造体のバージョンナンバー。
BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADERのように
構造体が拡張された場合に、API側がbiSizeを見てどの構造体なのか
判断している。
これのおかげで、BITMAPINFOHEADERを要求するAPIにV4やV5の
構造体を渡すことができる。
ターゲットが分からないなんてのもお前限定の話だろ。
客のターゲットも調べないで要件を定義するのか?
0264259
2006/11/21(火) 19:50:09SendMessage(HANDLEエディタ, EM_SCROLLCARET, 0, 0);
基本的なメッセージ関連を勉強しなおしてきます。orz
0265デフォルトの名無しさん
2006/11/21(火) 19:55:230266デフォルトの名無しさん
2006/11/22(水) 08:17:04>biSizeは言ってみれば構造体のバージョンナンバー。
同意同意。
本当はマズいんだと思うんだけどね。
過去バージョン互換とか考えるとなー。
0267デフォルトの名無しさん
2006/11/22(水) 09:47:00Windows3.0以前から一応ソースレベルの互換性を維持してきたツケだな
0268デフォルトの名無しさん
2006/11/22(水) 13:03:41FillRectangle + LinearGradientBrushを使って四角形を描画すると
Rectのサイズによってはグラデーション開始位置に、グラデーション終了色が
出ます。(LinearGradientModeVerticalモード時は上1行だけ)
これはどうやれば防げるんでしょうか?
0269デフォルトの名無しさん
2006/11/22(水) 13:30:270270268
2006/11/22(水) 13:50:10Graphics 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座標を変えると全て正常に表示されることもあります。
0271デフォルトの名無しさん
2006/11/22(水) 13:52:17終了の0の時は、閉じるボタンorWM_CLOSEをPost、
WM_CLOSEはDefWindowProcで処理、
WM_DESTROYが来て、そこでPostQuitMessage(0)、
WM_QUITが来た時、同時にGetMessageの戻り値が0になり
メッセージループを抜けるという感じだと思うんですけど。
0272デフォルトの名無しさん
2006/11/22(水) 14:45:03MSDNくらい嫁や
0273デフォルトの名無しさん
2006/11/22(水) 15:22:58わん わん わわわん わん わん くんくん
(GetMessage関数は、WM_QUIT以外のメッセージを取得した場合は、TRUEを返すんだよ)
わん わん わわわん わん わん
(また、WM_QUITメッセージを取得した場合は、FALSEを返すんだよ)
わん わん くーん?
(わかったかな?)
0274デフォルトの名無しさん
2006/11/22(水) 16:03:37>>272
0275271
2006/11/22(水) 16:21:50>>223
エラーが発生した場合、-1が返ると書いてあります。
しかし、それで戻り値がintでなくBOOLなのがなぞですが。
WM_CLOSE、WM_DESTROY、WM_QUITを経由して
-1を返してくるか、いきなり-1を返すのかが分かりません。
実験しようにも-1戻り値エラーが発生したことがありませんし。
0276デフォルトの名無しさん
2006/11/22(水) 16:30:370277デフォルトの名無しさん
2006/11/22(水) 16:45:15GetMessageは「0、-1、other」の3種類の戻り値が有るから「while (GetMessage(lpMsg, hWnd, 0, 0))」は良くないって書いてあるけど
VCが自動生成するメッセージループって「while (GetMessage(lpMsg, NULL, 0, 0))」なんだよな
これってどうなんかねw
0278デフォルトの名無しさん
2006/11/22(水) 16:48:57> それで戻り値がintでなくBOOLなのがなぞですが。
GetMessageの戻り値は以前はTRUEとFALSEだけだった。
0279デフォルトの名無しさん
2006/11/22(水) 16:50:37を渡すと-1が帰ってくると聞いたことがある。
0280デフォルトの名無しさん
2006/11/22(水) 16:55:46そうか、そういう場合に失敗するのか。
いや、いままでGetMessageが失敗したことなんて無いもんだから。
面倒だから、こういうやり方してしまっているけど
while ( GetMessage( &msg, NULL, 0, 0) > 0 )
{
}
0281デフォルトの名無しさん
2006/11/22(水) 16:59:55while(true)とかで回すことになって、益々ヤバイことにならんか
0283デフォルトの名無しさん
2006/11/22(水) 18:48:41DLLを記述して、
hhk = SetWindowsHookEx(WH_KEYBOARD,// フックタイプはキーストローク
hHOOKKEY, // フック処理プロシジャへ
hInstDLL, //フックプロシジャは同一ファイルで記述
NULL); // 対象スレッドはすべて
if (hhk == NULL)
MessageBox( NULL,TEXT("フックかけられない"),TEXT("Error"),MB_OK)
と記述したところ、フック設定は毎回うまく行っているように見えるのですが、
自分で作成しウインドウへの入力は拾えても、他のプログラムの出した窓への入力
は拾えません。「グローバルフック」はキーロガーのように全部拾ってくれる
と思っていたのですが、こんなもんなんでしょうか。
WinXP,VisualC++2005 です。
0284デフォルトの名無しさん
2006/11/22(水) 19:35:05拾えるのはDLLの注入されたプロセス自身だけ
他のプロセスのメッセージを拾いたいなら、
何らかのプロセス間通信を使って自分のプロセスに送らないと駄目
グローバルフックを仕込んだdllをパスの通ったディレクトリに置く。
0286デフォルトの名無しさん
2006/11/22(水) 19:53:25パスが通ってる必要はない
0287デフォルトの名無しさん
2006/11/22(水) 22:04:48フックの種類はWH_CBTです
0288デフォルトの名無しさん
2006/11/22(水) 22:16:12>>272
0289287
2006/11/22(水) 22:21:17MSDN見たら書いてありましたorz
nCodeによってはwParamとかに入ってるんですね
スレ汚ししてしまってすみませんでした
0290デフォルトの名無しさん
2006/11/23(木) 00:02:42自プロセスで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;
}
0291デフォルトの名無しさん
2006/11/23(木) 01:50:30的外れだったらすまんが
CreateConsoleScreenBuffer
関連を使えばバックバッファを作成できるけど
0292290
2006/11/23(木) 03:18:04CreatePipeのくだりを消して
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)
0293デフォルトの名無しさん
2006/11/23(木) 07:37:040294デフォルトの名無しさん
2006/11/23(木) 08:58:52以前、win32アプリでAllocConsoleを使ってコンソールを作成した後標準出力をコンソールスクリーンに割り当てる
って事をやったんだけどAPIでやるとcoutやprintfは機能しなかった。
だけど標準関数(たしかfreopen)を使うとちゃんと出力されたし、
GetStdHandleを使って調べてもちゃんとスクリーンのハンドルが返ってきた
ちなみにcoutを開き直すのは駄目でした(coutはちゃんと出力できたけどprintfとかが駄目)
0295デフォルトの名無しさん
2006/11/23(木) 09:02:340296デフォルトの名無しさん
2006/11/23(木) 10:25:35プログラム内で出力先を選べるようにしたほうが楽だと思う。
C++ならstd::ostreamを引数にとって、呼ぶ側が必要に応じて
std::ostringstreamのオブジェクトを渡すようにするとかさ。
0297デフォルトの名無しさん
2006/11/23(木) 19:37:22拡張子がrtfのファイルに関連するアイコンデータがプログラムから
ひつようなのですが、レジストリエディタで確認すると
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1
になっていました。
このリソースIDは何番にしたらいいですか?ワードパッドみても
リソースIDが一番のアイコンはありませんでした。
よろしくお願いします
0298デフォルトの名無しさん
2006/11/23(木) 19:51:50複数行の文字列が表示される領域を正確に知りたいのですがどうすればいいでしょうか?
GetTextExtentPoint32だと折り返しがある場合に位置がずれてしまうのです。
0299デフォルトの名無しさん
2006/11/23(木) 20:01:14正の値 : 0から始まるアイコンのインデックス
負の値 : リソースID(ex. -3 -> リソースID 3)
0300297
2006/11/23(木) 20:14:53理解できました。
ありがとうございました。
0301デフォルトの名無しさん
2006/11/23(木) 20:24:37と
CreateFile
WriteFile
は
どっちが速い?
0302デフォルトの名無しさん
2006/11/23(木) 20:29:01実装と用途による。
0303デフォルトの名無しさん
2006/11/23(木) 20:30:54foutが何かは知りませんが、大き目のファイルを一気に書くような用途では
ストリームを使ってもAPIを直接使っても大して速度は変わらないと思います。
∵一般的にI/Oに時間が掛かりますから。
0304デフォルトの名無しさん
2006/11/23(木) 20:34:39たぶんfopen()とかはCreateFileで実装されてる
0305デフォルトの名無しさん
2006/11/23(木) 20:41:390306デフォルトの名無しさん
2006/11/23(木) 20:58:57って結局ドライブ自体かvwin32をCreateFileで開かないといけないわけか。
0307デフォルトの名無しさん
2006/11/23(木) 21:00:060308デフォルトの名無しさん
2006/11/23(木) 21:19:000309デフォルトの名無しさん
2006/11/23(木) 21:53:00正解は304
0310デフォルトの名無しさん
2006/11/23(木) 22:08:18同様にLoadLibraryで読み込まれたDLL内で確保したメモリがFreeLibraryで解放されるのでしょうか?
0311デフォルトの名無しさん
2006/11/23(木) 22:18:51されない
DLL作る人は気をつけよう
0312デフォルトの名無しさん
2006/11/23(木) 22:32:56レスありがとうございます
解放されないんですね、気をつけます
0313デフォルトの名無しさん
2006/11/23(木) 22:35:23・・・考えたら、されたら困るよな・・・
0314デフォルトの名無しさん
2006/11/23(木) 22:58:050315デフォルトの名無しさん
2006/11/23(木) 23:00:09違う最強なのは僕
0316デフォルトの名無しさん
2006/11/23(木) 23:01:350317デフォルトの名無しさん
2006/11/24(金) 00:14:510318デフォルトの名無しさん
2006/11/24(金) 01:55:46WM_PAINT内に以下の記述をしています。
draw() // OpenGLの描画関数
SwapBuffers(wglGetCurrentDC());
HDC hdc = BeginPaint(hwnd, &ps);
〜マウスドラッグによる四角の描画〜
EndPaint(hwnd, &ps);
すると、マウスドラッグで描かれた四角の部分がチラついてしまいます。
このチラツキを防止するにはどうすればよろしいでしょうか。
0319デフォルトの名無しさん
2006/11/24(金) 01:57:530320318
2006/11/24(金) 02:25:33どうも。以下にようにしてもチラつきました。
何か間違ってるでしょうか?
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);
0321デフォルトの名無しさん
2006/11/24(金) 02:33:51SendMessageじゃなくPostするとか
0322デフォルトの名無しさん
2006/11/24(金) 02:35:20SwapBuffersはどこ行った?
0323318
2006/11/24(金) 02:44:33draw(); // OpenGLの描画関数
SwapBuffers(wglGetCurrentDC());
HDC hdc = BeginPaint(hwnd, &ps);
〜320のコード〜
EndPaint(hwnd, &ps);
SwapBuffers(hdc);
てな具合です。
>>321
すみません。いまいちよく分かりませんでした。
0324デフォルトの名無しさん
2006/11/24(金) 02:53:47OpenGLの裏画面ってGDIじゃ描画できないんだっけ?
0325318
2006/11/24(金) 03:00:17> OpenGLの裏画面ってGDIじゃ描画できないんだっけ?
GLとGDIでコンテキストを分けてそれぞれ独立に描画できれば
自由度があって便利なんですが、やり方がよくわからず。
0326321
2006/11/24(金) 03:00:32・・・
WM_PAINを発行
を
case WM_MOUSEMOVE
if(ドラッグの最中){
PostMessage(自分,WM_PAINT・・・)
}
な具合。
0327デフォルトの名無しさん
2006/11/24(金) 03:06:060328318
2006/11/24(金) 03:11:08InvalidateRectでいいですよね。
>>326
それだとドラッグの最中に四角が描画されて、
同時にタイマーでアニメーションが描画されて、結局チラついちゃう気が…。
GL側で全部描こうかなぁ。
半透明とか楽だし…。
0329デフォルトの名無しさん
2006/11/24(金) 04:24:41GDIで書く方法が不明ならそれが一番いいかと。
0330デフォルトの名無しさん
2006/11/24(金) 06:39:42WM_PAINTはあくまで再描画するためのイベントだ
それ以外の描画は他タイミングで描け
つか、タイマー使ってんならWM_TIMERで描きゃいいじゃないかよ
0331デフォルトの名無しさん
2006/11/24(金) 09:25:430332298
2006/11/24(金) 15:23:540333デフォルトの名無しさん
2006/11/24(金) 15:40:370334デフォルトの名無しさん
2006/11/24(金) 16:56:55InvalidateRect(hWnd, NULL, TRUE);ってやってるからじゃないかな
最後FALSEでやっていろいろ調整するといいかも
その前にマウスドラッグで四角書くのにタイマー使う必要があるのかが謎だけど
0335デフォルトの名無しさん
2006/11/24(金) 17:59:40LoadLibraryEx()でDLLのインスタンスハンドル入手した後
どうやって解放すればいいですか?
どなたかお願いします。
0336デフォルトの名無しさん
2006/11/24(金) 18:04:39ハンドルというかただのアドレスだ。開放する必要はない。
DLLの開放という意味ならMSDNを見れ
0337デフォルトの名無しさん
2006/11/24(金) 18:39:04OpenGL のレンダーターゲットを BMPイメージonメモリDC にして そっちを GDI 描画
WM_PAINT はBMPを(BitBlt で)可視化 で多少融通が利くよ
0338デフォルトの名無しさん
2006/11/24(金) 18:48:460339デフォルトの名無しさん
2006/11/24(金) 19:21:01JavaのWindowListenerみたいな感じのが欲しいんだけど・・
0340デフォルトの名無しさん
2006/11/24(金) 19:25:17他人が作ったライブラリを中途半端に使うより、自分で必要な機能を盛り込んで作った方がいいけどな
0341デフォルトの名無しさん
2006/11/24(金) 19:26:510342デフォルトの名無しさん
2006/11/24(金) 19:28:36個人的に好みじゃないんだよな・・
適当に作ってみるか。レスありがとう。
0343デフォルトの名無しさん
2006/11/24(金) 19:36:55(すなわち自分のプロセス内で)実行する方法って
ありますでしょうか?
0344デフォルトの名無しさん
2006/11/24(金) 19:40:36バッチファイルを実行するコードを全部自分で書く。
0345デフォルトの名無しさん
2006/11/24(金) 20:07:33バッチの中に書いてあるコマンドも内蔵させる必要があるのかだな。
あるいは単にコンソールウインドウを不可視にしたいだけのかな?
0346デフォルトの名無しさん
2006/11/24(金) 21:42:42.NET FrameworkのWindows Forms。
あとMS発祥といえばATL/WTL。こっちはマクロ使うけど。
0347デフォルトの名無しさん
2006/11/24(金) 22:25:520348343
2006/11/24(金) 22:53:39WM_QUERYENDSESSION?かなにかが飛んできたときはもう
新規実行はできないと思うので、自分でやりたいのです。
0349デフォルトの名無しさん
2006/11/24(金) 23:20:05>>344
新プロセス起動できないんなら、外部コマンドも取り込まないとな。
0350tsurarete yarou.
2006/11/24(金) 23:42:25OS は何?
すれ違いだけど、Windows 2000/XP/Server 2003 なら
http://q.hatena.ne.jp/1140862112
が参考になるかも。
0351デフォルトの名無しさん
2006/11/24(金) 23:42:44直接の答えではないけれど、ログオフスクリプトではだめか?
0352デフォルトの名無しさん
2006/11/24(金) 23:57:23mem_hdc = CreateCompatibleDC(hdc);
SelectObject(mem_hdc, mem_bmp);
int a = GetDeviceCaps(mem_hdc, HORZRES);
int b = GetDeviceCaps(mem_hdc, VERTRES);
aとbの値が800にならないんだけどなんでだろう
0353デフォルトの名無しさん
2006/11/25(土) 00:07:560354デフォルトの名無しさん
2006/11/25(土) 00:08:29言われたので来ました。
ttp://support.microsoft.com/kb/403844/ja
PGが起動してるときだけスクリーンセーバが動かないPGを作ってるんだけど
リンク先のやり方だとパスワード保護されてるとうまく動かないんです
パスワード保護の時って発行されてるメッセージって違うみたいですが
どうすればフック出来るか知りたいんですが
■ このスレッドは過去ログ倉庫に格納されています