>>947 の
「メッセージポンプがない」
に一票。
SetTimerのコールバックはメッセージポンプがないと
呼ばれないというのはFAQだぞ
バックグランド動く画面無しプログラムを作っています。
Console Applicationで作ったのですがDOS窓が開いてしまいます。
どうしたら画面無しで作れるのでしょうか?
Win32APIで制御できませんか?
DETACHED_PROCESSで起動する
NT系ならサービスにする
非コンソールアプリケーションにする
>>957 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR pCmdline, int nShowFlag)
{
return 0;
}
ソースを変更しなくても /subsystem:windows でいける
亀レスで申し訳ありません。仕事してたもので。
そもそも目的は、周期的にコールバックする機能が欲しかっただけなのです・・・・・・・
>>947,
>>949 間違えました。SetTimer(NULL,NULL,100,FUNC);でした。すいません。
>>948,
>>952,
>>953 メッセージディスパッチはやってませんでした。やる必要があったんですね。知りませんでした。ありがとうございます。
しかし、コンソールの場合ウインドウハンドルはどうすればいいのでしょう?
>>950 結局、そうしました。
>>951 それはちょっと・・・
>>945 PeekMessageのウインドウハンドルはNULLでおk
あ、GetMesssageでもな。
>>961 適当にループ回してWaitFor〜でタイムアウト待ち。これ。最強。
Sleep() でもいーとおもうけど timeGetTime() の方が精度がよいしゆーづーもきくんじゃないかな。
間違ってる?
>>965 どこからマルチメディア関数使う発想が沸いて来るのかと、小一時間(ry
そもそも、待ちができないし、timeGetTime()。
timeSetEvent()の事でしょ?でもどうかと思うよ、これ。
マルチスレッドだし。(最優先度のスレッドが起動する。)
初心者が使うのは1年はやい。
965はゲームプログラマなんでねーの。
コンソールアプリの標準入力・出力をパイプにつけかえて、
普通のWindowから操作したいと思っています。
(要はコンソールみたいなものを自前で作りたい)
起動したプロセスが標準入力(実際はパイプ)の入力待ちになっていたら
WM_CHARで来たキャラクタをパイプに突っ込みたいんですが、
「プロセスが入力待ちで待機している」
または
「パイプのRead側にプロセスが接続された」
という状態を知る方法はありますか?
パイプ書き込みスレッド作って自分で管理するしかないんじゃないの?
処理を受けてからできるだけ早く処理を返したいので、
続く処理をスレッドにしてしまって、放置して処理を返したいのですが、
CreateThreadで作成したスレッドハンドルはCloseHandleしないと
メモリに残ると聞きました。
そこで、CreateThread直後にCloseHandleしようと思うのですが、
スレッドが処理中にハンドルを閉じても、大丈夫なんでしょうか?
>>971 ちょっと試して大丈夫だからと言って、ずっと大丈夫な保証は無いぞ。
特にマルチスレッドなプログラムではな。
スレッドが走行中は参照カウントが1つ増えて、終了時に1つ減る。
それとは別にCreateThreadが返したハンドルのために参照カウントが
1つ増えて、ハンドルを閉じたときに1つ減る。
つまりハンドルを閉じなければ走行中の参照カウントは2になる。
だからスレッドが終了してもハンドルを閉じるまでは消えないし
逆にハンドルを閉じてもスレッドが終了までは消えない。
長々と書いたがようするに大丈夫ってこった
>>969 もちろん自前で管理します。
自前で管理するために、起動先のプロセスが標準入力の
入力待ちになったことを知りたいんです。
入力待ちになっていたらパイプに文字を書き込む。
入力待ちになっていなかったら何もしない。
要はパイプに書き込むためのトリガーが欲しい訳です。
訂正 ×プロセス → スレッド
1.スレッドの状態取得
2.待ち状態であれば待ち要因を取得
3.待ち要因が標準入力の入力待ちであればパイプに書き込み
というような処理をイメージしてます。
あるいは別のパターンとして
1.パイプの入力待ち行列を取得
2.待ち行列に起動先プロセスのスレッドがあればパイプに書き込み
なんてのでもいいです。
ITRONだとref_tskとかref_semとかのref_xxx系関数で上記のような情報が
取得できるんですけど、Win32APIでret_xxxに相当するAPIって何になるんでしょ。
MSDNを調べまわったんですけどどうにもわからなくって・・・。
976 :
デフォルトの名無しさん:04/04/10 22:16
こんばんは、猫でもわかるWindowsプログラミングを書店で買ってきたのですが
2章の最後の練習問題2がどうしてもできません。
「WM_PAINTで文字を出力して、WM_RBUTTONDOWNのときに先ほど出力した文字の
色を変えるようにしろ」という問題です。
WM_RBUTTONDOWNのときにInvalidateRectで消して文字色つきで再描画しようと
したのですが、永久ループになってしまいました。
プークスクスとか言われるかもしれませんが、どなたか解る人がいたら
教えてください。
>>976 まずどんなソースを書いたのか肝心の部分だけでいいから晒せ。じゃないとアドバイスのしようも無いぞ
ソースも書き込んだほうがよいと思われ
>>974 どうして入力待ちになったかどうか知る必要があるのか分からないんだけど。
>>974 WaitForInputIdle()じゃダメん?
最終的にこんなのを書きました。
頭悪いとか思うかもしれませんが、よろしくお願いします。
これは文字色は黒のままで右クリックしても変わりません。
WndProcのなかの一部です。
switch (msg){
case WM_PAINT:
switch(i){
case 0:
break;
case 1:
GetClientRect(hWnd, &rc);
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc,
(LPCTSTR)szStr,
(int)strlen(szStr),
&rc,
DT_LEFT );
EndPaint(hWnd, &ps);
break;
}
break;
case WM_RBUTTONDOWN:
InvalidateRect(hWnd, &rc, TRUE);
GetClientRect(hWnd, &rc);
dtp.cbSize = sizeof(DRAWTEXTPARAMS);
dtp.iLeftMargin = 20;
dtp.iRightMargin = 20;
dtp.iTabLength = 4;
983 :
976続き:04/04/10 22:48
hdc = BeginPaint(hWnd, &ps);
SetTextColor(hdc, RGB(255, 0, 255));
DrawTextEx(hdc,
szStr,
-1,
&rc,
DT_WORDBREAK | DT_EXPANDTABS | DT_TABSTOP,
&dtp);
EndPaint(hWnd, &ps);
i = 0;
break;
984 :
デフォルトの名無しさん:04/04/10 22:52
おはだつるるん
>>981 WM_PAINT のときに SetTextColor(hdc, RGB(r, g, b));
WM_RBUTTONDOWN のときに r, g, b の値を変更して InvalidateRect();
でいかが?
>>981 とりあえずWM_PAINT以外でBeginPaint/EndPaintしたらだめ。
>>985 できました!!ありがとう981さん!!
これでぐっすり眠れます。
自演乙
ちょっとスレ違いかもしれませんが、
API関係ということで、ここで質問させてください。
2003Serverで使えるAPIかどうかを調べるツールがMSのHPに
あるらしいのですが、どこにあるかわかりません。
どなたか教えてください。
また、それ以外に2003Serverで使用可能なAPIを調べる方法が
ございましたら、ご教授願います。
よろしくお願いします。
使ってみるに限る
>>990 そんなこと言わずに、教えてください。
お願いしますm(__)m
SDKに書いてあるだろうに‥‥
>>992 すみませんが、どうやったらSDKが参照できるのか
教えていただけませんか?
>>993 たとえば以下のように書いてある。これ以上何を望むのだ?
Windows NT/2000:Windows NT 3.5 以降
Windows 95/98:Windows 95 以降
>>994 >>993に適する回答はMSDN嫁なんじゃないかな。ドキュメントがどこにあるのか分かってないような言い方だから
なんだか、終わりかけなんで、
新しいスレッド立ててきますね。
大塚玲たま
999
大塚玲で1000げっとー
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。