1 :
デフォルトの名無しさん :
04/10/28 21:38:55
ぐぁっ、前スレの人と同じミスを…スマソ あれだけ確認したのにな
前スレの終わり方はあれでよかったのか?
6 :
デフォルトの名無しさん :04/10/28 23:19:17
アバウトな質問ですみませんが、 XP pro でイベントビューアを見ると エラー発生アプリケーション 私のアプリケーション.exe、バージョン 1.0.1.4、 エラー発生モジュール ntdll.dll、バージョン 5.1.2600.1217、エラー発生アドレス 0x00008e22 というログを残すエラーが発生しました。 RtlFreeHeap のエントリポイントが近いので、RtlFreeHeap が怪しいと思います。 8月から10月の間で2台のパソコンで各1回ずつ発生しました。 私のアプリケーションは1〜2週間は連続稼動しています。 同じような現象で悩んだ方がいましたら、何かヒントを教えて頂けませんか?
> 989 名前:デフォルトの名無しさん 投稿日:04/10/28 21:32:33
>
>>987 > デザインの話じゃねぇの?
> もし一部のメニューが非表示になる機能だったら
> 絶対に止めとけ。使いにくくてしょうがない
個人の意見を押しつけるのはやめて下さい
絶対に止めとけ。使いにくくてしょうがない
絶対に便利。実装してチョ。
10 :
デフォルトの名無しさん :04/10/28 23:51:01
グレー表示ってさ、ユーザにとっては極め付けの冷たいインターフェイスなんだよな・・・ 2000でやってたアレも同系
モードレスダイアログでEnterを押して実行されるように 標準のボタンを作りたいのですが、やっぱり出来ません。 モードレスダイアログではリソースエディタで”標準のボタン”を 指定するだけで出来ました。 CreateWindowで親ウインドウを作成 CreateDialogで親ウインドウにダイアログを貼り付ける 親ウインドウのプロシージャ switch(msg) { //hWndDlgはダイアログのハンドル case WM_SETFOCUS: SetFocus (hWndDlg); break; メッセージループ while (GetMessage (&msg,NULL,0,0)) { if (hWndDlg && IsDialogMessage (hWndDlg,&msg)) { continue; } TranslateMessage (&msg); DispatchMessage (&msg); }
LoadImageのLR_LOADMAP3DCOLORSって、確かリソースが インデックスカラー値じゃないと使えないよね? 最近のウィンドウズのデフォルト色は、まず間違いなくインデックスカラー値から 外れてくるから、LR_LOADMAP3DCOLORSは使えない気がするんだけどどうだろう。
>>15 俺の勘違いかな。色を変えるというかパレットを変えるイメージだったのだが。
と思って今軽く試してみたけど、やはり出来ない気がする。時間が無くて適当でごめん。
>モードレスダイアログではリソースエディタで”標準のボタン”を >指定するだけで出来ました。 じゃ、問題なしだな
すみません。 SHChangeNotifyRegisterのことで質問があるのですが、どなたかお答え いただけますか?
質問を言ってくれないと答えられない。
環境はWinXP SP1,VC++ SP5で、最新のMS SDKへのパスを通してます。 SHChangeNotifyRegisterの起動時に、以下のパラメータを指定します。 第2引数:0x0001 | 0x0002(ファイル及びシェルからの通知を指定) 第3引数:SHCNE_ALLEVENTS(全てのイベントを受信) この状態で、イベントの一つであるSHCNE_CREATE(アイテムの作成)を 受信したいとき、アプリケーションを起動して「ファイルを保存」から ファイルを作成したときには受信しません。 右クリックで、「新規作成」から新規ファイルを作成したときには、受信します。 質問は、アプリケーションを起動して「ファイルを保存」からファイルを 作成したときに、どうやったらSHCNE_CREATEを受信できるかです。
DIBとDDBの違いがよう分からんのですけど。
質問です。 下のようなダブルバッファリングするようなプログラムを作ったのですが、どうもうまくいきません いろいろやってみたのですがよくわかりません。 どうすれば、うまく動くようになるでしょうか? 症状 : うまく転送されていない、とおもう。(色を指定してもメッシュがかかったような白黒になる、白、黒はうまくいった) プログラム : //省略 case WM_PAINT: { PAINTSTRUCT ps; HDC hDc = BeginPaint( hWnd , &ps ); HDC hbDc = CreateCompatibleDC( hDc ); HBITMAP hBitmap = CreateCompatibleBitmap( hbDc , 640 , 480 ); HBITMAP hOldBitmap = SelectObject( hbDc , hBitmap ); { HBRUSH hBrush = CreateSolidBrush( RGB( 100 , 0 , 100 ) ); SelectObject( hbDc , hBrush ); PatBlt( hbDc , 0 , 0 , 640 , 480 , PATCOPY ); DeleteObject( SelectObject( hbDc , GetStockObject( WHITE_BRUSH ) ) ); } SelectObject( hbDc , GetStockObject( BLACK_BRUSH ) ); Rectangle( hbDc , x , y , x + 100 , y + 100 ); BitBlt( hDc , 0 , 0 , 640 , 480 , hbDc , 0 , 0 , SRCCOPY ); DeleteObject( SelectObject( hbDc , hOldBitmap ) ); DeleteDC( hbDc ); EndPaint( hWnd , &ps ); break; } //省略 きゃらの座標(x,y)更新後、InvalidateRect( hWnd , NULL , FALSE)としてWM_PAINTメッセージを発生させています。
createcompatiblebm( hDc
ありがとうございました、おかげで解決できました。 よく見るとAPIのヘルプに書いてありましたね。 見逃していました。 ほんとにありがとうございました。
>>22 よくコード見て無いけど、SetMapMode(hDC,MM_TEXT);とかモード設定してみ
あと、コードの途中の{}は何だ?
>>20 以前SHChangeNotifyRegister()を使ったところ、あまり当てにならなかった記憶がある。
ReadDirectoryChangesW()の方がお奨め。
NT系専用だけどな まあそろそろ9xは切り捨ててもいいか
>>26 ReadDirectoryChangesWについて質問していいですか?
ファイル数やディレクトリ数のエントリ数が多数で、ディレクトリの階層が深い
場所(例:OSの入っているドライブ)をルートから監視するとき、
ReadDirectoryChangesWを起動している間のパソコンのパフォーマンスは
悪くなりますか?
Winn2000以降とかでいいんだけど、現在のプロセスだけじゃなくて、 システムのプロパティから見れる環境変数を変える事って出来ない? インストーラーとかが時々やってるけど…。
>>17 すいません。
モーダルダイアログの間違いです。
モードレスダイアログでは出来ないのです。
どうすればいいのでしょうか?
CreateThreadに引数を渡そうと思ってます。各スレッドに0,1,2という引数をそれぞれ渡したいのですがなぜかすべてのスレッドに3が渡されています。 ポインタがらみだと思うのですがどう書けばうまくいくのかわかりません。アドバイスお願いします。
書いたプログラムです。 #include <stdio.h> #include <windows.h> DWORD WINAPI Testthread(LPVOID); int main() { int i; HANDLE hTh[3]; DWORD tid[3]; for (i=0; i<3; i++) { /* スレッドを作成 */ hTh[i] = CreateThread(NULL,0,Testthread,(LPVOID)&i,0,&tid[i]); } WaitForMultipleObjects(3, hTh, TRUE, INFINITE); for (i=0; i<3; i++) { CloseHandle(hTh[i]); } return 0; } DWORD WINAPI Testthread(LPVOID lpx) { int num = *((int *)lpx); printf("%d\n", num); return 0; }
>>33 hTh[i] = CreateThread(NULL,0,Testthread,(LPVOID)i,0,&tid[i]);
int num = (int)lpx;
>>35 アドバイスありがとうございます。その方法でできました。
なぜそれでできるのかまだわからないですが・・・void*型調べてみます。
>>36 CreateThread() した瞬間に作ったスレッドが走り出すとは限らない。
CreateThread() が3回呼ばれた後にそれぞれのスレッドが動き始めるん
だろう。
38 :
デフォルトの名無しさん :04/10/30 16:24:51
画面上にある全てのウィンドウを半透明化した後、 透明度を255にして元に戻したのですが、 前よりかなり重くなりました。 何かマズいことをしたのでしょうか?
すいません。
ここに書かれているやり方でWS_EX_STYLEを外そうとしたのですが、
適用したウィンドウの全ての内容が左右反転してしまいました。
ttp://hitokuso.kicks-ass.org/progtips.html しかもとてつもなく重いです。
LONG my_style;
my_style=GetWindowLong(hWnd,GWL_EXSTYLE);
my_style&=~WS_EX_LAYERED;
SetWindowLong(hWnd,GWL_EXSTYLE,my_style);
すいません、なおりました。 一部 GWL_STYLE と書き間違えていたのが問題だったようです。 焦って混乱してましたが、解決しました。 お騒がせしました。
>>34 >>36 #include <stdio.h>
#include <windows.h>
DWORD WINAPI Testthread(LPVOID);
int main() {
int i, d[3];
HANDLE hTh[3];
DWORD tid[3];
for (i=0; i<3; i++) {
/* スレッドを作成 */
d[i] = i;
hTh[i] = CreateThread(NULL,0,Testthread,(LPVOID)&d[i],0,&tid[i]);
}
WaitForMultipleObjects(3, hTh, TRUE, INFINITE);
for (i=0; i<3; i++) {
CloseHandle(hTh[i]);
}
return 0;
}
DWORD WINAPI Testthread(LPVOID lpx) {
int num = *((int *)lpx);
printf("%d\n", num);
return 0;
}
>>35 は場当たり的な回答だから真似するな
>>43 32bit環境ならintもポインタも4byteだから
単一の値を渡すだけなら
>>35 は常套手段だと思うけど。
他アプリのステータスバーの文字列を取得したいのですが、 SB_GETTEXTでは他アプリのステータスバーには無効らしくうまくいきません。 ググっていると共有メモリを使うとよい、という話も有るようなのですがさっぱりわかりません。 何か簡単な方法はないものでしょうか?
>>45 他アプリというのは自分でつくったアプリ?
なら共有メモリを使うだけじゃ無理じゃないかな。 俺が思いつくのは、 1. 自作のDLLをそのアプリに注入する (SetWindowsHookEx) 2. そのDLLはSB_GETEXTでステータスバーの文字列を取得する 3. 共有メモリを使って (WM_COPYDATAとかでもいいけど) DLLから自作アプリに文字列を渡す もっといい方法があるかもしれないので参考までに。
49 :
デフォルトの名無しさん :04/10/31 04:47:31
WriteConsole()で出力しようと思ってGetStdHandle(STD_OUTPUT_HANDLE)で 標準出力のハンドルを取得して、使い終わってもCloseHandle()などで閉じる必要は 無いんでしょうか? というか何度もその都度GetStdHandle(STD_OUTPUT_HANDLE)で取得しても良いんでしょうか? void hoge() { HANDLE out; DWORD num; out = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsole(out, "aaa", 3, &num, NULL); //CloseHandle(out); //<=これをすると2回目以降出力されなくなる } int main() { hoge(); hoge(); }
50 :
デフォルトの名無しさん :04/10/31 05:01:35
>>49 GetStdHandleはCloseHandleするな。
何度もGetStdHandleするのが気になるなら、静的変数なんかにしろ。
任意のプログラムのファイル入出力を 監視するツールを作りたいのですが、上手く行きません。 他プロセスの入出力を監視するには、 CreateFileやRead/WriteFileをフックすれば良いと思い、 Kernel32.dllのラッパーを作成しようとしているのですが、 明示的リンクを行うためのGetProcAddress関数等が Kernel32.dllに含まれるためか、コンパイルが通りません。 他の方法を試そうにも、これ以外思い浮かばず困っています。 Kernel32.dllのラッパーを作る方法、 又は、他プロセスのファイル入出力を監視する方法を 知っている方居ましたらお願いします。
55 :
デフォルトの名無しさん :04/10/31 19:38:11
ローカルフックを使いたいのですが、 どこか詳しい解説をしてあるサイトはありませんでしょうか? システムフックは今回使わないつもりです。 自分なりに調べてやったら、 どこかが間違っていたらしく、 タスクバーから何から消えた上に終了までできなくて困りましたので。
58 :
デフォルトの名無しさん :04/10/31 20:17:03
acmを利用してWAVEファイルのフォーマットの変換に挑戦しているのですが うまくいかないところがあるので質問させてください。 データが小さい時はacmStreamConvertを一回呼び出して終わりでこのときはきちんと変換されます。 一方、大きいWAVEファイルを変換する場合に、ループ処理で少しずつ変換させていったところ 関数自体は成功するんですが、いざ再生するとノイズの嵐になります。 以下ソース(StreamHeaderはACMSTREAMHEADERです。) for(dwOffset=0,dwRest=dwSrcSize;dwRest>0;){ //ソースから読み取り dwRead = min(dwDefRead,dwRest); src.FillWaveStream(dwOffset,StreamHeader.pbSrc,dwRead);//dwOffsetからdwReadだけpbSrcにWAVEストリームコピー dwRest -= dwRead; dwOffset += dwRead; //変換 ::acmStreamConvert(hAcmStream,&StreamHeader,ACM_STREAMCONVERTF_BLOCKALIGN); //バッファに書き込み dst.insert(dst.end(),StreamHeader.pbDst,StreamHeader.pbDst + StreamHeader.cbDstLengthUsed); } デバッガで追っていてもエラーコードは返ってきていないので原因が分かりません。 ネットで調べてもacm関連のページはあまり見つからなくて解決できませんでした。 どなたかどこが間違っているか分かる方がいましたら教えてください。よろしくお願いします。
>>45 VirtualAllocExでそのプロセス内にメモリを確保してSB_GETTEXTしてReadProcessMemoryとかで読み込んであげる。
プロセスごとにアドレスが違ってるから普通にポインタは渡せないってだけ。
OSによっては共有メモリでプロセスが違ってても同じアドレスになる。
プロセスの作成を監視する手軽な方法ってないでしょうか? FindFirstChangeNotificationみたいな感じにプロセスが作成されたのを通知してくれるAPIとかあるといいなと思うのですが。
>>58 acmStreamConvert に送ったデータを変換関数が全て使い切ってない。
dwOffset を読み込んだバイト数でなく変換関数が使った分(cbSrcLengthUsed)だけ進める。
速レス、ありがとうございました。
>>54 ドライバに関する知識がないので、難しそうですが、
ドライバってハードウェア制御する以外にも色々出来るんですね。
勉強してみたいと思います。
>>56 リンク先斜め読みしただけですが、参考になりそうです。
APIのジャンプテーブルを上書きとか、とても思いつきませんでした。
Advanced Windowsはちょっと高すぎるので、
とりあえず立ち読みをしてみます・・・。
>>57 良いソフトの紹介ありがとうございます。
使ってみます。
OSのデフォルトコードページを、自プロセスだけ、少しの間変更するようなAPIって無いんですか?
>>61 速レスありがとうございます。
> dwOffset を読み込んだバイト数でなく変換関数が使った分(cbSrcLengthUsed)だけ進める。
とありますが、この場合、StreamHeader.pbSrcには前回使われていなかった部分の先頭からでいいのでしょうか?
こんな感じに・・・
dwRead = min(dwDefRead,dwRest);
src.FillWaveStream(dwOffset,StreamHeader.pbSrc,dwRead);//dwOffsetからdwReadだけpbSrcにWAVEストリームコピー
//変換
::acmStreamConvert(hAcmStream,&StreamHeader,ACM_STREAMCONVERTF_BLOCKALIGN);
//オフセットとかの計算
dwRest -= StreamHeader.cbSrcLengthUsed;
dwOffset += StreamHeader.cbSrcLengthUsed;
//バッファに書き込み
dst.insert(dst.end(),StreamHeader.pbDst,StreamHeader.pbDst + StreamHeader.cbDstLengthUsed);
上のソースでうまくいってるっぽいです。 どうもありがとうございました。
>>59 なるほど。それはシンプルだね。
俺の方法は無駄に複雑にしている気がしてたんだよ。orz
今試せる環境がないので質問させてほしいんだけど、
VirtualAllocExの前に相手プロセスをOpenProcessするわけでしょ。
ログオンユーザーが一般ユーザーやゲストのときでも成功するの?
>>66 そういえば、一般ユーザーとかで試したことなかった。
取り合えず試してみたが、一般ユーザーでも問題なく動いたよ。
サンクス おもしろそうだし、明日にでもやってみよう。
>>67 当方Win9x系なのですが、ググっているとVirtualAllocExを使う方法は
Win9x系では使えない(?)というような話が出ていたのですが
Win9x系でも出来るのでしょうか?
>>60 フックタイプをWH_CBTにしてSetWindowsHookEx()をコールする。
DllMain()のPROCESS_ATTACHでプロセスが作成されたと判断する。
ってのはどう?
73 :
デフォルトの名無しさん :04/11/01 11:00:10
エクスプローラからファイルがドロップされた時に ファイル名を受け取るにはどうすればいいですか?
>>73 WS_EX_ACCEPTFILES
WM_DROPFILES
OLE Drag and Dropを使ったアプリを書いているのですが、他のアプリケーションで ドラッグが始まったことを知りたい場合はどうやったらいいのでしょうか?
>>76 ただのドラッグなら不可能。何を持ってドラッグ化はアプリ側で定義可能だから。
他のアプリのOLEドのラッグなら、知る方法があるが、
自分のアプリにドロップされようとしていないのに、
知ろうとするのはアプリとして間違っている。
78 :
デフォルトの名無しさん :04/11/01 12:17:08
ツールバーをサブクラス化したのですが、 そのサブクラスがWM_COMMANDだけを受け取ってくれません。 メッセージボックスでチェックしたところ他のは受け取っているようなんですが・・・ ツールバーはCreateWindowExで作成し、 サブクラス化した後、ボタンを追加しています。 どこか問題があるのでしょうか?
>>78 WM_COMMANDを受け取るのは親ウインドウだろ。
ツールバーのクラスが親に投げているので、サブクラスで取れるわけないじゃん。
>>78 親ウィンドウにWM_COMMANDが送信されてると思う。
81 :
デフォルトの名無しさん :04/11/01 12:32:59
>>79-80 なるほど。
すいません、知りませんでした。
ツールバーのどのボタンが押されたかをサブクラスで知るにはどうしたらいいのでしょうか。
ウィンドウプロシージャを弄れないので、サブクラスで受け取らなきゃいけないんです。
>>81 ボタンなんかとれません。ツールバーのは、実はボタンじゃないから。
SPYで見てみると、このことはわかります。
なので、ツールバーを持つウィンドウクラスを一個作ってラップするか、
ツールバーを自作してください。
>>81 親ウィンドウをサブクラス化する手もあるね
早速ReadDirectoryChangesWのサンプルソースを使って見ましたが、 重くなるような感じはしませんでした。 それで、ReadDirectoryChangesW()を使う上で一つ疑問が生まれました。 ファイルやディレクトリの変更があった瞬間で、行ったユーザ名の情報を どうやって取得するかです。 ネットワークでの共有ディレクトリを監視したいときに、誰がその行為を したのかという情報を得たいためです。 ファイルやディレクトリに関するAPIを探してみましたが、ありませんでした。 どなたか何らかの方法をご存知でしたら、教えてください。
あるウィンドウ上にBUTTONを三つほど乗せているんですが、そのボタンの上でマウスホイールが クリックされたことを知るためにサブクラス化を用いようと思っています。この場合、そのメッセージを 受け取るためのコールバック関数はそれぞれ別にする必要はありますか?
できるみたいなのでやってみます。すれ汚しすいませんでした。
>>85 補足です。
ユーザ名を得る関数は、GetComputerNameやGetUserNameの2つがあることは
知っています。
85での取得イメージとして、ReadDirectoryChangesWで得られるFILE_NOTIFY_INFORMATION
構造体にあるファイルやディレクトリ情報を使って、ユーザ名を得たいです。
windows2000で、 ネットワークアダプタにケーブルが接続されているかどうかを 取得できるAPIはないでしょうか? XPだと、Win32_NetworkAdapterクラスの NetConnectionStatusプロパティを参照で行けたのですが・・・
BCCをウェブ講座参考にしていますが、DIBの仕組みの辺りで躓いてます。
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win120.html bmpInfo = (BITMAPINFO *) malloc (bmpFileHeader.bfOffBits - dwBytes);
bmpFileHeader.bfOffBits - dwBytesの計算が分かりません。
dwBytesはそれ以前に代入された
ReadFile(hFile , &bmpFileHeader , sizeof (BITMAPFILEHEADER) , &dwBytes , NULL);
で代入されたBITMAPFILEHEADERのバイト数だと思うので、
ピクセルビットの開始点までの範囲からファイルヘッダの範囲を引いたら、
情報ヘッダ(BITMAPINFO)のメモリのサイズが求められるって事ですか?
91 :
デフォルトの名無しさん :04/11/01 20:59:48
>>91 ソースをコピペして試してみたところ、
Windows2000でも目的の動作を実現できました。
これから、ゆっくりソースを読んで理解したいと思います。
ありがとうございました。
>>77 回答ありがとうございます。
>アプリとして間違っている。
ユーザーに有効無効を設定できるようにするので問題ないようにも思います。
目的はOLEのドラッグの検出のみです。なにか、ぐぐるのキーワード等教えていただけないでしょうか?
>92 ああ。何となく確信もてた。スマソ。 ビット苦手だOTZ
97 :
デフォルトの名無しさん :04/11/02 14:04:52
起動ドライブのProgram Filesフォルダを取得するAPIを教えてください
>>97 SHGetSpecialFolderLocationで、CSIDL_PROGRAM_FILES指定
>>98 SHGetSpecialFolderLocationでぐぐったけどその定数定義してるとこみつからなかった〜
でもできますた、ありがとうエロい人
>>71 98/Meにはエントリはあるがダミーだよ
(常にERROR_CALL_NOT_IMPLEMENTEDを返すだけ)
レジストリに書いてなかったっけ
>>97 ナウなヤングはSHGetSpecialFolderPath()を使うよ。
同じプリンタに対して同じ印刷データを 通常のアプリケーションからは印刷できるけど サービスプログラムからは印刷できないっす。 サービスはシステムローカルアカウントが動作するのが 原因と思われるんですけど、 印刷できるようにすることってできますかね?
>>103 俺も、サービスからネットワークプリンタに印刷できなかったことがある。
ネットワークにアクセスする権限がないんだと納得してたんだけど
ローカルプリンタでもダメなのか。
それはともかく、俺の場合はLogonUser APIを使って
ネットワークにアクセスできるユーザーに偽装することで回避した。
デスクトップにアクセス?
プリンタドライバをどうやってインストールしたか、 が関係する可能性もある。 コントロールパネルの「プリンタの追加」?
>>102 本当にナウなヤングはSHGetFolderPathだろ
ナウなぺヤングソースやきそば
109 :
デフォルトの名無しさん :04/11/03 11:50:02
CDDBに接続して曲名を取得する方法をぐぐってるのですが、CDDBの使い方とかばっかりで技術的なのが出てきません。 そういう資料があるサイト知ってる方、教えて下さい。 多分、WinSock絡みの処理になるのかなーWinSock使った事ないなーとか考えつつ(;;´Д`)ハァハァしてます。
>>109 通信内容見てみればやってることは簡単にわかるけど、たしかライセンスいるよ
CDDB ライセンス でぐぐってみ
>>109 あと音楽関係のソフトはオープンソースが多いから
直接ソース見ればいい
>>110 のは FreeDB のライブラリだろ?これライセンスいったっけ?
Gracenote CDDB はライセンスが必要だが。
libaudiocdってのは、ダウソできなくなってる・・・。 ライセンスいるんですかー・・・。だよなー、そううまい話がある訳ないよなぁ・・・。 あとこれ、パッと見た感じGNUぽいですね。とすると、これ使ったら漏れもソース公開しなきゃならんって事ですか。 読みやすいコードに心がけなくては・・・。
>>106 単に、プリンタを使えるユーザーならプリンタを使える、
というだけな気がする。
>>115 GNU使う時は、その辺が嫌だね
いい加減に書いたソースでも公開しないといけない
質問です。 メッセージループのメッセージのないところの処理に DWORD lNowTime = GetTickCount(); static DWORD lOldTime = 0; if( ( lNowTime - lOldTime ) > 2 ){ SetForegroundWindow( hWnd ); lOldTime = lNowTime; } 〜処理〜 と書いたのですが、起動した後すぐにアクティブになるだけで 後はぜんぜんアクティブになってくれません。 常にアクティブ(最前面)にするにはどうしたらよいでしょうか?
>>115 そもそもlibaudiocdはWinじゃないだろ
そもそもメッセージループのメッセージがないところの処理て。
>>118 DWORD lNowTime;
static DWORD lOldTime = 0;
lNowTime; = GetTickCount();
if( ( lNowTime - lOldTime ) > 2 ){
SetForegroundWindow( hWnd );
lOldTime = lNowTime;
}
そもそもアクティブと最前面はまったく違う概念なわけだが 常にアクティブ(最前面)って何やねん
システムモーダル。
BringWindowToTop()ってのもあるよな。
ありがとうございました。 >そもそもアクティブと最前面はまったく違う概念なわけだが なんとなく違うということはわかるのですが・・・・、 フォアグラウンド、アクティブなどでしょうか? 詳しく説明しているサイトなどはありますでしょうか? それと、キー入力(フォーカス?)を自分にもってくるということはできるでしょうか? 最前面にもってきてユーザーからの入力を求めるような感じの。 SetFocusで、できそうなのですができません。
TOPMOST
>>115 >あとこれ、パッと見た感じGNUぽいですね。とすると、これ使ったら漏れもソース公開しなきゃならんって事ですか。
GNUな部分だけDLLにして逃げる、という手もある。
その代わり、せっかく作るなら使いやすいDLL作れよ・・・
>>128 それダウンロードできないしWindows用じゃない。
適当に検索して見つかったやつを内容も見ないで無責任に教えたんだろう。
>>129 Windows用じゃなくても、ソースを見れば何やってるか見当が付くだろう?
>>130 わざわざWindows用じゃないやつのソース見んでも
Windows用のソースがいくらでもある。
>>131 いくらでもあるなら、なんで教えてあげないの?
VC++6でWritePwrScheme()を使ったプロセスを作っています。 「powrprof.h」と「powrprof.lib」を使用してビルドを行うと リンクの時点で error LNK2001: 外部シンボル " "unsigned char __stdcall WritePwrScheme(unsigned int *,char *,char *,struct _POWER_POLICY *)" (?WritePwrScheme@@YGEPAIPAD1PAU_POWER_POLICY@@@Z)" は未解決です とエラーが発生しビルドできません。 「powrprof.h」と「powrprof.lib」のバージョンが合っていないのでしょうか? そうだとしたらVC++6でビルドできる「powrprof.h」と「powrprof.lib」は どうやって入手すればよいのでしょうか? ちなみに CanUserWritePwrScheme()でも同一リンクエラーが発生します
>>134 そもそも、素のVC6に「powrprof.h」と「powrprof.lib」ってあったっけな・・・
とりあえず、
>>2 のPlatformSDK updateしてみたら?
>>137 >素のVC6に「powrprof.h」と「powrprof.lib」ってあったっけな・・・
VC7にあるのを使ってますが、蛇道ですか?
>>104 亀レスでスマソ
LogonUserのAPIでいけそうです
で、そのLogonUserのパラメータへ設定するドメイン名/ユーザー名/パスワードを
事前にチェックようと思いまして、
NetUserChangePasswordで新旧パスワードを一緒にしてチェックをしてみたんですけ
ど、
該当ドメインに参加してない端末から、ユーザ名/パスワードが正しいかをチェック
しようとすると
ERROR_CANT_ACCESS_DOMAIN_INFO(1351)というエラーが返却されるんですが、
他にユーザ名/パスワードをチェックする方法ってあったりするんでしょうか?
>>134 これはどうだ?
extern "C" {
#include <powrprof.h>
}
>>140 スゲー 美しくは無いけどその発想に脱帽
発想って… 常套句なんだがなあ
144 :
デフォルトの名無しさん :04/11/04 17:37:23
タスクバーのアイコンをクリックしたときのメッセージを教えてくださ
WM_LBUTTONUP
エロい人ありがとう
147 :
デフォルトの名無しさん :04/11/04 19:09:55
エディットボックスに半角英数しか 入力できないようにするにはどうしたらよいでしょうか。
>>135 Gracenoteのサンプルあっさり動いた。
ライセンスまだ届いてないけどいいのか?
Windows98 と bcc5.5.1 を使ってますが、GetSystemMetrics() は 戻ってきた時、レジスタ eax, edx, ecx を破壊していませんか? たとえば GetSystemMetrics(SM_CXSCREEN); と呼んでみた時です デバッガで、この関数の前後でのレジスタの変化をみました この関数は windef.h や winuser.h の中で #define CDECL _cdecl #define WINAPI CDECL int WINAPI GetSystemMetrics(int nIndex); と宣言されているようです 返り値のために eax が破壊されるのはわかるのですが てっきり edx, ecx は保存されていると思っていた… WINAPI は、eax, edx, ecx を破壊する呼び出し規約でしょうか?
>>149 確か x86 用の VC++ (Microsoft の C/C++ コンパイラ) の ABI では、
関数呼び出しで ebp 以外の汎用レジスタはどれも破壊しても構わない
ことになっていたような気がする・・・bcc でも同様でしょう。
win2000,VC6でMFCを使わずにwindowsアプリを開発しています。 マウスカーソルを消したいのですが、どうすればいいでしょうか? ShowCursor(true)は、ウィンドウ外に行くとマウスカーソルが表示されてしまいます。 SetCursor(NULL)とやってみましたが、マウスカーソルが消えすらしませんでした。
SetCaptureしてからShowCursorすれば?
アフォの言うことは聞かないように
154 :
デフォルトの名無しさん :04/11/04 20:24:41
>>152 さん、どうもです。
SetCapture(hWnd);
ShowCursor(false);
こう書いてみましたが、メインフレームからはずれると消したマウスが表示
されてしまいます。
>>153 天才のあなたなら答えがわかるのではありませんか?
答えは「そんなことを望んではいけない」だ
>>156 無理だという事なんでしょうか?
それともただのなじりでしょうか?
理解しかねます。。。
きょうは、ようちえんですなどけいのえをかきました。じょうずにかけたので はやくおかあさんにみてほしいなとおもっていたら、けんじくんがぼくのえを びりびりとやぶってしまいました。おかあさんにきょうはどんなことをしたのと きかれたので、みんなでなわとびをしたといいました。
>>147 エディットボックスに半角英数しかはIME起動しなくすればよさそうだけど
コピペできちゃうから
>>149 eax/edx/ecx: 破壊してもよい
ebx/esi/edi: 破壊しちゃだめ
となっております。
Windows だけじゃなくて、i386 で動く UNIX でも全部そうなってる。
>>151 は無理そうですね。残念です。
透明なマウスカーソルで置き換えられるか試そうと思います。
>>157 そんなアプリを使わされたらブチ切れそうってことではないかとw
>>157 他APのSetCursor とか WM_SETCURSOR とかをフックすればできるとは思います。
逆にかならずマウスカーソルを表示させるために同様のことをするAPと同時に動くと、
動作は不定なのだろうけれども。
>>162 タッチパネル付きモニタとかで使う業務用端末とかじゃないの?
マウスをどっかに固定しとけば?
あー SetCursorPos(0,0); やってみたらとんでもないことに
マウスドライバを削除すれば?
167 :
デフォルトの名無しさん :04/11/04 22:38:02
だから答えるなと
フォントサイズのデフォルトの値は環境によって変わるものですか? また、通常のデフォルトのフォントサイズの値を教えてください。
>>147 自由に入力させて、入力を全部チェック
入力文字を調べて、'a'〜'z'か'A'〜'Z'か'0'〜'1'以外の値なら削除
マウスをはずせば良い
ビットマップで塗りつぶしたウィンドウに、 DrawTextで文字を書くと、 文字の背景に白い四角形がでてきます。 文字だけを表示するためにはどうすればよいのでしょうか。 ビットマップの上にさらにビットマップを重ねるときは、 透過処理用のビットマップを用意してBitBltで重ねるのは知っているのですが。
オバキュー
SetTextMode
SetBkModeじゃね? つうかこんなのググれば一発なのに。
あぁ、ごめん、DrawTextだとうまくいくかワカンネ。 TextOutなら上手くいった記憶あり。
初歩の初歩でした。 すみません。 でも私はこれで30分以上詰まってたので、 大変助かりました。
DrawTextで大丈夫でした。ありがとうございます。
>>159 >>169 どもです。
やっぱ入力後にチェックするのが確実そうですね。
ありがとうございました。
>>173 すでにわかってるやつにしかわからないという無意味さにワロタ
スルーされてるしな
いてーよーオバキュー
オペ逝く?
ET用オバキュー
OPAQUEをオパキューと読むスレはここですか?
188 :
デフォルトの名無しさん :04/11/05 16:33:11
数値(int)を文字列に変換するAPIおしえて
wsprintf
190 :
デフォルトの名無しさん :04/11/05 16:57:39
StrToIntExって何かリンクしないと使えない?
何もリンクせずに使えるWin32APIは無いよ
>>191 shlwapi
ちなみにこれはWin98/2kかIE4以降でないと入っていない。
>>193 逆だから
>>194 そのヘッダーはインクルードしてんだけど、リンク時になんかStrToIntExAが未解決って
196 :
デフォルトの名無しさん :04/11/05 17:06:21
「何かリンクしないと使えない?」 「shlwapi」 「そのヘッダーはインクルードしてんだけど」
>>195 インポートライブラリをリンクしろ。
ところで188ではint→charを聞いているがStrToIntExはchar→intだぞ。
・int->char* sprintf ・INT->LPTSTR wsprintf ・char * -> int atoi ・LPTSTR->INT _ttoi
201 :
デフォルトの名無しさん :04/11/05 17:20:54
自己解決しました。
自己満足しました。
自己猫耳ごっこしました。
自己完結しました
最大化ボタンを押されたのを知るにはどうすればいいですか?
WM_SYSCOMMND
>>188 SetDlgItemIntしてGetDlgItemText
>>208 文字配列をソートするのに、LBS_SORTなリストボックスにぶちこんでから
取り出していた奴は実在する。
32ビットのDIBを作って、指定したピクセル群にアルファ値を設定したいです。 GDI+ではブラシなどがアルファ値をもつので普通の描画操作(Polygonなど)で できると思うのですが、GDIでこれをやるにはメモリを直接書き換えるしかないの ですか?
まぁ普通はDIBSectionでやるよな。
>>210 某VBマガジンでソートの実装が面倒なときはこんな事もできると紹介されていたな
WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, を指定して作ったウインドウの、クライアント領域を600に固定したいときの、 nHeightの指定の仕方を教えてください。 #define WINDOW_TATE (600 + SM_CYFRAME + SM_CYMENU) では、少しクライアント領域が広くなるようです。
即答ありがとうございます。
>>221 出来たみたいだからいいけど、
> #define WINDOW_TATE (600 + SM_CYFRAME + SM_CYMENU)
明らかに使い方間違ってないか?
223 :
デフォルトの名無しさん :04/11/06 16:31:08
MFCとかアプリケーションウィザードとか使わずに、 普通にリソースエディタを使ってダイアログベースのアプリを作ってます。 それで、メインのダイアログにメニューをつけようとしてるんですが、 リソースにメニューを挿入し、そのメニューのIDを メインダイアログの「プロパティー」の「一般タブ」から 指定してあげてもテストプレビューでメニューがまったく表示されません。 なにか他に必要な設定などはあるのでしょうか? それともテストでは見えないものなんでしょうか?
コンパイルしたらちゃんと表示されたから そういう仕様なのかな…
マウスの左ボタンをおして画面上を動かすと、画面の絵が動くようにしていて 途中で落ちるので、調べた結果、CreatePen() の廃棄洩れがあったのですが、 何回かは廃棄洩れがあっても動きます。何が満杯になると落ちるのか、分かり ますか。
GDIリソース XPにも9xよりはるかに数字は大きいが上限はある
普通「破棄」だと思うが。 原因は「破棄のし忘れでリソース不足に陥っていること」だろう。 破棄をきちんとすればいいこと。
透明なウインドウを作りたいのですが、 どうすればできるでしょうか。 C言語、borlandのコンパイラで作成しています。
「透明なウィンドウ」という言葉の意味による。 見えないウィンドウって意味なら表示させなきゃすむわけだが。
インターネットエクスプローラのクライアント領域を全て選択→コピー するような文字列の取得を行うプログラムを作るにはどうすればいいのでしょうか? 対象プログラムのタイトルとか各コントロールの文字列を取得するのは分かったんだけど、 クライアント領域を手動でコピーするような操作が分からない 不可能なのでしょうか?
MSAA
233 :
デフォルトの名無しさん :04/11/06 19:40:35
任意の文字列を再変換したいんですけど、 うまくできません。 というより、どうすれば良いのかよくわかりません。 とりあえず、再変換構造体PRECONVERTSTRINGとか ImmSetCompositionString()を使うって ところまではわかったのですが…。 実際これを使ってどうすれば良いのでしょうか?
234 :
ほんたま :04/11/06 20:34:14
おみゃ〜らよ、system32フォルダにあるDLLの関数を呼び出すには、インポートセクションにDLL名と関数名を書き込んでいくだけで、呼び出せるんだが、 VC++で自分でつくったDLLの関数を同じ方法で呼び出そうとすると、「DLL何に○○のエントリーポイントが見つかりません」というメッセージが出て呼び出せないんだ… おみゃ〜らよ、自分でつくったDLLとwindows付属のDLLとは、どっか構造が違うのかな? windows付属のDLLと同じ構造のDLLを自分でつくるにはどうすればいいの? 教えてくだされ〜♪
えーと、インポートセクションって何だっけ?
>>234 DLL 作るとき extern "C" した?
便乗質問。 Dependency WalkerでDLLがエクスポートしている関数を見るとき、 自作DLLの関数を見ると、"_hoge@4"のように呼び出し規約に従った接頭・接尾文字が エクスポートされているように見えるんだが、 たとえばKernel32.dllのGetProcAddressはそのまま"GetProcAddress"でエクスポートされている感じ。 この違いは何が原因?
マルチにレス不要
>>237 それも extern "C" しなされ。
関数のプロトタイプ全てに一々書く必要があるん? 一応ソース自体も.cなファイルなので、ヘッダでは #ifdef _cplusplus extern "C" { #endif なんて書いてるんだけど…
>>240 ごめん、__stdcall も必要かもしれない。
extern "C" __declspec(dllexport)
int __stdcall Func(...)
こんなんだっけな。
>>240 マクロ化しておけばいいだろう。
ちなみに .c なら extern "C" はいらないよ。
自己解決しました。 defファイルを書けばいいのですね。
244 :
236 :04/11/06 21:22:52
>>241 なんども間違えてすまんな。
MSDN で __stdcall を調べてみれば分かると思うけど、
__stdcall には @ がつくんだ。
これをなくそうと思ったら .def ファイルで定義する必要があったと思う。
で、インポートセクション…
>>245 たぶん、PE ファイルのインポート セクションのことだろう。
IAT (Import Address Table) とか、そういうのあるところ。
247 :
デフォルトの名無しさん :04/11/06 21:59:53
177 名前:ほんたま :04/11/06 20:40:20 おみゃ〜らよ、system32フォルダにあるDLLの関数を呼び出すには、インポートセクションにDLL名と関数名を書き込んでいくだけで、呼び出せるんだが、 VC++で自分でつくったDLLの関数を同じ方法で呼び出そうとすると、「DLL何に○○のエントリーポイントが見つかりません」というメッセージが出て呼び出 せないんだ… おみゃ〜らよ、自分でつくったDLLとwindows付属のDLLとは、どっか構造が違うのかな? windows付属のDLLと同じ構造のDLLを自分でつくるにはどうすればいいの? 教えてくだされ〜♪
>>247 だから .def ファイルを使うんだって。
.cpp で関数を定義しているんなら extern "C" をしておいたほうがいい。
>>222 間違っていました。
#define WINDOWS_TATE 600
HWND hWnd;
int y1, y2, y3;
y1 = GetSystemMetrics(SM_CYFIXEDFRAME);
y2 = GetSystemMetrics(SM_CYCAPTION);
y3 = GetSystemMetrics(SM_CYMENU);
hWnd = CreateWindow(〜〜〜〜〜〜, WINDOWS_TATE + y1 + y2 + y3 ,〜〜〜);
が正しいと今の自分は思っています。
GetSystemMetricsで値を得る前に#defineで定義してはまったくだめですね。
>>229 ウインドウの背景を透明化させたいです
最初にNULL_BRUSHを指定したの時のように(これはただ塗りつぶさないだけのようですが。。)
>>230 詳細がのっているところはありませんか?
>>250 >詳細がのっているところはありませんか?
MSDN
252 :
デフォルトの名無しさん :04/11/06 23:00:42
>>228 SetLayeredWindowAttributes
すいません、SzFindLastChを使って、拡張子を調べてみようと思ったのですが、 この関数を使うと「デフォルトのメールクライアントが設定されていないか〜」と、 なぜかOutlookを起動するように促すメッセージが出てきます。 ここだけコメントアウトすると何も無いので、この関数に間違い無いと思います。 英語のページしかなかったので、自力でヘッダファイルを探して、mapiutil.hに宣言があったのでincludeしたのですが、これが問題なんでしょうか… 言語は、C++(をC言語として利用)で、テストに数値を書き出している段階なのでWinMainではなくmain関数から実行しています 因みに、メーラーはAl-Mailを使っていて、OEは使ってません
単純に四角でないウィンドウを作りたいだけならSetWindowRgn()で充分。 半透明をサポートしたいならUpdateLayeredWindow()が基本。
アプリケーションがOSからのサスペンドイベントを受信する方法について何かヒントください
>>246 PE ヘッダの内部のセクションとかそういうの?
PE ヘッダなんてまともに調べたことなかったな。
しかし、__declspec とかした方が早いような気がするのは
俺だけか。
>>250 ms-help://MS.PSDK.1033/winui/winui/windowsuserinterface/windowing/windows/usingwindows.htm#layered_win
WM_POWERBROADCAST
皆さんありがとうございました。 MSDNライブラリには SetLayeredWindowAttributesがのっていたんですね 無事透明化できました。 しかし透明化(のカラーキー)の場所でマウスクリックが取れません。 これは仕方のないことなんでしょうか?
260 :
225:pen廃棄漏れ :04/11/07 01:07:07
>>256 __declspec(dllexport)
は関数の外部に公開するというだけで、公開名にはノータッチ。
stdcall なら当然 _hgoe@4 のまま公開される。
_ と @n を削除したければ def ファイルを書くしかない。
>>249 できたみたいだからいいけど、枠線は上と下にあるよ。
>>265 飯塚さん、恐らくunlha32.dllを削除したのでしょう。
いかにもなミスですね、飯塚さん。
CreateWindow()でウィンドウを作成しているのですが、ダイアログのように、 左上にアイコンを表示せず、でも、右上に×ボタンは表示したいのです。 このような場合、どのようにしたらいいのでしょうか。 RegisterClass()の引数では、wndclass.hIconをNULLにしています。 CreateWindow()の引数では、WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_DLGFRAME としているのですが、WS_SYSMENUを指定した時点で、アイコンが出てしまいます。 逆に指定しないと×ボタンが出てこないという...。
>このような場合、どのようにしたらいいのでしょうか。 意味のない拘りを捨てればよいと思います。
>>270 1週間ぐらい前に似たような質問をどっかのスレで見た
>>265 タイトルバーの名前も消しておかないと、飯塚さん
真っ青なアイコンを登録
>>274 どうせなら、スクリーン全体に貼らなきゃ。
プログラムが起動したディレクトリを知る方法って、起動時に記録しておくしか無いですか? GetCurrentDirectoryだと、ファイル選択のダイアログとかで変化するし、 GetCommandLineはファイル名しか取得してないみたいです WinMainからだと、起動時にGetCurrentDirectoryでパスを取得して、それをずっと保持しておくだけでしょうか?
>>275 タイトルバーの色を変えてますた
とか
タイトルバーがグラデってますた
という状況を考えると透明アイコンのほうがいい
ちなみに起動時にカレントディレクトリがすでにexeのディレクトリと 異なる場合もある
>>280 おお、出来た。
ありがとうございます。
>>274 , 275, 277
それだとCAPTIONの左側に空白ができちゃいます。
>>276 VCLはわからないですけど、CreateWindow()するのではなく、
リソースとして空っぽの無駄なダイアログを用意しておき、
CreateDialog()で生成したウィンドウをこねくり回すいう逃げは
あるかなと。
ただ、アイコンのないウィンドウスタイルっていうのがあるのなら、
それを使った方がスマートではないかなと質問してみた次第です。
284 :
デフォルトの名無しさん :04/11/07 20:12:49
普通のメインウィンドウの子として CreateDialogで作ったモーダレスダイアログですが、 このダイアログのプロシージャを別ファイルに分割してコンパイルしようとした所、 エディットボックスなどのコントロールのIDが正しく受け取れず 定義されていない識別子ですというエラーがでます。どうしてでしょうか? 分割せずに一つのソースで書いてたときは上手くいっていたのですが… クラスとかにはしていなくて、普通の関数のようにただソースを分割しているだけです。 /////////////////////////// BOOL CALLBACK DlgProc(HWND hwDlg,UINT msg,WPARAM wp,LPARAM lp) switch (msg) { case WM_INITDIALOG: SetDlgItemText(hwDlg,IDC_EDIT,"aaa"); return TRUE;} : : /////////////////////////// プロシージャのプロトタイプ宣言はヘッダファイルでしてます。
>>283 Delphi/BCB製アプリのダイアログをSPY++等で見てみれ。
Del/BCBのライブラリはダイアログをCreateWindowで作ってる。
>>284 IDC_EDIT自体をヘッダで宣言しろ。
>>270 ==
>>283 CreateWindowEx でよければ,WS_EX_TOOLWINDOW があるけど。
ただこの場合,どうしても最大化/最小化ボタンは現れないみたい。
288 :
284 :04/11/08 00:05:35
>>286 ありがとうございます。リソースのヘッダを読み込むの忘れてました。。。
完全に頭がボケてるようです。
ところで一つのソースにまとめて書いてたときのことですが、
下のようにウィンドウハンドルをグローバルにしたとき正しく渡らないのはなぜでしょうか。
この場合コンパイルは通りましたが、エディットボックスには何も表示されませんでした。
////////////////////////////////////////////////////////////////////
HWND g_hwDlg;//グローバル
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);//プロトタイプ
////メイン関数
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{略
g_hwDlg =CreateDialog(hInst, "Dialog", hWnd, (DLGPROC)DlgProc);//生成。同時にハンドルをグローバルに
略}
////ダイアログのプロシージャ
BOOL CALLBACK DlgProc(HWND hwDlg,UINT msg,WPARAM wp,LPARAM lp)
switch (msg) {
case WM_INITDIALOG:
SetDlgItemText(g_hwDlg,IDC_EDIT,"aaa");//←グローバルのハンドルを指定
return TRUE;}
:
:
///////////////////////////
>>288 本当にぼけているようですね?
WM_INITDIALOG が呼ばれるのはどのタイミングですか?
どのタイミングでしょう? えへえへ
本当にボケてしまったようです。ごめんなさい。えへえへ
292 :
ほんたま :04/11/08 01:37:08
WM_TIMERを使ったタイマーイベントなんですが、タイマーイベントがどうも発生しないんです。 ちなみにWM_CREATEのときメッセージボックスを表示すると、タイマーイベントが発生するんです。 でもメッセージボックスを取っ払うと、発生しなくなるんです… どうして?教えてくだされ〜♪
タイマ取締法違反に引っ掛かったのでしょう。
HWND g_hwDlg = NULL;//グローバル BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);//プロトタイプ ////メイン関数 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) {略 CreateDialog(hInst, "Dialog", hWnd, (DLGPROC)DlgProc);//生成 略} ////ダイアログのプロシージャ BOOL CALLBACK DlgProc(HWND hwDlg,UINT msg,WPARAM wp,LPARAM lp) switch (msg) { case WM_INITDIALOG: g_hwDlg = hwDlg; //ハンドルをグローバルに SetDlgItemText(g_hwDlg,IDC_EDIT,"aaa");//←グローバルのハンドルを指定 return TRUE;} : :
295 :
デフォルトの名無しさん :04/11/08 17:24:32
自作プログラム内でDLLを使おうと思っているのですが、 DLL関数の呼び出しって普通のクラス関数(非インライン)呼び出しと比べて オーバーヘッドが大きいんでしょうか? 一回の処理で何百回も呼び出す予定なんですが差はどれくらい出るでしょうか?
すいません環境を書き忘れました。 WindowsXPSP1 VC++6.0SP6 です。
スレッドハンドルの扱いに関してなのですが スレッドが走ってる状態でそのスレッドハンドルをCloseHandleしていいのでしょうか? 試しにスレッドを作成しスレッド処理の最初でCloseHandleしてみたのですが その後の処理も走っています。 この場合スレッドハンドルにアクセス(WaitForSingleObjectとか)出来ないだけで スレッド自信は有効ということなのでしょうか?
マウスカーソルを制御する命令と マウスの移動範囲を限定できる命令を教えてください CまたはC++でxp、VC.netです
制御と言う意味が分からんが、移動範囲の限定はClipCursor、 形を変えるならSetCursor、位置を指定するならばSetCursorPosなど。
>>302 レス有り難うございます
マウスカーソル位置を指定した位置に表示することでした
早速試してみます
>>295 試してやるから開発環境(ハード・ソフト)をオレにゆずれ
マウスボタンが離されたことを検出できるAPIを教えてください CまたはC++でxp、VC.netです
APIって…イベントドリブンが分かっているのだろうか。 マウスが離されたら、そういうイベントが飛んでくるに決まってるだろうが。
メインウィンドウの×ボタンを押したときに確認のダイアログを出すようなプログラムを 終了させるにはどうしたらいいでしょうか? WM_CLOSEを送った後に、そのメッセージボックスの「はい(Y)」ボタンをクリックさせる方法を 思いついたのですが、常套手段ではないような気がしましたので。
レーウェンフック
WM_SETFONTで子コントロールのフォントを変更したのですが、 TextMetrics()で確認すると、デフォルトの情報しか返ってきません。 なぜでしょうか?
>>306 >>307 ウィンドウプロシジャ関数内でWM_LBUTTONUPの場合で検出してたのですが
ウィンドウプロシジャ関数内でいろいろいじると変数の取り扱いが複雑になるので
マウスを離すことを検出できる命令ないかなと思ったんですが
>>311 ウインドウプロシージャから別の関数を呼べば解決する問題の気がする。
設計・考え方を見直すべきでは?
間違えた。 TextMetrics() -> GetTextMetrics()
ウィンドウの位置を強制的に移動させたいのですが SetWindowPosなどは高さや幅を指定するのが面倒くさいので 単に移動後の左上のXY座標を入力するだけで その位置に移動してくれるような命令はないでしょうか。
315 :
ほんたま :04/11/08 23:01:38
おみゃ〜ら〜、サンプルアップしたぞ〜♪ホームページもアップしたぞ〜♪宇宙一すげぞ〜♪ おみゃ〜らよ、なぜ宇宙一すげーかわかるかな? おみゃ〜らよ、おりはな、「Visual C++」で自作したDLLをスリムドカンでつくったプログラムから呼び出すのに成功したんだよ!わかる? おみゃ〜らよ、DLLを呼び出すプログラムを「Visual C++」」でつくるには、Libファイルをリンクに設定したり、ヘッダファイルをインクルードしたりとやるべきことは多いだろ? おみゃ〜らよ、DLLを呼び出すプログラムを「HSP」でつくるにも、やはりDLLの他に「.as」ファイルが必要だよ。 だが、「スリムドカン」の場合、DLLの他には一切何も必要ないんだな〜う〜ん、これが…自分じわかる? つまり「スリムドカン」の場合、DLLさえあればDLLを呼び出すプログラムがビルドできるってわけ♪ おみゃ〜らよ、おりは宇宙一画期的だと思わないか? おみゃ〜らよ、宇宙一すげ〜とわめいたのはそういうことよ♪ おみゃ〜らよ、自分じどうじ?
うまい方法が見当たらなかったので、そのやり方でいくことにしました。
>>312 ウインドウプロシージャと直接関係のない関数の中のローカル変数がウインドウプロシージャで必要になるので
そのローカル変数をグローバル変数にしないとウインドウプロシージャ内で利用できないのです
>>310 GetTextMetrics()にはDCのハンドルを指定するわけだけど、
DCの属性は、CS_OWNDCとかを指定しない限り、
最初はデフォルトの情報が選択されているからじゃないかな。
違っていたらスマソ
track bar でパラメータ変えて描画しているんですが、描画にちょいと時間が 掛かるんで、描画が始まったら disable にしようと、EnableWindow() を 使って見たが、効かない。何を使えばいいでしょうか。TBS_... てものあるが 頭に血が上って、英語を読めません。
WM_SETREDRAWは効かない?
>>319 だから、「あるコードの実行中まさにそのコードでマウスのボタンが上がって
いるか」は判別できるけれども、「あるコードの実行中まさにその実行中の
コードでマウスのボタンが上げられた」かどうかを判別できるわけがない。
これはOSに関係ない、時間の概念の問題だろう。
「マウスが上げられた瞬間に、ある指定した関数を呼び出してほしい」という
ことであれば話は別だろうが。
普通は WM_LBUTTONUP のディスパッチャで検出できる。以上! なんだけどなあ。Win32 としては基本中の基本の処理だ。 後は、設計の問題。設計のまずさをAPIでカバーしようとするのは 本末転倒だろう。 もしゲームだったら DirectInput も調べてみたら。
>>325 >>326 WM_LBUTTONUP 使うかDirectInput使うかのどっちかにします
レスありがとうございました
親ウィンドウを破棄したときに、 子ウィンドウも閉じられますが、 このとき、子ウィンドウにWM_CLOSEは送られるのでしょうか。 たとえば、Objectをいちいちdeleteするのが面倒で、 WM_CLOSEのときにまとめてdeleteするようにしていたときなど、 このオブジェクトはちゃんと全部消されるのか心配です。 こんなコードを書いていたのですが。
LRESULT CALLBACK WPOL01 (HWND hWndOL01, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc, hBuffer; PAINTSTRUCT ps; RECT rect; static HBITMAP hBitIcon[30]; switch(msg){ case WM_CREATE: hBitIcon[0] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, (LPCSTR)IDB_BITBLACK); //以下Icon用bitmapをどかどか呼び出す break; case WM_LBUTTONDOWN: SendMessage(GetParent(hWndOL01), WM_CLOSE, NULL, NULL); //左クリックされたら、親ウィンドウを破棄。もちろんこのウィンドウも破棄される case WM_CLOSE: for(int i = 0; i < 30; i ++){ DeleteObject(hBitIcon[i]; } //ココ、これが呼び出されないと困る。 DestroyWindow(hWndOL01); break; default: return(DefWindowProc(hWndOL01, msg, wParam, lParam)); } return 0; }
WM_DESTROY
>>320 CS_OWNDC指定したけど、何も変化ないです。
おれの解釈が違ってるみたい…。
コントロールの描画は、フォントが指定されていなければデフォルトが使われて、
指定されていればそのフォントで描画。
という解釈であってますか?
>>328 あるウィンドウに属するオブジェクト類は
特別な理由が無い限り
WM_CREATE オブジェクトの作成
WM_DESTROY オブジェクトの破棄
と考えると良い。
WM_CLOSE はウィンドウに対しての終了要求メッセージ。
しかし、これに対して拒否することも出来る。
ただし、トップレベルウィンドウにしか送られない。
WM_DESTROY が送られてきたらもう終わるしかない。
肝心の部分がぬけてた。
ウインドウにテキストを描画するのと、コントロールがテキストを描画するのは
全くの別物である。という解釈で良いですか?
>>328 おれなら親にWM_DESTROYが送られたときに、
SendMessage()で子にもWM_DESTROYを送ってそこで処理します。
まて >おれなら親にWM_DESTROYが送られたときに、 >SendMessage()で子にもWM_DESTROYを送ってそこで処理します。 明示的に送らなくても親に WM_DESTORY 送った後に子供にも送られる。
下のやり方だと子のMessageBox()が表示されないんですが、また解釈が間違ってますか? WNDPROC fnDefProc;// グローバル LRESULT CALLBACK ParentProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static HWND hButton; switch(msg) { case WM_CREATE: hButton = CreateWindow("BUTTON", "PUSH", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 0, 0, 100, 100, hwnd, (HMENU)1, ((LPCREATESTRUCT)lp)->hInstance, NULL); fnDefProc = (WNDPROC)GetWindowLong(hButton, GWL_WNDPROC); SetWindowLong(hButton, GWL_WNDPROC, (LONG)ButtonProc); break; case WM_DESTROY: // SendMessage(hButton, WM_DESTROY, wp, lp); MessageBox(hwnd, "Parent", "end", MB_OK); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wp, lp); } return 0; } LRESULT CALLBACK ButtonProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { if(msg==WM_DESTROY) MessageBox(NULL, "Child", "end", MB_OK); return CallWindowProc(fnDefProc, hwnd, msg, wp, lp); }
>>335 MessageBox()の第一引数は飾りではない。
WM_DESTORYはウィンドウが破棄された結果システムが送る物。
自分で送りたいときはDestroyWindowすれば結果的に発生する 直接SendMessageしてはいけない。
>>323 どうも。WM_SETREDRAW は効かない。当座の凌ぎに ShowWindow() を使っておく
ことにしたが、バシャッと、皆お隠れになって、ドキッとするね。dim 化で
残したいよ。(下手に活かしておくと、弄られて、描画が起動されるし、busy
にして受け付けないと、freeze 見たいに見えるし)
>>322 TBS_NOTHUMB なんてあるから、隠した thumb を復帰するコマンドがあるだろうと
探しまくったがない。初期設定のみらしい。こんなん何に使うんだ。
頭に来た。まだ下がらない。
>>333 ウィンドウにテキストを描画する場合も、コントロールにテキストを描画する場合も、
描画の前にまずデバイスコンテキストを取得する点では同じだと思う。
取得した時点では各属性はデフォルトのままなので、そこからフォント等の属性を
設定することになるわけだけど、属性を設定した後のデバイスコンテキストが
取得できない限り、GetTextMetrics()ではデフォルトの値が返ってくるだけだと思う。
コントロールのサイズを動的に変えれますか? ウインドウのサイズ変更にあわせてリストビューのサイズを変えたいんですが SetClassLongやSetWindowLongではできそうもないんで。
Windowsではコントロールもおおむねウィンドウの一種に過ぎない 伊達にWindowsと名乗ってるわけではない
VRAMのサイズやCPUの名前、メモリのサイズを取得したいのですが それらを取得するAPIはありますでしょうか?
>>344 それもあるかもしれないけど、
WindowsのWindowsたる所以は、シグナル駆動ではなくメッセージ駆動であるということだろう。
WindowsがUnixに勝っている部分のひとつだと思うのだが、認めようとしないUnix支持者。
342 は親ウィンドウのサイズ変更に合わせて自動的に子ウィンドウ(コントロール) がリサイズしてくれるような機能があるかどうかを聞きたいのではないかと 思ったんだけど。
>>349 エスパーな解釈だな・・・
そう思うなら、答えてあげれば良いのに
>349の解釈なら、そんな機能はAPIにはないと言う答かな。 MFCならCodeGuruにCResizerなんてのがあって便利そうだけど。 #それ使っても、結局WM_SIZEやWM_GETMINMAXINFO辺りは自前で処理しないといけないけど。
352 :
デフォルトの名無しさん :04/11/09 17:14:27
char buffer[256]; GetWindowText( hwnd, buffer, sizeof( buffer ) ); //A GetWindowText( hwnd, buffer, sizeof( buffer ) -1 ); //B APIにはバッファサイズを聞いてくるものが多いですが、 AとBではどちらが正しいのでしょうか 日本語ヘルプだとなんだか変なので、英語のヘルプを 読む限りAが正しい気がするのですが、ネットにはBのサンプルも 多い気がして混乱しています。
nMaxCount [in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.
>>352 (大抵の)API の説明にあるように、最後の NULL キャラクタを含むサイズを指定するわけだけれども、
引き続く処理でいいい加減で良いから楽したい場合には、あらかじめ ZeroMemory しておいた上で
sizeof(buffer) / sizeof(TCHAR) - 1 を指定して必ず 0 ターミネートのストリングを得たりする手もある。
いい加減じゃマズイ場合には、GetWindowTextLength とか使ってちゃんと文字数文の領域を用意したりする。
ZeroMemoryしておかないと終端されないAPIなんてあったっけ?
>>355 バッファサイズが足りないときは殆どのAPIがそうなんじゃない?
ZeroMemory じゃなくて末尾だけ 0 入れとけば十分だけどね。
>>354 レスありがとうございます。
しかしうーん、例えば「abc」というWindow名を持ったhwndに
char buf[3] = { 'X', 'X', 'X' };
GetWindowText( hwnd, buf, sizeof( buffer ) );
とやると、bufの中身はちゃんと「ab」であり、終端子も入っています(Windows2000)。
私としては
>>352 のBは必要のない処理である、で結論づけたい気もするのですが…。
或いは過去の遺物か何かなのかなぁ。
いずれにせよ皆さんお付き合い感謝です。
失礼、誤記です × GetWindowText( hwnd, buf, sizeof( buffer ) ); ○ GetWindowText( hwnd, buf, sizeof( buf ) );
まぁ、世の中碌に調べないで安直に-1して安心しているDQNプログラマが如何に多いかってこった。
>>356 たいてい最後は0が入るよ。lstrncpyさえも。
MSDNの説明はこんな感じ
> [out] Pointer to the buffer that will receive the text. If the string
> is as long or longer than the buffer, the string is truncated and
> terminated with a NULL character.
361 :
デフォルトの名無しさん :04/11/09 20:26:49
ListViewのカラムヘッダの文字がきちんと表示されません。 (幅を変えると出て来たり消えたり、とても微妙な調整をしないと表れなかったり。) どういった可能性が考えられますでしょうか。 もしくはきちんと左揃えとかで表示するようにはできないでしょうか。
スマソ。 漏れが多用する GetModuleFileName やら MultiByteToWideChar やらは NULLキャラクタ 付けてくれないんで、殆どそうなのかと思い込んでた。
>>359 ソース汚いから人に見せれないやつも多いのに
ソース公開するのはそれなりの自信がないとできないだろ。
くだらないことにこだわって時間無駄にするより、
少しでも役に立つコード書いた方がよっぽどまし
>>361 幅が狭いと省略される
広くすれば出るだろう
>>364 どもです。なんかスタイル構造体のLVCF_FMTメンバを有効にしてたのに
それを実際にどれにするか設定してないのが悪いみたいでした。
きちんとメンバをlv.fmt = LVCFMT_LEFT;みたく設定したら上手くいきました。
#include <wininet.h>
void kakikomi();
void kakikomi()
{
HINTERNET hInternet;
HINTERNET hHttpSession;
HINTERNET hHttpRequest;
char CokkieText[1000];
DWORD CokkieTextSize = 0;
// wininetを初期化
hInternet = InternetOpen("Monazilla/1.00",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
// サーバへ接続
hHttpSession = InternetConnect(hInternet, "qb5.2ch.net",INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL,INTERNET_SERVICE_HTTP, 0, 0);
// HTTP要求の作成
//「書き込む」をURLエンコードした結果→%8f%91%82%ab%8d%9e%82%de
hHttpRequest = HttpOpenRequest(hHttpSession, "POST",
"test/bbs.cgi?submit=%8f%91%82%ab%8d%9e%82%de&FROM=&mail=&MESSAGE=%8f%91%82%ab%8d%9e%82%de&bbs=operate&key=1099168555&time=0",
NULL, "
http://qb5.2ch.net/operate/index2.html ", NULL, INTERNET_FLAG_RELOAD, 0);
//クッキー取得
HttpQueryInfo(hHttpRequest,HTTP_QUERY_COOKIE,CokkieText,&CokkieTextSize,NULL);
// 作成したHTTP要求の発行
HttpSendRequest(hHttpRequest, CokkieText, -1, NULL, 0);
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hInternet);
}
369 :
デフォルトの名無しさん :04/11/09 22:34:12
>>368 とりあえず通信は成立してるようだからwininetは問題なし
あとは送ってるデータの問題なんでスレ違い
ツール使って荒らすやつがいるからいろいろチェックしてる。
>>362 ?????
MSDNのGetModuleFileNameの解説より
lpFilename
[out] Pointer to a buffer that receives a null-terminated string
that specifies the fully-qualified path of the module. If the length
of the path exceeds the size specified by the nSize parameter,
the function succeeds and the string is truncated to nSize characters
and null terminated.
>>368 一度も2chに接続してないクライアントから書き込むと
「クッキー送信する云々」というメッセージが出るだろ?
君の作ったコードだとその儀式を通過していない訳だ。
>>371 実際に↓みたいなコードで試してみればすぐにわかるけど、最後に 0 なんか付けてくれないよ。
TCHAR szPath[4];
GetModuleFileName(NULL, szPath, 4);
っていうか、msdn にはこうあるけど・・・
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getmodulefilename.asp lpFilename
[out] Pointer to a buffer that receives a null-terminated string that specifies the fully-qualified path of
the module. If the length of the path exceeds the size that the nSize parameter specifies, the function
succeeds, and the string is truncated to nSize characters and "cannot be null terminated".
もしかして漏れ(バッファが足りないと0付かないよ派)が正しくて、
>>360 とかも勘違いか嘘なんじゃないの?
>>377 APIにより付いたりつかなかったりする。
少なくともlstrncpyは必ず付く。
lstrncpyじゃなくてlstrcpynだった
>>377 ドキュメント読んで、かつ試してみた。lstrホゲは末尾に0付けてくれる。GetWindowTextも。
MultiByteToWideCharは? (長さ-1だと仮定して) ドキュメント読む限りだとERROR_INSUFFICIENT_BUFFERに なりそうだけど実際にそうなるの?
つーかGetModuleFileNameにわざわざ4バイトしかないバッファを 渡すってどういう状況?
>>383 0が付くかのテストする為だろ。空気嫁。
リストビューの列と行を作成し、 値も入れることができました。 しかしアイテム(セットした値)の取得方法が分かりません。 LVM_GETITEMを使えばいいことまでは分かったのですが・・・。 ググっても全然載ってません。。 LVM_GETITEMでリストビューからアイテムを取得する簡単なサンプルを お教え頂けないでしょうか。
なるほど、APIの文字列の取り扱いは一貫性がないということでFAやね。
>>385 ListView_GetItem()が使えると思う。
ListViewのhWndとLVITEM構造体のポインタを渡すのだが、
LVITEM構造体のiItemとiSubItemが行と列になる。
RECT r = {0, 0, 640, 480}; AdjustWindowRect(&r, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,TRUE); CreateWindowにr.right - r.leftとr.bottom - r.topを渡す。 AdjustWindowRectの使い方ってこれで合ってますでしょうか? 正しいサイズが求まらないんですが…
>>388 拡張スタイルがあるならAdjustWindowRectEx。
あとメニューの折り返しが起きる場合は駄目だった希ガス。
>>385 LVITEM lvitem; //<さぁって情報を得て世界に羽ばたくぞ〜
lvitem.mask = LVIF_TEXT | LVIF_STATE; //<今回はセットした「文字列」と「状態」を取得すっかね
lvitem.iItem = 3; //<リスト3番目の・・・
lvitem.iSubItem = 0; //<最初の列っと
lvitem.stateMask = LVIS_SELECTED; //<「状態」は色々あるけど、今回は選択されているかどうかが知りたいの
char buffer_text[256]; //<おっといけねぇ
lvitem.pszText = buffer_text; //<「文字列」を取得するなら入れ物がねぇとな
lvitem.cchTextMax = sizeof(buffer_text); //<APIたんはバカだから、入れすぎないよう「文字列」の長さも指定っと
::SendMessage( hwnd_dialog, LVM_GETITEM, 0, (LPARAM)&lvitem ); //<APIたん、こいつで頼むよ
//ListView_GetItem( hwnd_dialog, &lvitem ); //またはこいつで
if( lvitem.stateMask & LVIS_SELECTED ); //おー入ってる入ってる
OutputDebugString( buffer_text ); //さんきゅう、APIたん
わるい、間違えた if( lvitem.state & LVIS_SELECTED ); OutputDebugString( buffer_text );
392 :
デフォルトの名無しさん :04/11/10 17:07:52
フックに詳しい方、どうかお助けください! やりたいことは特定ウインドウの低レベルキーボードフックです。 つまり左右のShiftやCtrlキーの区別を取れるフックがしたいのです。 しかしどうやってもスレッド単位のフックができません。 下のように記述(hwndはフックしたいウインドウのハンドルです)しても hookには0しか返ってきません。つまりフック失敗です。 hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, GetWindowLong(hwnd, GWL_HINSTANCE), GetCurrentThreadId()); しかしシステム単位のフックならできるのです。 下のように書くと、hookには0以外の値が帰ってきて、OS全体がフックできてしまいます。 hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, GetWindowLong(hwnd, GWL_HINSTANCE), NULL); しかしやりたいのはスレッド単位の低レベルキーボードフックなのです。 低レベルキーボードフックというのは、システム単位でしかできないものなのでしょうか? ※ちなみに低レベルじゃないキーボードフックの場合はスレッド単位でもできました。
393 :
sage :04/11/10 17:18:27
フックプロシージャが現在のプロセスに関連付けられているコード内に置かれているときは、 NULLを指定しなければなりません
>>389 拡張スタイルは使ってないし、
メニューは折り返しが起きるほど多くは無いです…
↑途中 SetWindowsHookExの3番目の引数のこと
>>395 ありがとうございます。
インスタンスハンドルをNULLですよね?
しかしやってみましたがダメでした。
自己レスですみませんが、どうも低レベルキーボードフックはやっぱり
グローバルじゃないとできないみたいです。
GetLastErrorで1429が返ってきたのですが、
その説明が、
ERROR_GLOBAL_ONLY_HOOK
This hook procedure can only be set globally.
ということでした。
道理で、ネットを検索してみてもグローバルな例しか見つからない訳です。
失礼しました。
VS6付属のMSDNには >WH_KEYBOARD_LL スレッド、または、システム となっているが、MSDN最新 (microsoft.com)では >WH_KEYBOARD_LL グローバルのみ となってる。MSDNだけでも最新版使えってことか。
>>388 > Note that you cannot specify the WS_OVERLAPPED style.
って書いてあるので、WS_OVERLAPPEDは指定しない方がいいのでは?
>>398 ありがとうございます。解決しました。
その文、Web上のMSDN Libraryには載ってますね…
VC++6のやつには載ってなかったんでorz
文字列入力ダイアログを表示させるAPIって無かったでしたっけ?
401 :
ほんたま :04/11/10 19:34:29
みなみなさまがた〜、GetLocalTimeを使って時間を取得すると、SYSTEMTIME構造体にセットされますが、 マニュアルを見るとSYSTEMTIME構造体のメンバは、 年 月 曜日 日 時 分 秒 ミリ秒 と書いてあるんです。 でも実際にSYSTEMTIME構造体にアクセスして先頭から順番に値を表示してみると、 月 曜日 日 時 分 秒 ミリ秒 0?(不明) の順番にメンバが並んでいるのが正しいのではないかと思うんです。 そこんとこどうなっているのかお聞きしたいんですが…? 教えてくだされ〜♪
402 :
ほんたま :04/11/10 19:52:32
みなみなさまがた〜、いまSYSTEMTIME構造体の先頭に印をつけて、バイナリファイル見てみたところ、 何故かSYSTEMTIME構造体の先頭番地より2バイト前のアドレスを読むと、年が正しく取得されることが判明しました! だからメンバの並び方はマニュアル通りで良かったのですが… みなみなさまがた〜、何故SYSTEMTIME構造体の先頭番地より2バイト前から値がセットされるのでしょうか? 教えてくだされ〜♪
お前のやり方がおかしいだけだろ。
404 :
ほんたま :04/11/10 20:07:44
>>403 つーか実際にはSYSTEMTIME構造体の構造はこう↓なってるんではないかと…
予備領域
年
月
曜日
日
時
分
秒
ミリ秒
でGetLocalTime(&SYSTEMTIME)と呼び出すと、自動的にSYSTEMTIME+2番地から値がセットされていくんではないかと…
どうでしょうか〜みなみなさまがた〜♪
バカすぎて笑える。
406 :
ほんたま :04/11/10 20:19:39
あるいはSYSTEMTIME構造体はPREバイト付きの構造体なのかもしれんです… PREバイトというのは、おりがいま思い付いた概念で、構造体の先頭番地の前に何バイトかの領域を持っていて、 最初のメンバはそこから始まるようにしたもののことを言う。 マイクロソフトのことだから、PREバイト付きの構造体という概念を持っていてもおかしくはない…
つまらんネタだなぁ
winbase.hからのコピペ typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
コテハンってこんな奴ばっかりだな…
wYearもWORDなのか。 65536年問題が心配だな
412 :
ほんたま :04/11/10 20:45:02
>>408 最初のwYearはDWORDってことはないか?
そうすればすべてがつじつま合うんだが…
ドキュメントの書き間違いかもしれんぞ。
そう思うんならヘッダ見れ
> でも実際にSYSTEMTIME構造体にアクセスして先頭から順番に値を表示してみると、 アクセスの仕方に問題がある悪寒。
415 :
デフォルトの名無しさん :04/11/10 21:14:47
ATOMってなんですか?
アライメント
あ〜すみません、猫のところに説明がありました。探し方が悪かった・・・。 でも、イマイチなににつかうかわからない・・・。
>>416 グローバルアトムは比較的簡単にプロセスをまたぐ文字列のやり取りに使える。
ウィンドウクラスのアトムはCreateWindow(Ex)でクラス名の文字列を指定するよりこっちを使う方が俺は好き。
ローカルアトムは……、何に使えばいいんだ?2バイトケチるためか?
2038年問題ってSYSTEMTIMEだと起きないの?
浮動小数点では解決しない(RFC2550)
ビットマップの平均色を求めるにはどうすればいいですか? 例えば1*2のビットマップで(255,255,255)と(0,0,0)なら(128,128,128)みたいな感じです。 正確さよりも処理の速さを優先したいです。
自分で考えろ
>>423 1. MMX 命令で自前の処理を書く
2. Intel の IPP 等を買ってきて使う
3. DirectX のテクスチャにして、ミップマップの自動生成機能を利用する
どれでも適切なやり方でどうぞ。
426 :
ほんたま :04/11/10 23:41:48
>>414 >アクセスの仕方に問題がある悪寒
おみゃ〜はどうせ、マイクロソフトのコンパイラが定義してくれてる値を使って、SYSTEMTIME->wYearとかSYSTEMTIME->wMonthみたいなアクセスの仕方しか経験ないだろ?
だからwYearが何番目のメンバかwMonthが何番目のメンバかなんて考えたこともないだろ?
そういうのは隠蔽されているからな w♪
ところがおりは違う。
おりはマシン語を直接使っているので、wYearが何番目のメンバかwMonthが何番目のメンバかを知らないと、プログラミングできないわけだ。
だから[SYSTEMTIME][SYSTEMTIME+2]というようなアクセス方法を使う。
ところがメンバが2バイトずつ前にずれていることが判明したので、疑問に思ったわけだよ。
まあ、これはプログラミングにおける最高度の超絶技巧なので、カプセル化されたプログラミングしか知らないおみゃ〜には想像もつかないだろうがな…♪
自分じわかる?
釣れますか?
428 :
デフォルトの名無しさん :04/11/10 23:54:03
効果音なら、midiOutShortMsg より、sndPlaySoundの方が負荷は少ないのですか?
>>426 長レスに敬意を表して、釣られてみよう。残念ながらハズレ。
さすがにフルアセンブラはご無沙汰だが、今でも一部インラインで組むことくらいはある。
ていうか、コンパイラしか使ってなくてもデバッグの時にアセンブルソースくらい見ると思うけど。
それはともかく、
> マシン語を直接使っているので
↑このあたりの表現が気になった。実は偉大なお方?
430 :
ほんたま :04/11/11 00:07:30
おみゃ〜ら、すまん、全面的におりの勘違いだったよ^^; というのもおりは、[SYSTEMTIME]の先頭アドレスの値をまずECXレジスタに読み込み、その値を16ビット右シフトして、次にCXレジスタの値を作業用のバッファにセットしていたんだよ。 なぜ右シフトしたかといえば、ファイル表現で考えてECXレジスタの上位16ビットに先頭アドレスの値が、下位16ビットに次のアドレスの値がはいっていると勘違いしていたのよ。 とろこがこれは逆だったんだな…! だから右シフトするのをやめて、そのままCXレジスタの値をセットしたら、うまくいったというわけよ。 やっぱPREバイトとかドキュメントが書き間違ってるとかなかったよ。 マイクロソフトのドキュメントは正しかったよ…。 おりとしたことが、とんだミステイクだったよ♪ おみゃ〜らよ、自分じすまんな…どうじ?
やはりエンディアンネス絡みの問題だったか。思った通りじゃねーの。
432 :
デフォルトの名無しさん :04/11/11 00:14:03
リトルエンディアンも知らずに、マシン語云々言ってたのか。 もっと基本から勉強しろよ
StretchBltで1x1ピクセルに できたらいいな
434 :
デフォルトの名無しさん :04/11/11 08:53:24
リストビューで項目の編集をできるようにしたいのですが 1列目しか項目を選択及び編集ができず、2列目以降は選択もできない状態です。 以下、ソースです・・・。原因わかります? case WM_NOTIFY: if ((int)wp == LISTVIEW) { lvinfo = (LV_DISPINFO *)lp; switch (lvinfo->hdr.code) { case LVN_BEGINLABELEDIT: hEdit = ListView_GetEditControl(hList); break; case LVN_ENDLABELEDIT: GetWindowText(hEdit, buf, sizeof(buf)); ListView_SetItemText(hList, lvinfo->item.iItem, 0, buf); 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = 100;//列の幅 ピクセル単位 col.pszText = TEXT("社員ID"); col.iSubItem = 0; ListView_InsertColumn(hList, 0 , &col); int z; z = 1; col.iSubItem = z; col.pszText=TEXT("氏名"); ListView_InsertColumn(hList, z , &col); z++;
>>434 だからそれを「速くやる」方法について話してるんだろ。
>>434 今の小学生は3桁以上の計算は出来ません。
438 :
デフォルトの名無しさん :04/11/11 12:57:03
>>436 除算は最後の一回だけだし、
加算はループで足し算するんだが、普通に足すより速くはならんぞ。
乗算とか入らないなら、MMXも必要ない。
第一、こんな質問してくるレベルの人間にはそれで十分だ。
435 リストビューは1列目のラベルしか編集できない。
441 :
デフォルトの名無しさん :04/11/11 13:05:45
>>439 馬鹿か?それはお前の思い込みに過ぎんぞ。
この程度のことでカッカする方がどうかしている。
お前がこういう文章を書くときはカッカしている時だからといって、
他人までそうだと思わないことだ。
何にせよ技法の話だからスレ違い。 と言いたいが面白いのでもっとやれ
444 :
デフォルトの名無しさん :04/11/11 13:11:00
>>435 編集は一列目だけ。
選択の方は、こんな感じで。
ListView_SetExtendedListViewStyle(_hWnd, LVS_EX_FULLROWSELECT);
>>442 そういうことにしたいのですね。勝手にそう思ってれば?
>>438 見た感じ
>>438 と
>>423 はだいたい同じレベルだと思うんだけど。
・どちらも平均とは何かについては知っている
・高速に処理する方法は知らない
オモロイ w
それはさておき、カラーの平均ってなんだろ。 RGB各プレーンそれぞれの単純平均だと赤とシアンの平均がグレイになるんだけど。 グレイであることが保証されてるなら単一プレーンだけの平均ですむし、 平均輝度とか平均彩度とか、何が要求されているのかよく判らんね。
>>447 算術平均以外の平均なら、ほげほげ平均とかって明記するんじゃない?
ってのはともかく、アルゴリズム的には
>>438 の言うように足して割るのが最適だから、
あとは
>>425 の言うように実装手段でアレコレするしかない。
449 :
デフォルトの名無しさん :04/11/11 13:16:53
>>445 全ピクセルの平均をとるなら、データスキャンして普通に加算するのが一番速い。
画像をロードした瞬間にわかるって言ってもいいぐらい。
今時のCPUなら、アセンブラ化してもほとんど変わらないよ。
450 :
デフォルトの名無しさん :04/11/11 13:19:22
>>448 MMX使っても速くならんぞ?
テクスチャにするなんて論外だ。転送にめちゃくちゃ時間がかかる。
それともバイリニアで縮小画像を作ることを考えているのだろうか?
>>449 今時のCPUはキャッシュミスの際のペナルティが(そうでない場合との比較で)大きいから、
メモリをスキャンするときにアセンブラでちゃんとプリフェッチを入れれば簡単に+10%位にはなるよ。
Intel Compiler とかなら勝手にやってくれるかもしれんが。
ごく小さい領域の単純平均ならMMXつかえばRGB同時に計算できるとかあるけどな。 あとは精度落としていいならサンプル間引くぐらいしかないんじゃないか。
453 :
デフォルトの名無しさん :04/11/11 13:22:59
>>451 そこまでの最適化を必要としている奴が、
>>423 みたいな質問よこすか?
「ここまでやって、これが限界でしょうか」というのなら、
極限までの最適化方法を教える努力をするけどね。
>>452 >あとは精度落としていいならサンプル間引くぐらいしかないんじゃないか。
業務向けにマトモな高速化案キタ━━━━━━(゚∀゚)━━━━━━ !!
そういえば画像処理で画素間引いたりして高速化するのは定石だな・・
455 :
デフォルトの名無しさん :04/11/11 13:27:54
>>452 整数「加減算」だけならMMXを使う必要はないって。
通常のアセンブラでも同時計算は可能。
間引くのは有効だけど、そもそも画像をメモリへロードする方が重いので、
そこまで気にするのがちょっと疑問。
457 :
デフォルトの名無しさん :04/11/11 13:29:02
>>423 これが Win32 API スレであることを考えると、たぶん真っ当な答えは
・Bitmapがある程度大きい場合には、GetDIBits 等で DIB として取り出し、
ピクセルフォーマットに従ってメモリ値を読み出して平均をとる。
(可能であれば最初から DIB として画像を保持しておくべき)
・Bitmapが 1x2 とか小さい場合には、GetPixel で RGB 値を取り出して平均をとる。
・"ビットマップ"というのが画像ファイルのことであれば、LoadImage で DIBSection にして、
GetObject で DIB と BITMAPINFOHEADER を取得してアレコレする。
っていうような感じなんだろうなぁ。
460 :
デフォルトの名無しさん :04/11/11 13:44:14
ここでの質問して良いのか疑問ですけど、どこがいいのかわかりません でしたのでお願いします。 Windows2000やXPなんかでは、LANケーブルが抜けている場合 タスクトレイにネットワークのアイコンが出てLANケーブルが 抜けていることがわかりますが、プログラム上からLANケーブルが 抜けていることを特定する方法はないでしょうか?
MessageBox(NULL, "LANケーブルは抜けていますか?", "質問", MB_YESNO);
C = 繰り上がりがある場合の繰り上がり (v0 & v1) <<1
S = 繰り上がりを無視した加算結果 (v0 ^ v1)
C + S は足すと普通の加算になる。右に1シフトする(2で割る)と平均になる。
(S は各バイトの最下位ビットが立っている可能性があるから、0xfefefefeでマスクしておく)
精度は低く速度も遅いがわかりやすい代替物は、
((v0 >> 1) & 0x7f7f7f7f) + ((v1
>>1 ) & 0x7f7f7f7f)。
>>462 COBOL 出る前ってこんなんばっか見たいだった気がする。なつかしい。
とてつもないジジイが紛れ込んでないか?
468 :
デフォルトの名無しさん :04/11/11 15:22:47
>>460 このスレのどこかに同じような質問なかったっけ?
>>468 ほんとですか〜。
探してたのですが見つけきれませんでした。
もし思い出されたらご一報お願いします。
WinXP SP2を適用後に、RegSaveKeyがエラーになってしまいます。 戻り値は 87「パラメータが間違っています」となります。 SP1以前は正常に動作していました。 SeBackupName 特権は取得しています。
小手先でいじるよりも SetStretchBltMode(hdc,HALFTONE); して StretchBltしたほうが速いと思う。 DDBならハードウェアアクセラレーションが効くかもしれない。
473 :
デフォルトの名無しさん :04/11/11 18:08:41
ボタンの上にマウスカーソルが来た時に来るメッセージは無いでしょうか。 if(HIWORD(wParam) == BN_XX) みたいなのを探していたのですがありませんでした。
WM_MOUSEHOVER
>>474 それでできそうです。ありがとうございました。
IPHlpApi.h を使えば ネットワークのいろいろな情報が取得できるけど Cable Disconnected って直接的に取得は出来ない気がします。 何を持って Cable Disconnected 状態なのか特定できないものでしょうか? これってWin32APIよりMFCかな・・・
USBオーディオデバイスに直接アクセスしたいのですが、GUIDを知る方法が分かりません。 ヒューマンインターフェースデバイス(HID)ではHidD_GetHidGuidでゲットしたのですが… 御教示おねがいします。
478 :
デフォルトの名無しさん :04/11/11 20:15:16
現在キューに入っているメッセージではなくて Windowsシステムにどのようなメッセージが用意されているのか MSDNで探したいのですが、 urlないし検索のためのキーワードを教えてください。
479 :
デフォルトの名無しさん :04/11/11 20:18:08
>>478 ソースもらうしかねえだろな
あとアプリ定義のメッセージもあるわけだが
それはどーするんだ?
全てじゃないです。
482 :
デフォルトの名無しさん :04/11/11 20:32:13
ボタンに文章ではなくて、 ビットマップなどの絵を表示する方法を教えてください。
483 :
デフォルトの名無しさん :04/11/11 20:35:42
>>480 BM_ とか CB_ みたいに WM_ で始まらないのもいっぱいあるぞ
>>482 BS_BITMAPとかBS_ICON、もしくはBS_OWNERDRAW
そういや、MSが用意してるメッセージで、WM_USERとか使うのが何個かあったよね 自作メッセージって、どの辺の範囲使っておけば、MSのライブラリと競合しないものなの? 自作メッセージって結構使うんだけど、新しくコントロール追加した時に競合しないか心配だったりする
>>486 WM_APP以降を使っておけば、とりあえず競合はしないので安心。
WM_APP + 0x3FFFまで
>>488 >>489 どもです。
既に作ったプログラムを直すのは面倒ですが、次からはそれ以降で作ります
ところでWM_USERからは何に今は使うの?
自作のカスタムコントロールとかかな?
コントロールが使ってた肝する。
みなさん貴重な意見をありがとうございます。 お察しの通り私は知識も経験も少ない初心者なのでとてもためになりました。 デジカメサイズのビットマップ200枚ほどの平均色を求めたかったので速さにこだわっていました。 適当に間引きながら足し算で求める方法でアプローチしてみます。
デジカメのデータだとファイルI/OとJPEGデコーダで律速されそうだが。 IJLってもう無料で入手不可能なんだったか?
498 :
デフォルトの名無しさん :04/11/11 22:40:22
ダイアログが表示されているときに押されたボタンの仮想キーコードを 表示させたいんだけど、どうやって押されたキーのコード取得するんですか?
>>496 画像の色計算より
読み出しとかにかかる時間のほうが支配的だと思うから
速度気にしなくていいんじゃないかな。
200枚って、オーバーフローしないサイズ?
0xfefefeの話題が出てたので、余計な補足を。
((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )+((a++&0xf8f8f8)
>>3 )
で、int32 *a のRGBデータの8点平均。
2のべき乗ならこのやりかたがはやいよー。
まちがえた。 シフトは足した後で一括でやろう。
a[?]使った方がイイかも?
>>501 些細な高速化の割には精度ガタ落ちだから、素直に
>>459 を7回やったほうが良いような気がする・・例↓
#define Ave2(a,b) (((a) & (b)) + ((((a) ^ (b)) & 0xfefefefe) >> 1))
#define Ave4(a,b,c,d) Ave2(Ave2(a,b), Ave2(c,d))
#define Ave8(a,b,c,d,e,f,g,h) Ave2(Ave4(a,b,c,d), Ave4(e,f,g,h))
>>504 ごもっとも。
でも、些細な高速化に興味が有るので許してください。
>>423 も、とりあえず満足したようだし、
スレ違いの話題はこの辺に
続きをやりたければ、画像処理スレか最適化スレにでもどぞ
>>506 BMPの話題はWin32だよー。
でも、確かにこの辺にしておくのが良いですね。
この辺に。 ね。
進行を止めてしまった。 申し訳ないです。 悪気は無いんです。 許してね。 遠慮せずに書き込んでねー。
最小化してから再び最大化したときに、 親ウィンドウの部分は再描画されるのですが、 子ウィンドウの部分は真っ白になってしまいます。 子ウィンドウも描画させるにはどうしたら良いでしょうか。
SDIです。
>>512 OnDrawとかOnPaintで描いてないとかそんなんじゃ
MFC使わずにSDKだけでやっています。 汚いコードですが、こんな感じです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hChild01; PAINTSTRUCT ps; HDC hdc, hBuffer; static HBITMAP hBit01; switch (msg) { case WM_CREATE: hBit01 = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, (LPCTSTR)IDB_BITMAP1); MyRegisterClassDefault(((LPCREATESTRUCT)lParam)->hInstance, Child01, szChild01); hChildOL01 = CreateMyWnd(IDhChild01, hWnd); ShowWindow(hChild01, SW_SHOW); break; case WM_PAINT: hdc = BeginPaint(hWndOpen, &ps); hBuffer = CreateCompatibleDC(hdc); SelectObject(hBuffer, hBitMAP1); BitBlt(hdc, 0, 0, 800, 600, hBuffer, 0, 0, SRCCOPY); DeleteDC(hBuffer); EndPaint(hWndOpen, &ps); break; } (つづく)
(つづき) LRESULT CALLBACK ChildProc(HWND hChild01, UINT msg, WPARAM wParam, LPARAM lParam) HDC hdc, hBuffer; PAINTSTRUCT ps; static HBITMAP hBitKuro; switch(msg){ case WM_CREATE: hBitKuro = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, (LPCTSTR)IDB_Kuro); break; case WM_PAINT: hdc = BeginPaint(hChild01, &ps); hBuffer = CreateCompatibleDC(hdc); SelectObject(hBuffer, hBitKuro); BitBlt(hdc, 0, 0, 200, 120, hBuffer, 0, 0, SRCCOPY); EndPaint(hWndOL01, &ps); break; } プログラムを始めて3週間なのですが、 いきなりMFCを覚えたほうが楽でしょうか?
MFCのソースを読めばよし。
>>517 あー WM_GETDLGCODE じゃだめか。
WM_KEYDOWNのwParamじゃだめなん?
>>515 MFC覚えた方が楽かも知れんが、そのコードを理解しながら
書いたんなら、そのまま一本位 API でプログラム書いてみたら。
基礎を勉強することは悪いことではない。
>>515 うっかり消しただけかもしらんが、ChildのhBufferをDeleteしてないよ。
それによってhBitKuroのSelectが2回目以降失敗しているのではないかな?
左右にスクロールできて、複数のボタンを配置できるスライダを作りたいと思い、 カスタムコントロールについて調べてみたんですが、これは ・所定の位置にウィンドウを作る ・ボタン、スライダのグラフィックを自作する ・カスタムコントロール用のプロシージャにて、マウスクリックのメッセージを受け取ったら その時の位置に応じて動いた場合の動作を決定する。つまりボタンの位置を常に把握し 位置関係の判定を全部やらなくてはならない という方針で良いのでしょうか?もっと効率良い方法があるのならご教授頂ければ幸いです。 イメージとしてはこんなカンジです。 ・スライダをクリックしてドラッグした場合: +----+----+----+----+----+----+----+----+ 0 5 10 15 20 25 30 35 40 -+----+----+----+----+----+----+----+---- 5 10 15 20 25 30 35 40 (左へ4メモリスクロールさせた場合。右に隠れていた4つの目盛りが現われる) ・ボタンをクリックしてドラッグした場合:(ボタン:*とする。複数存在可能) +----+----+--*-+----+-*--+--*-+----+----+ ↑を左へクリック&ドラッグした場合 +----+-*--+----+----+-*--+--*-+----+----+ ↑ここへ動く
猛烈にずれた…orz +----+----+----+----+----+----+----+----+ 0 5 10 15 20 25 30 35 40 -+----+----+----+----+----+----+----+---- 5 10 15 20 25 30 35 40 +----+----+--*-+----+-*--+--*-+----+----+ ↑を左へクリック&ドラッグした場合 +----+-*--+----+----+-*--+--*-+----+----+ ↑ここへ動く 今度こそうまくいくかな(´・ω・`)
その方針でいいです
>>524 ありがとうございました。面倒そうだなぁ…(汗)
526 :
デフォルトの名無しさん :04/11/12 09:02:16
スレッドについて質問 以下を実行する: int main(void) { DWORD dwThreadId; LPTHREAD_START_ROUTINE lpStartAddress = ThreadFunction; for ( DWORD i = 0 ; i < 2; i++ ) { ::CreateThread( NULL,// セキュリティ 0,// スタックの大きさ lpStartAddress,// 開始する住所 &i,// パラメター 0,// スレッドの状態 &dwThreadId// スレッドID ); } } // スレッド函数 DWORD ThreadFunction(LPVOID pParameter){ DWORD* pdwInteger = (DWORD*) pParameter; TRACE( "%u\n", *pdwInteger ); return 0; } これで, ThreadFunction(0) ThreadFunction(1) が実行されることを期待したいけど,なぜか ThreadFunction(1) ThreadFunction(1) が実行される. どうしてなん?
>>526 CreateThread() した瞬間に新しいスレッドが走り出すわけではないか
ら。つーか、最近同様の質問を見た覚えがあるぞ…
528 :
526 :04/11/12 09:07:11
>>527 スレッドをどのタイミングで走るわけ?
また,俺の意図どおりに動かすにはどうしたらええん?
知ったこっちゃねえ
>>528 最初のスレッドが情報を取得したことを親スレッドに何らかの方法で通知する。
親スレッドはそれを受けてから次のスレッドを起動する。
>>520 ありがとうございます。頑張ってみます。
>>521 が正解でした。
各入門書や入門ページで口を酸っぱくして言われている、
「必ずGDIオブジェクトを削除しなければならない」
の意味がやっと分かりました。
>>526 > &i,// パラメター
の説明をしてもらおうか。
>>531 > 「必ずGDIオブジェクトを削除しなければならない」
> の意味がやっと分かりました。
たぶんまだ分かってないと思う。
>>528 作ったスレッドが動き出すのは、少なくとも、最初のコンテキストスイッ
チよりは後だろうよ。
そもそも、自動変数のアドレスをスコープを越える可能性のある関数に
渡しちゃダメでしょ。
一番簡単なのは、
CreateThread:
&i,==>reinterpret_cast<void*>(i),
ThreadFunction:
TRACE( "%u\n", *pdwInteger );
==>TRACE("%d\n", reinterpret_cast<int>(pParameter));
>>501 そのコードは移植性ないと思うんだが
VC++だとインクリメントの順番が副作用完了点を挟まなくても
別途保証されてたりするのか?
>>534 されてないけど、501みたいなへたれコードは誰も書かないから問題ないよ。
遅いし。
いつもお世話になっております UpdateLayeredWindowに関する質問です デスクトップマスコットのようなウィンドウを UpdateLayeredWindowを使って描画しています αチャネルを使って透明化する部分は全く問題ないのですが、 既に配置済みのボタンやコンボボックスが UpdateLayeredWindowで指定したイメージで上書きされてしまい、表示されずに困っています (実際、配置はされていて、マウスイベントなどは問題なく処理できます) 最終手段として、 コントロール以外をカラーキーで透明化したウィンドウと イメージをαチャネルで透明化したウィンドウを2枚重ねて動かそうと考えましたが、 他によい方法があるのではないかと思い投稿しました 良い方法をご存知の方がいらっしゃいましたら、よろしくお願いします
よく分からんがレイヤードウィンドウにコントロールを子ウィンドウとして配置してるってことか?
>>536 UpdateLayeredWindow使ったことないけど
イメージの上にコントロールにWM_PRINT送って描画してもらい、UpdateLayeredWindowするとか。
コントロールがクリックされたら、そのイメージを作ってUpdateLayeredWindowしなきゃならなそうだけど。
ある領域に(CreateWindowで作成した領域<TEXT(static)>)に 小さな子ウィンドをたくさん作成し、領域をはみ出るものについては スクロールバーを出すことで対応したいと思っているのですが、 今、現在、ただ領域に子ウィンドウをたくさん作成すると 領域をはみ出てしまいます。 領域にスクロールバーを作ることはできたのですが・・・。 いい方法ありますでしょうか?
>>539 その領域を別Windowにして貼り付ける。
その前に作文力をなんとかしろ
レスありがとうございます。WS_CLIPCHILDRENを指定しましたらうまく行きました。 水平スクロールバーをつけちゃったりなんかしてみたのですが スクロールバーが移動しません。 最後の質問にしますのでよろしくお願い致します seru_hyouji_ryouiki = CreateWindow( TEXT("STATIC"),TEXT("") , WS_CHILD | WS_VISIBLE | WS_BORDER |WS_VSCROLL |WS_CLIPCHILDREN, 100,150, 700,300, hwnd,(HMENU)SERU_HYOUJI_RYOUIKI, ((LPCREATESTRUCT)(lp))->hInstance, NULL ); scr.cbSize = sizeof(SCROLLINFO); scr.fMask = SIF_PAGE | SIF_RANGE; scr.nMin = 0;scr.nMax = 9; scr.nPage = 2; SetScrollInfo(seru_hyouji_ryouiki , SB_HORZ , &scr , TRUE); scr.fMask = SIF_POS;
544 :
ほんたま :04/11/12 20:16:41
>>482 >ボタンに文章ではなくて、
>ビットマップなどの絵を表示する方法を教えてください。
文章?ボタンに小説書いてんの?
545 :
デフォルトの名無しさん :04/11/12 20:25:00
いけず
>>543 水平スクロールバーはWS_HSCROLLだよね。
WM_HSCROLLメッセージは正しく処理してる?
>>543 そのコード、続きはないの?
それだけだと範囲指定しただけで、位置を設定していないし。
>534 あのコードはインクリメントの順番が保証されている事を要求しないと思うが。
>>548 まとめてインクリメントされるとアボーン。
そういう処理系もあるのか。 感謝。
>>549 そんな処理系が有ったら恐い。
実例あるのか?
つーか言語仕様的に式評価の前か後かに まとめてインクリメントされるのでは? int a = 1; int b = (a++) + (a++) + (a++) + (a++); だと b = 4 で int a = 1; int b = (++a) + (++a) + (++a) + (++a); だと b = 20 になる。
少なくとも C や C++ では、1つの式の中に副作用が発生する項目を 複数含んでいるコードの動作は未定義だったはずだよ。
うちはb=15だった 未定義だな
555 :
デフォルトの名無しさん :04/11/13 01:35:29
タイミングは未規定 結果の値が未定義
>552 ほんとだ。 失礼しました。
とにかく
>>501 のコードは全然ダメだろ
ポインタに&演算してるし
スマソ、たしかに未定義でした。
多重バッファ使った waveOutWriteがうまくいきません。 バッファとバッファの間に、ノイズ(音切れ)が入るのです。 16個のバッファにデータをとりあえずロードさせ再生させても起こります。 バッファに書く速度が間に合ってないわけじゃないみたいです。 2個目以降のバッファは、メッセージ着てから再生では遅いのでしょうか? とりあえず、ソースの部分貼り付けます。 1個目再生 ::waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdr[0],sizeof(WAVEHDR)); ::waveOutWrite(m_hWaveOut,&m_pWaveHdr[0],sizeof(WAVEHDR)); while(1)Sleep(1); // とりあえず待機(本来は、随時バッファ読み込み) MM_WOM_DONE メッセージで、 ::waveOutUnprepareHeader(m_hWaveOut,&m_pWaveHdr[m_nRingCursor],sizeof(WAVEHDR)); m_nRingCursor = (m_nRingCursor+1) % m_dwRingBufferSize; ::waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdr[m_nRingCursor],sizeof(WAVEHDR)); ::waveOutWrite(m_hWaveOut,&m_pWaveHdr[m_nRingCursor],sizeof(WAVEHDR)); メッセージのコールバックは、関数タイプです。
>>560 >2個目以降のバッファは、メッセージ着てから再生では遅いのでしょうか?
遅いよ。
用意したバッファは全部あらかじめ書き込んでおいて、
コールバックで使い終わったバッファに次のデータを用意して、
再び書き込む。
全部のデータを再生し終わるまで延々と繰り返す。
が、基本。
ちなみに、最低3個以上のバッファを作ることが推奨されているね。
>>561 いけました。
Writeの内容解釈間違えてた。
Writeって、書き溜め(バッファ)できたんですね。
ありがとうございます。
CreateWindow()のスタイルBS_OWNERDRAWでWM_MEASUREITEMが発生すると書いてあったのですが発生している気配がありません。 どうしてでしょう? CreateWindow( TEXT( "BUTTON" ), TEXT( "" ), WS_CHILD | BS_OWNERDRAW, 0, 0, 200, 100, hWnd, (HMENU)1, hInstance, NULL ); ...... switch( msg ){ case WM_MEASUREITEM: MessageBox( hWnd , TEXT("aaa") , TEXT("bbb") , MB_OK ); break; }
とりあえずmessageboxを確認に使うのをやめなさい
565 :
デフォルトの名無しさん :04/11/14 00:45:05
(0,0) の位置にあったウィンドウに、 以下の機能がついています。 ・チェックボックス ・入力欄 入力欄のところに実行した瞬間、文字列を転送するプログ ラムを考えているのですが、どんな関数が必要になってき ますか? WindowFromPoint()は必要になるだろうと思ったのですが、 それ以上がいくら調べても分かりません。 入力欄のコントロールIDを得る関数があればいいのかなぁ とか、色々考えて検索ずっとしてるのですが、そんなのないし・・・ これから先、検討がつきません。 どなたかお助けを・・・ M(._.)m
>>564 どのような、確認の方法がよいでしょうか?
>>565 SetWindowText
って既出?
569 :
お助けお願いm(_ _)m :04/11/14 01:29:03
どなたか詳しい方教えていただけないでしょうか? WindowsXPではGetSystemMetricsで検出できるのですが、 Windows2000でシャットダウン中を検出する事は可能でしょうか?
>>568 それ使おうと思ったんすけど、
入力欄のコントロールIDが、同じプログラム内で
作ったものじゃないんで、わかんないのが前提なんっす・・・
レスありがとう
>>567 ありがとうございます。
先ほどのプログラムを下のように書き直してみました。
ほかのところでの文字の表示は成功したのですがやはりWM_MEASUREITEMのところは通っていないような気がします。
それともAllocConsoleの使い方が間違っているのでしょうか?
CreateWindow(
TEXT( "BUTTON" ),
TEXT( "" ),
WS_CHILD | BS_OWNERDRAW,
0, 0, 200, 100,
hWnd,
(HMENU)1,
hInstance,
NULL
);
AllocConsole();
hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );
......
switch( msg ){
case WM_MEASUREITEM:
WriteFile( hStdOutput , TEXT( "aaaa" ) , 4 , 0 , NULL );
break;
}
>>571 CreateWindowの前にAllocConsoleしたほうがいいと思うけど。
ていうかBS_OWNERDRAWでそのメッセージが送られるってどこに書いてあるの?
WM_DRAWITEMの間違いだったりして。イヤン
コピペ。 BS_OWNERDRAW オーナー描画ボタンを作成します。 オーナーウィンドウは、ボタンが作成されると WM_MEASUREITEM メッセージを受け取り、 ボタンの外観が変わると WM_DRAWITEM メッセージを受け取ります。 他のボタンスタイルと組み合わせることはできません。
Win32 API プログラマーズリファレンスには、 オーナー描画ボタンを作成します。オーナー ウィンドウは、 ボタンが作成されるときに WM_MEASUREITEMメッセージを受け取り、 ボタンの外観が変わったときにはWM_DRAWITEMメッセージを受け取ります。BS_OWNERDRAWスタイルは、 ほかのボタン スタイルと組み合わせることはできません。 と書いてあります。
>>575 CreateWindowのBS_OWNERDRAWの説明です。
俺のにはこれしか書いてない BS_OWNERDRAW Creates an owner-drawn button. The owner window receives a WM_DRAWITEM message when a visual aspect of the button has changed. Do not combine the BS_OWNERDRAW style with any other button styles.
>>563 試してみたけど、うちの環境でも WM_MEASUREITEM は送られてこないっすよ。
WM_MEASUREITEM の説明にも、そのようなことは書いてないし…。
>>565 やりたいことがよく分からないけど、
ウィンドウハンドルは WindowFromPoint() や ChildWindowFromPoint() で取得、
IDは GetDlgCtrlID() で取得するってのはだめっすか?
>>569 WM_ENDSESSION で検出するのはだめっすか?
メインウィンドウのようにタイトルバーや枠つきのエディットコントロール作りたいのですが教えてください
>>579 う〜ん、なんとか成功させてお礼を言いたいとこだったけど、
もう今日は限界・・・合歓いっす。
レスありがとう。わずかな希望が見えた気がしたでつ。
>>565 IDがなくともウィンドウハンドルがあれば十分だと思うが。
>>569 以下は前にどっかで見たやつのコピペだけど
Windows 2000 ですが、実際にやって調べてみました。
HKCR\Software\Microsoft\Windows\CurrentVersion\Explorer
の Reason Setting と Shutdown Setting が変化するようです。
(どちらも DWORD 値)
シャットダウン
Shutdown Setting=0x00000002
Reason Setting=0x00000005
再起動
Shutdown Setting=0x00000004
Reason Setting=0x00000005
ログオフ
Shutdown Setting=0x00000001
Reason Setting=0x00000000
ちなみに、regmon という
レジストリ操作を監視するツールを使って調べました。
続き
HKCR\Software\Microsoft\Windows\CurrentVersion\Explorer
Shutdown SettingとReason Settingのキーは無いようです。
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer
には存在していましたので、こちらで試しています。
OSのシャットダウン時の処理なので、ちゃんと動くまで再起動しまくって
いるので時間かかるー(笑)
キーさえ分かればきっと情報があるはずだ、ということで検索してみた。
ttp://www.microsoft.com/windows2000/techinfo/reskit/en-us/regentry/36031.asp これによると Shutdown Setting はあくまでダイアログでの選択値のようっす。
Reason Setting の方は見つからず。
VFWを使って画像処理ソフトを作っているのですが、フレームレートが15FPS以上に上がってくれません 他のソフトを使えば、30FPS出ているので、カメラ・PCの性能は十分あります これは、VFWの仕様でしょうか? それとも、プログラムのコードが問題あるのでしょうか?
>>586 capPreviewRateやCAPTUREPARMSのdwRequestMicroSecPerFrameでの設定値を変えても、
capSetCallbackOnFrameで設定したコールバック関数の呼び出しタイミングが15FPSを切ってるという話です
static TCHAR strFile[MAX_PATH]; LPSTR strText; (中略) GetOpenFileName(&ofn); hFile = CreateFile( (LPCTSTR)strFile , GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ); if (hFile == INVALID_HANDLE_VALUE) break; strText = (LPSTR)malloc(GetFileSize(hFile , NULL)); ReadFile(hFile , strText , GetFileSize(hFile , NULL) , &dwBytes , NULL); CloseHandle(hFile); SetWindowText(hwnd , strFile); SetWindowText(edit , strText); 指定して読み込んだパスのファイルを開いて、 エディタ(edit)に書き出すコードのつもりなのですが、 エラーなしですが、何も書き出せません。パスまでは読み込める状態です。 間違っていそうな部分を上げましたが、情報不足でしたらすみません。 お願いします。
WM_SETTEXT
malloc の戻り値くらいチェックしろや
問題解決とは直接関係ないがちゃんとナル文字の分もバッファを取れ。 DWORD dwFileSize; ・・・ dwFileSize = GetFileSize(hFile , NULL); strText = malloc(dwFileSize + 1); ReadFile(hFile , strText , GetFileSize(hFile , NULL) , &dwBytes , NULL); strText[dwFileSize] = '\0'; ところでchar/TCHARのハンガリアンはstrじゃなくてsz。どうでもいいことだが。
>590 すみません。事故解決しますた。 edit がstatic になってませんでした。 NULLではなかったっぽいです。 ご迷惑かけました。
>591 補足かたじけないです。 WindowsSoftのコードを参考にしたのですが。 それにしてもWinプラは型がややこしい。。。
mallocの戻り値、ReadFileの読み込みサイズくらいはチェックしましょう。
595 :
デフォルトの名無しさん :04/11/14 17:31:20
ちょっと質問します。 自分のウィンドウに来たメッセージ(マウスボタンの押下など)を 裏に隠れているウィンドウに伝える方法ってありますか? SetWindowRgnでウィンドウに穴を開けると 穴の部分のウィンドウメッセージは裏にいるウィンドウに伝わりますが 穴が空いてない部分でも同じようにメッセージを伝えたいのです。
Mac のアプリを Win に移植したいのですが ChasingArrows (ぐるぐる回転する矢印)を絵画するAPIはどれに相当するのでしょうか。 Macの場合はこれです。 Declare Function DrawThemeChasingArrows Lib "CarbonLib" (inBounds as Ptr, index as Integer, state as Integer, eUPP as Integer, userData as Integer) as Integer
絵画(かいが?)するAPIってなんだよ。
描画でしょ(w
VC++でアプリ作ってるんですが、 CreateAbout?AboutWindow?Aboutを表示する関数があった気がしたんですが 誰か分かる人居ませんか? どっかにAboutが入ったAboutを表示する関数があった気がして・・ 無いようでしたら、おとなしくDialogで作ります。
>>595 例えば、上にあるウィンドウが子ウィンドウならプロシージャに
SendMessage(GetParent(hWnd),msg,wParam,lParam);
って感じに、そのまま親ウィンドウにスルーしつつ、自分の処理もするとか
”伝える”って事は、自分で作ったウィンドウで隠れた場合だよね
親子関係じゃ無くても、下にあるウィンドウのハンドル取得して、同じようにすれば良い
VFW詳しい人って居ないのかな…
プログラミングwindowsという本を見ていてどうしてもわからなかったのですが static TCHAR szAppName[] = TEXT ("SysMets1");という一文があったのです。 今までヨンたほかのwindowsプログラミングの書籍ではTEXT("")という表記がまったく使われていなかった(static TCHAR szAppName[] = "SysMets1";っぽい感じ)上に、プログラミングwindowsという書籍の索引を引いてもまったく解説されておらず困っています。 このTEXT("")というのはいったいどういう意味なのでしょうか? よろしくおねがいします。
>>601 嘘つけ。第2章で出てくるだろ。<プログラミングWindows(上)
603 :
デフォルトの名無しさん :04/11/14 18:51:51
>>597-598 さま、大変失礼しました。絵画ではなく描画です。
Mac のアプリを Win に移植したいのですが
ChasingArrows (ぐるぐる回転する矢印)を描画するAPIはどれに相当するのでしょうか。
Macの場合はこれです。
Declare Function DrawThemeChasingArrows Lib "CarbonLib" (inBounds as Ptr, index as Integer, state as Integer, eUPP as Integer, userData as Integer) as Integer
>>601 その本に馬鹿丁寧に書いてあるから
絶対読み落とすはずがない。
>>602 立ち読みで一部だけ読んだとか?
律儀にTEXTマクロ使ってる本ってあんまり見ないな…ネットでも少ないけど
>>603 日本語の「たくわん」に相当する英語を教えてください
>>606 さま、
Pickled Japanese radishだそうです
>>595 この辺でぐぐってみそ
WS_EX_TRANSPARENT
WS_EX_LAYERED
setLayeredWindowAttributes
>>599 ShellAbout()のことか?
ただしMicrosoftの文字が必ず入る。
611 :
デフォルトの名無しさん :04/11/14 19:56:36
下げ忘れた・・・すまそん・・(´・ω・`)
>>613 Windowsのシステムカーソルにそんなものはない。
LoadCursorのドキュメントから用途にあったものを探せ。
OSが変わればカーソルも変わる。
>>613 Windowsアプリでそれ使ってるアプリあるか?
レスありがとうございました
>>600 ”伝える”の意味はそれで合っています
隠れるウィンドウは親子関係にないので、どうすればいいか分からなくなってしまいました
まずは隠れているウィンドウのハンドルを取得する方法を模索してみます
>>607 , 609
レイヤードウィンドウについて調べてみましたが
完全に透明にしないとメッセージが裏のウィンドウに届いていませんでした
自分のウィンドウは見せる必要があるので、この方法では駄目でした
言葉が足りず、申し訳ありません
>>617 完全な透明にしなくても後ろのウィンドウにメッセージが行くのがTRANSPARENT
もしかしてWindowsにはChasing Arrowsコントロールそのものがないでしょうか。 長い処理などをユーザーに待たせる時にマウスカーソルを砂時計に変えるかわりに、 回転する矢印のコントロールをウィンドウに配置して、処理中を知らせる物です。
ない。砂時計しかない。そこでWin糞とか言ってはいかん。 やる気があるならリソース埋め込んで自前で作れ。
WS_EX_TRANSPARENTで無事に目的の事が出来るようになりました TRANSPARENTをレイヤードウィンドウと勘違いしていました ありがとうございました
>606が素晴らしいヒントを書いたのにねぇ。郷に入りては郷に従うべし。
>>623 別に素晴らしくもないと思う。むしろ回りくどくて書いた本人が満足してるだけっつーか。
627 :
デフォルトの名無しさん :04/11/14 21:05:30
OutputDebugStringのような機能を独自で作りたくて # そのままこれを使うといろんなアプリの出力が混じってしまうので TCP、プロセス間通信あたりで実装しようかと思っていますが もっとよい方法、定石、ライブラリみたいなものはあるんでしょうか?
>>626 =ではなく==を使う辺りがプログラム板って感じだ
>>626 違うよん。この件に関しては漏れは突っ込み入れ損ねたから。
>>624 悪いのは自分で
>>609 さんは的確な回答を示していました
622の書き方も変なので勘違いがないように訂正させてください
WS_EX_TRANSPARENTをWS_EX_LAYEREDを指定し
SetLayeredWindowAttributesを呼び出したウィンドウ=レイヤードウィンドウに付け加えることで、
自ウィンドウが存在しないかのようにメッセージがすり抜け、裏にいるウィンドウに送られるようになりました
何度も言葉足りずで混乱させて申し訳ありませんでした
>>627 そういうのを syslog といいます
>>634 日本語で「たくわん」に相当する英語 = 存在しない
じゃないか?
637 :
お助けお願いm(_ _)m :04/11/15 01:11:34
>>580 返事ありがとうございます。
残念ながら、その方法ではアプリケーションを終了するタイミングは
取れますが、私の欲しいOSのシャットダウン中であるという情報は
取れませんね。
何はともあれ返事をいただいた事に対して深く感謝いたしますm(_ _)m
638 :
お助けお願いm(_ _)m :04/11/15 01:14:37
>>584-585 返信ありがとうございます。
まだ試しておりませんので、なんともわかりませんが
まったく手がかりがなかったので参考にさせていただきます。
誠にありがとうございました。m(_ _)m
>>77 にある他アプリのOLEドラッグ開始の検出方法ってどんなものですか?
スパイウェアの開発者ですか?
DispatchMessage()の仕様について聞きたいんですけど このAPIの終了はプロシージャが終了して、そのリターン値を受け取ってから終了する ってことでいいんですか
はい。
THX てことはプロシージャは一つのWinMain()からは 1ループ(メッセージループ)毎に常に1回しか呼び出されないって理解してOKですか
↑ すんませんコレ スルーしといてください
メニュー項目に半角の'&'を出したいんですけど、 そのままだと次の文字がアクセラレータキーになっちゃいます。 どしたらいいですか。
&&
すいません質問です コンソールアプリケーションです GetCurrentDirectoryを使ってパスを取得しています アプリケーションをダブルクリックで実行させると正しいパスが帰ってくるんですが 他のファイルをドロップして実行させると「C:\Documents and Settings\hogehoge」というパスを取得してしまいます もちろんアプリケーションはそれとは別のディレクトリですし、ドロップしたファイルも同様です これはこういう仕様なのでしょうか?
>>648 シェル (Explorer) から exe ファイルをダブルクリックなりドラッグ・アンド・ドロップなりで起動した際の
カレントディレクトリはどこにも規定されていなかったと思います。
98系だと EXE のパスや開くべきファイルのパス、
NT系だとユーザのホームディレクトリになるんだったかな・・・
実行ファイルのパスを得るためには、GetModuleFileName という API が用意されています。
>649,>650 GetModuleFileNameで取得したパスを分解してディレクトリパスを取得して使ってみます ありがとうございました
652 :
デフォルトの名無しさん :04/11/15 20:56:21
確かにね、そういう仕様だ罠 なんかM$のデフォ設定きらい C:はブート用(入れなおせば済むファイル) D:をミラーリング(消えたらガクブル系) みたいな管理を徹底的に無視しやがる
わざわざGetModuleFileNameつかわなくても argv[0]に入ってるみたいだけど
>653 ああぁっ! コンソールアプリなのに忘れてましたw
655 :
デフォルトの名無しさん :04/11/15 22:23:51
こっちでいいのかわかりませんが、教えてください。 VB6でピクチャボックスにGetPixelつかうと、ウィンドウと重なっている場合、 前のウィンドウのピクセルを拾ってしまうんですが、 どうすれば重なって隠れているウィンドウの ピクセル色が拾えますか?
__argvを忘れてやるなよ。
__argvはVCローカルなり
便乗質問だけど GetCommandLineで得られる文字列にも「実行ファイルのパス」が含まれてますが これが確実にフルパスである、という保証はありますか? GetCommandLineとGetCurrentDirectoryとGetModuleFileNameとを比較してみたら 引数の順序や戻り値の仕様がバラバラで精神衛生上アレだと思った
全然ありませんが。>保証 引数や戻り値はまぁあれだ、作ってるやつ(チーム)がそれぞれ違ったりするんで許してやれ。
>>658 俺が試してみたら、ファイル名だけだったよ
ファイル選択ダイアログとかはGetCurrentDirectoryで良いけど、
実行ファイルのパスが知りたいならGetModuleFileName使うが宜しい
コマンドライン引数を任意のタイミングで知りたいなら、GetCommandLineを使えばよい
>>655 Windows 側でイメージは保持してくれません。
重なって隠れているピクセルは拾えません。
別のウィンドウが上に重なったら、その下にあるウィンドウのイメージは壊れます。
別のウィンドウの下になっている部分が表示される時には WM_PAINT
が送られますので自分で書かなければいけません。
よって、画面上にあるピクセルを取得しても別のウィンドウが重なっている時は
重なっているウィンドウのピクセルが返ってきます。
これを回避するにはあらかじめ画面に表示するイメージを別に作っておくしかありません。
「オフスクリーンビットマップ」で調べてみてください。
VB には他に逃げ道があるのかもしれませんが。
>>660 __argc, __argvは、VC6.0以降は非サポートなの?
663 :
デフォルトの名無しさん :04/11/16 09:49:03
指定したプロセスに対して, どんなスレッドが起こされているのか リアルタイムで表示するような アプリケーションてないですかね?
spy++
リヤルタイムじゃないかもしれない
666 :
デフォルトの名無しさん :04/11/16 10:21:53
リストビューのアイテムがクリックで選択されたと同時に そのアイテム番号(リストの行)を拾いたいのですが、 なんかメッセージ飛んできますか?
669 :
655 :04/11/16 11:40:09
>>661 わかりました。
ありがとうございます。
670 :
デフォルトの名無しさん :04/11/16 17:38:25
すいません。質問させてください。 Susieのプラグインで HLOCAL *pHBm : ビットマップデータ本体のメモリハンドルが返される とあるんですが、メモリの内容を見るにはどうすればいいですか?
671 :
デフォルトの名無しさん :04/11/16 17:38:56
すいません。VBスレと間違えました。
673 :
デフォルトの名無しさん :04/11/16 19:20:55
文字リテラルは_Tまたは_TEXTを使用して定義する(_TEXT("heloo")という具合)と書いてあったのですが、実際のコードに_TEXTを使用するとコンパイルエラーになってしまいます。 サンプルプログラムを見るとTEXT("")という形で_が使われていなかったりして書いてあることと実際がぜんぜん違うじゃないかと困っています。 #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, _TEXT ("Hello, Windows 98!"), _TEXT("HelloMsg"), 0) ; return 0 ; } 本に書いてあるとおりならこれで間違いないはずなのですがどうしてもコンパイルできないのはPCの問題でしょうか? VC++6.0使用してます
#include <tchar.h>
TEXT() や __TEXT() を使いましょう。 _T() や _TEXT() を使いたければ、tchar.h 等をインクルードしましょう。
/*-------------------------------------------------------------- HelloMsg.c -- Displays "Hello, Windows 98!" in a message box (c) Charles Petzold, 1998 --------------------------------------------------------------*/ #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0) ; return 0 ; }
>>674-675 わかりやすい回答ありがとうございます。
御礼をしておいてまた質問するもの失礼かと思いますが、#include <tchar.h> と_TEXTの組み合わせか、TEXT()を普通に使用するとではどちらが望ましいのでしょうか?
678 :
670 :04/11/16 19:40:54
>>672 ありがとうございます。
ロックを解除したいのではなく、中身を見たいんですが・・・
バカキター
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| |
>>678 / ∩ノ ⊃ ヽ J
( \ / _ノ | |
.\ “ /__| |
\ /___ /
683 :
670 :04/11/16 20:33:28
>>677 他のヘッダやマクロを使う特別な理由がなければ、TEXT() でいいと思うよ。
>>678 戻り値がメモリへのポインタなんだから、それを取得して好きに読めばよい。
取得したポインタの中身を読む方法が分からないんだとしたら、スレ違い。
686 :
デフォルトの名無しさん :04/11/16 22:17:18
Str系APIってMBCS考慮するんだな。 知ってた?
Win32APIで、メニューアイテムのテキストを収得、変更する方法はありますか
API で出来なくてどうやってメニューをハンドリングしろと? GetMenuString ModifyMenu
690 :
デフォルトの名無しさん :04/11/17 07:53:28
フックプロシージャをクラスのメンバー関数として持ちたいんですが、 staticで定義されたフックプロシージャにthisポインタを渡す方法は 何かないでしょうか?
691 :
デフォルトの名無しさん :04/11/17 08:40:32
>>690 SetWindowLong/GetWindowLong
>>690 自前の永続変数にthisアドレスをコピー。
>>691 回答ありがとうございます。
あと質問の際の情報が不足していました申し訳ありませんでした。
お教えいただいた対策は、WH_CALLWNDPROC等のプロシージャ側にWindowHandleが送られて
くるタイプのプロシージャに対しては有効なのですが、今回メンバー関数に入れたい
フックプロシージャは、WH_KEYBOARD、WH_MOUSEなのでプロシージャにWindowHandleは
送られてきません(WH_MOUSEは送られてきたかも..)。
こういった場合の対策法は何かありませんでしょうか?
>>692 やっぱり、その方法しかないんでしょうか..
>>693 自己レスです。
よく考えたらHookだと目的のWindow以外のHandleも受け取るので無理ですね
やっぱり
>>692 の方法が現実的なんでしょうか?
とりあえず、
>>692 の方法で組んでみます。他にスマートな方法を知っている方が
居られましたらお教えください。
>>691 ,
>>692 ありがとうございました。
>>693 は照れ隠しにスマートな方法はないか?
と全く心のこもっていないダミーの質問をして、己の短慮を誤魔化そうとした、に10000ペソ。
698 :
デフォルトの名無しさん :04/11/17 12:59:47
実行した後、自分自身が消えるような実行ファイルはどのような 感じで作ったらいいですか?
>>698 >ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
だそうだが、それは真っ当な用途のための質問かい?
はい、そうです。
ま、いいや 実行ファイルのパス取得して、別プロセス起動後、自アプリを終了 ググれば、サンプルはいくらでもあるよ NT系限定だけど、 MoveFileExでMOVEFILE_DELAY_UNTIL_REBOOTフラグを指定すれば、 再起動時に削除できる
>>699 アンインストーラ自身とかは自殺してくれないと困るだろ。
>>702 「アンインストーラを作りたいのですが・・・」
みたいに聞いてくれたら、
余計な突っ込みは入れないんだけどね
MSIとか、InstallWizardとかググればいいものを。 わざわざ自分でインストーラ作るのは車輪の再発明。
>>700-701 CreateFileでFILE_FLAG_DELETE_ON_CLOSEを指定する方法もある。
>>698 バッチファイルを作って、ループを回しそこで削除すればいい。
最後にバッチファイル自身を消す。
echo off :start del ほげほげ.exe if exist ほげほげ.exe goto start: del 自分自身.bat
前にここで聞いたときは 1) rundll32で削除用DLLを起動 2) ヒープ上に3)、4)をやるコードをコピーしてジャンプ 3) 自分自身のロックをFreeLibraryで解放 4) 自分自身を削除 という方法を教わった。 で、XPSP2 on Athlon64にしたらヒープにジャンプしたところで エラーが発生しましたとさ(チャンチャン
ヒープにコードを書くのは、いまや非合法という扱いになったね。 ま、元々そうだったけど明確に弾かれるようになった。 SP2のデータ実行防止(DEP)機能なのか? それとも多くのバイナリを/GSオプションでリコンパイルした結果?
virtualallocならいいの?
初めて質問します。 DirectXで描画している他人のウィンドウに落書きしたいのですが、 DirectXの描画速度が速いためにちかちかしてしまいます。 負けじとこちらもDirectXで描画してみたのですが、 やっぱりちかちかしてしまいました( つД;) 他人のDirectX描画をクリッピングとかできたりするんでしょうか? テスト・開発環境はWinXP SP2+VC7+DirectX9cです
>>709-710 原因はDEPだった。VirtualAllocでPAGE_EXECUTE_READWRITEを
指定したメモリを確保するように変更して解決
タスクマネージャが立ち上がったら終了するようなウィスルを作りたいのですが、 どうすればいいですか?
タスクマネージャ.exeを事前にすり替えrp
がんばってウィスれ!
正攻法ならグローバルフックとpsapiを調べれ
>>711 DirectXの描画速度は99%無関係だと思う
>>711 リージョン使って落書きの形のウィンドウを作って、
そのDirectXなウィンドウの上に置くとか。
>>718 ウィンドウを重ねて(TOPMOST)で作成しても、
落書きしたい相手のウィンドウが上書きしてくるんです。
(言い忘れましたが、落書きしたい相手というのがゲームなので少し特殊なのかもしれません…)
DirectXでTOPMOSTよりも前面に上書きするオプションがあるかどうかなど当たってみます。
>>711 サーフェスぶんどってそこに描画ならできたはず。
詳しくは知らないのであとは調べてくれ。
>>719 フルスクリーンだと
>>720 しないときついけどウィンドウモードならリージョンでも
いけるはずなんだけどなぁ。nVidiaのカードだとドライバーのバージョンでいろいろ
挙動が変わったと思う。Layerd Windowも試してみるといいかも。
IHTMLDocument2のwriteでxmlデータを出力してみたのですが、どうにもxmlとして解釈してくれません。 なんとかxmlとして表示させられないでしょうか?
>689 できました。づもありがとうございます。
副スレッドを立てて処理をする時 一方のスレッドが参照のみを行う(NULLでない間ループ等)場合でも クリティカルセクションオブジェクトというのは作る必要があるんでしょうか?
ない
たとえば状態の変化が NULL 5秒 NULL 5秒 !NULL 5秒 NULL 5秒 NULL 5秒 ポーリング感覚が10秒だったら検出出来ない罠
>>724 ポインタがNULLかどうかなら大丈夫だけど
一般にCPUが一命令で処理できないようなデータの参照は駄目。
あと最適化でNULL突っ込むタイミングが変わらないとも限らないから
volatile指定しておくといいかも。
他から紹介されてここにたどりつきました 個々のプログラムが使用するメモリー容量を取得したいのですが・・・ (タスクマネージャのプロセスタブで表示できる仮想メモリサイズ) APIはどれを使えばいいのか知りたいのですが解るかた教えてください。
729 :
デフォルトの名無しさん :04/11/18 15:53:29
serviceを作っています。 ある条件が真になるとserviceから現在logonしているuserのデスクトップ上で applicationを起動したいのですが方法をご存知の方教えてください。 現在は、ターゲットapplication起動用のapplicationを "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" に登録する方法を取っているのですが、serviceから直接起動できるのなら そのようにしたいと考えています。
CreateProcessAsUser
便乗スマソ。現在ログオンしているユーザーのトークン取得ってどうするの?
てきとーにOpenProcessTokenする
HDCのデータをビットマップファイルで出力するにはどうすればいいですか?
734 :
デフォルトの名無しさん :04/11/18 19:53:09
>>733 GDIにはないから、BITMAPFILEHEADER構造体→BITMAPINFOHEADER→色値の順にへこへこ書き出す
GDI+にはあるらしいが俺は試してないんで、すまんがコメントを控えさせていただく
>>733 IPicture::SaveAsFile()もあるでよ
736 :
デフォルトの名無しさん :04/11/18 22:54:56
現在表示されている画面に直接描画をしたいのですが どうしたらいいでしょうか? 単にデスクトップへの描画でなく デスクトップよりも手前に表示されているウィンドウがあればそれも含めて 現在の画面に直接落書きするようなことをしたいのです 画面に落書きが表示された状態でも操作は普通にさせたいので 画面のハードコピーをとって表示させてその上に書くというのは無しで
737 :
デフォルトの名無しさん :04/11/18 22:59:44
739 :
デフォルトの名無しさん :04/11/19 00:13:06
どこかのスレでC++を事前に勉強しておかないと、VC++を覚えるのは困難 だと言っている人がいましたが本当なのでしょうか? できれば、Cから一気にVC++に飛びたいのですが……
>>739 言ってる意味ぜんぜん分からないから。
VC++はCやC++の延長上にあるものじゃないから。
雪と雪見大福くらい違うから。
740に突っ込みたいけどそれ以前にスレ違いだボケ
>>739
>>740 VC++はCやC++の開発環境なんですけど・・・
>>742 VC++覚えるのにCの知識もC++の知識も要らないでしょ。
VC++でCやC++の開発したければそれぞれの言語の知識が必要だけど。
みんないじめてるな
>>739 Windows のアプリが作りたいのに C++ をわざわざ他のプラットフォーム
で勉強してもしょうがないよ。
まあ、C の知識のみ API の知識なしで、 MFC 使って C++ のプログラム
を覚えるのはちと荷が重いけどね。
VC++ でアプリ開発するには
C言語 + API
C++言語 + MFC (+ API)
C++言語 + ATL+ API
等、選択肢はいくつもある。
段階的に覚えていけばよいよ。
>>743 君のいう「VC++を覚える」とは、エディタの使い方かよ。 (プ
748 :
デフォルトの名無しさん :04/11/19 10:56:39
Serviceと、そのServiceから起動されるExeを作ってます。 Serviceから現在ログインしているユーザでExeを起動すると パスワード有りの場合は何も問題なく実行出来るのですが、 パスワード無しの場合LogonUser関数で失敗(ErrCode:1327)します。 原因を追いかけていくと ローカルセキュリティの設定 → セキュリティオプション内の 『アカウント:ローカルアカウントの空パスワードの使用を制限する』 の設定で挙動が変化すると判ったので Exeを起動している間だけここの設定を『有効→無効』にしたいと思っています。 ここの設定を変更する方法(APIとか)を教えてください。
でも、プログラミングを教えるようなサイトでも、VCを言語として表現してる所があったり… MFCの意味で使ってるっぽい
とりあえず、MFCはバージョンアップも止まりドトネト対応しないから、M$が収束させる方向なんだが。
>>749 確かにね。仕事で引き合い貰って客先の案件要求見ると、言語の欄に.NET、VB、VC、C/C++、JAVAなんて書いてあったりするからね。
#VBって書いてあってExcelVBAだったりJAVAって書いてあってDeveloper2000なんか出てきた日にゃぁ…
MFCだとActiveXベースになってニッチもサッチもいかなくなるからやめるべし。
VCは開発言語でいいんじゃないか? Cだってライブラリも言語のうちだし、 C++のクラス、テンプレートも言語のうちだろ あとVisualStudioの開発ツール使わないでコーディングする場合もあるから 開発環境とは直接関係ないし
もう面倒くさいから"特技パソコン"でいいよ。
756 :
デフォルトの名無しさん :04/11/19 13:25:11
>>751 仕事や人事にでてくるそーゆー用語は
言語かどうかでは選んでないだろ
757 :
デフォルトの名無しさん :04/11/19 13:32:49
すいません。質問です。 Platform SDKとNET Framework SDKをインストールして #include<windows.h>が使えるようになるんでしょうか??
環境に関係なくwindows.h持ってれば使えるだろ
windows.h持っててもコンパイルできるコンパイラがないと使い物にならないけどね。 VC++互換の言語拡張されてるやつ。
>>756 「言語」って書いてあるから>751のように書いたんだが。
ヘッダはPlatform SDKのほうに入ってる
>>758 >>759 レス、dクスです。
コンパイラはbccの無料のやつを使ってるんですが。互換言語のところに、VC++と確か書いてありました。
今ボーランドのファイルを調べてみたら<windows.h>、ありやしたYO-!
とりあえずPlatform SDKのcoreSDKとやらを落としてみます
ありがとうございました。また来ます。
766 :
デフォルトの名無しさん :04/11/19 16:15:34
「プリプロセッサの定義」のところで, _UNICODE を設定したとき, Unicode にもいろいろありますが, どのコードが使われるのでしょうか?
UTF-16
UCS-2じゃねの
UniscribeとかはWin9xでもUTF-16受け付けるけど データ型が違うわけじゃないから(全部WCHAR)
>>767 正確にはUTF-16からサロゲートペアを取り除いた物、だったはず。
それをUCS-2っていうんじゃないのか?
Win2k以降ならサロゲートにも対応してるしWin9xでも
>>769
あ、漏れの環境で試した限りではWin95だけは どうあがいてもサロゲート文字が出せなかった
文字集合と転送形式は違うだろ
774 :
デフォルトの名無しさん :04/11/19 23:31:37
質問です。 WS_EX_TOOLWINDOWを使って作ったウィンドウを 子ウィンドウとして、出しているのですが、 Xボタンを押すとウィンドウを隠すのではなくて 完全に消去されてしまっていてShowWindow(hwnd,SW_SHOW)で また表示することができません。 Xボタンの処理内容を変更するにはどうしたらよいでしょうか?
>>774 WM_CLOSE
で ShowWindow(hwnd, SW_HIDE) でウィンドウ消して
DefWindowProc を呼び出さない。
776 :
デフォルトの名無しさん :04/11/20 00:34:09
>>775 そーやってんだけどなぁ・・・ああ?ん?へ?
って、ソースが汚すぎてインデントが腐ってて
よくみるとbreakで抜けていましたw
ごめいわくおかけしました。逝ってきまつ。
レスありがとうございました。おかげで解決しました。
777 :
デフォルトの名無しさん :04/11/20 13:21:55
Cで、リソーススクリプトやMFCを使わずに、 ツールバーを使う方法がありましたら教えてください。 ボタンやメニューなどは分かったのですが、ツールバーは見つかりませんでした。
778 :
デフォルトの名無しさん :04/11/20 13:41:20
>>773 質問がそもそも曖昧だし
UCS-2は転送形式をも含んだ意味で使われる場合もあるし
>>780 自作ライブラリから適当に抜き出した
構造体名とかから、ググれば解説ページも出ると思う
TBBUTTON *tbButton
TBADDBITMAP tb;
hWnd=GetParent(hwToolbar);
tb.hInst=(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
tb.nID=IDD_BMP_BBOARD;
iIndex=SendMessage(hwToolbar,TB_ADDBITMAP,1,(LPARAM)&tb);
tbButton[1].iBitmap=iIndex;
SendMessage(hwToolbar,TB_ADDBUTTONS,1,(LPARAM)&tbButton[1]);
マルチメディアタイマー(timeSetEventなど)を使ってプログラムを組んでいるのですが、 処理が軽い時は一定のタイミングでコールバックが来るので良いのですが、 重くなった時は呼び出し回数が減り、その後に大量にコールバック関数が呼ばれます 重くなった時は回数が減っても良いのですが、軽くなった時に元通りのタイミングに戻って欲しい場合はどうすれば良いですか? timeGetTime辺りで呼び出し間隔を記録して、 ・前回からの呼び出し間隔が設定値よりかなり短い時は、丁度良い感覚のもの以外はすぐにreturnする というだけの処理で良いのでしょうか? 重い状態が長続きした場合に、バッファがたまってオーバーフローを起こしたりしないのでしょうか?
784 :
デフォルトの名無しさん :04/11/20 14:19:12
>>780 え?
猫さんの63章は使って無いんじゃない?
リソーススクリプトはビットマップを読んでるだけでしょ。
>>783 それって単純にやっちゃ駄目なんじゃない?
つまり、重くなったときは処理が間に合わなくてメッセージだけ
蓄積されてて軽くなったら一気に処理しちゃってるってことでしょ?
こういうの解決するのってメッセージの送信側と受信側で
メッセージの蓄積状態を管理しなきゃ駄目なんじゃない?
よう知らんけどw
>>785 マルチメディアタイマーはWindowsが管理してるんで、送信側の管理が良く分からんのですよ
今実験してたら、しばらく負荷かけてたら、プログラムが落ちた…そのままでは問題みたいです
マルチメディアタイマーでは無理な場合は、自作タイマーで行くしか無いかな…
>>784 ホントですか?
結構いろんな所を調べていて、リソースとか、.rcとか見つけると、
またかと思い他のページに行くとかしていました。差し替えてやってみます。
>>784 できました。後は
>>781 さんのも参考にして理解を深めたいと思います。
お答えくださった方、ありがとうございました。
こんばんわ 今Windows内で開いてあるウィンドウのハンドルを全て得たいのですが、 どのAPIを使えばいいのでしょうか? 教えていただけると助かります。
>>734-735 ありがとうございます。
色の値をへこへこ書く方法に挑戦しているのですが、
COLORREF rgb;に色の値が入っていて、
LPBYTE lpPixel;がピクセルビットの先頭を指しているという場合、
ここからどうすればいいのでしょうか。カラービットは24です。
>>790 ご返答ありがとうございました。
あと、一点ほど質問があるのですが、
人様のウィンドウハンドルを取得したとします。
そのウィンドウ(ハンドル)にイベントを送信できるのでしょうか?
たとえば、メモ帳が開いてあるとして、
そのメモ帳に自分が作ったアプリケーションからイベント(文字入力や改行など)を送ることができるのでしょうか?
もしできるとするなら、どのAPIを使えばいいのでしょうか?
再度の質問になりますが、ご返答いただけたらとても助かります。
申し訳ございませんが、よろしくお願いいたします。
>>792 できる。
イベントを送るにはPost/SendMessageを使う。
戻り値を知る必要のあるときと引数にポインタを渡すときにはSendMessage()。
どちらにも当てはまらないときにはPostMessage()。迷ったらSendMessage()。
ちなみにメモ帳はメモ帳自身のウィンドウにエディトボックスが子ウィンドウとして張り付いていることに注意。
ただし、文字列の送信は非常に面倒くさい。
質問です MessageBox()のオーナーウィンドウのハンドルをNULLにした場合で プロシージャからMessageBox()を呼び出し、無視してオーナーウィンドウを操作して終了させた場合 MessageBox()を呼び出しているプロシージャが終了しないまま 実行ファイルが終了することになると思うんですが プロシージャが終了していない=WinMain()のメッセージループに制御が戻っていない にもかかわらず どうやってプロシージャが終了のメッセージを受け取り、実行ファイルが終了しているんでしょうか
>>792 便利なAPIがあるぞ。
GetWindowThreadProcessId
GetGUIThreadInfo
これで得たフォーカスを持ったウィンドウに
SendMessageを送る。
>>795 MessageBoxの中でメッセージループが回ってるから
そいつが終了イベントを拾ってウィンドウプロシージャが呼ばれる。
MessageBox 内部のメッセージループは WM_QUIT がポストされると、 処理を終了するけど、もう一度アプリに WM_QUIT を送りなおしてたか キューから取り除かなかったかしてたと思う。 その挙動を利用して MessageBox を自動的に閉じるテクニックがあったような。 で、MessageBox 関数から戻ってきた時にプログラムがどこまで解体されているかが 問題だね。WM_QUIT まで処理は進んでるんで、MessageBox 関数後の 処理でクラッシュするかもしれない。運良く本来のメッセージループまで もどれたら、アプリは正常終了できるんじゃないかな。
自己解決しました。
>>797 >>798 THX
結局MessageBoxってWinMainのような
ウィンドウを生成してメッセージボックスをもつ仕様なんですね
EnumWindowsでウィンドウハンドルを取得すると、 タスクバーに無い(見えない)ウィンドウらしきものも取得されるみたいですね。 デスクトップには実際に3つしかウィンドウを開いていないのですが、 100個ちかくのウィンドウが取得されます。 タスクバーにあるウィンドウ(アプリケーション含め)だけを取得したい場合はどうすればいいのでしょうか?
// EnumWindows()ではIME等、不可視のウィンドウも全て列挙されるので //ふるいにかける必要がある if( ( IsWindowVisible( hWnd ) ) && // 可視状態か ( GetWindow( hWnd, GW_OWNER ) == NULL ) && // トップレベルウィンドウか ( lstrlen( szWindowName ) > 0 ) && // キャプションを持っているか ( lstrcmp( szClassName, "Progman" ) != 0 )) // シェルでないか {
803 :
デフォルトの名無しさん :04/11/20 20:07:30
>802 お前・・・それ試したか?
805 :
デフォルトの名無しさん :04/11/20 20:10:58
猫サンネコネコネコミミモード♥
806 :
デフォルトの名無しさん :04/11/20 20:36:32
>804 つまりお前の思い込みで書いたってことね。 納得。
>>801 ITaskBar とかっていうインターフェイスなかったっけ?
IInternetProtocol を実装して、独自の情報をIEコンポーネントに表示することは出来るのですが。 URLOpenBlockingStream / URLDownloadToFile / ATL::CBindStatusCallback::Download など、データを取得する関数がことごとく失敗します。 (URLDownloadToFile にいたっては失敗したくせに成功コードを返してきます) それぞれ 結果の Stream が NULL / ファイルが作成されない / OnDataAvailable が呼ばれない という症状が出ています。 IEコンポーネントでは表示できるし、 実際にプロトコルハンドラの方にリクエストが来ていることは確認しました。 http などの定義済みプロトコルではこれらの取得関数は成功します。 どなたか成功したことのある方がいらっしゃったらお知恵をお貸しください。
>>793 ご返答ありがとうございます。
試してみます。
ありがとうございました。
811 :
デフォルトの名無しさん :04/11/21 04:46:28
あるウィンドウに文字を送信したい場合、 SendMessegeの引数をどうすればいいのでしょうか? ウィンドウハンドルは、hWnd 送信したい文字は「a」とするならば、どうなるでしょう? 教えていただきたいのですが、ご存知の方はいますか?
MSDN の WM_CHAR を調べればいいと思う。
>812 質問はそういう意味だったのか。よく分かるな。
>>812 は細木数子
普通は SendMessage(hWnd, WM_HOGE, TEXT('a'), 0); って思うのが関の山
GetWindowText SetWindowText
質問です。 VisualBasic6.0でAPI呼び出す方法を勉強したいのですが 解説されているサイトでお勧めなのを教えてください。
>818 うーん、お前は死んだ方がいいぞ。 自分の書き込みをよく見直してから投稿しろ。
ちょっと調べてわからないんで、安直ですが、教えて。 モニタの色の設定が 256 とか 24 bit color とか調べる API はなんですか。
>821 あんま自信ねーんだけど GetPixelFormat と DescribePixelFormat でどうよ。
今アクティブにしているウィンドウから、別にウィンドウへ切り替えたらときに出るWMメッセージってなんでしたっけ? 忘れてしまいました。 教えてください。すいません。
826 :
デフォルトの名無しさん :04/11/21 12:26:54
>>826 ありがとうございます。
早速三省堂へ行ってきます。
>>819 在り来たりな言葉だが
厨 房 必 死 だ な w
うわ (;´Д`)y-~~ なんか俺と同じニオイがするな
>>824 ,
>>826 ありがとうございます。
MSCN のサンプルに 1<<GetDeviceCaps(hDC, BITSPIXEL) で色数を求めている例が
ありました。24 bit 前提でソフト組んでて違うモニタで一瞬びっくりでした。
>>822 どうもありがとうございました。取り合えず多数意見に従いました。
ご指摘の API も知りませんので、後で、勉強させてもらいます。
830 :
デフォルトの名無しさん :04/11/21 14:21:57
ListViewの選択されているアイテムの選択色を カスタムドローで変えるにはどうすれば良いのでしょうか? CDDS_ITEMPREPAINTで(何故かuItemStateが全てCDIS_CHECKED | CDIS_SELECTED) 選択アイテムとそれ以外を区別する所までは上手くいっているのですが 選択アイテムの時に新しいカラーを指定しても反映されず、元の反転色のままで困っています。
>>827 819では無いが、Googleを使いこなす努力は必要だろ
適切なキーワードを入れれば、精度は上がるし、その努力が足りない事をGoogleの性にするのはどうかと思うぞ
わざわざ本など買わんでも
>>820 の最初のリンク先で十分じゃん。
833 :
デフォルトの名無しさん :04/11/21 14:50:38
自作自演
>823 忘れたんじゃなくて元々知らないんでしょ。 見栄張らなくていいよ。ま、見栄にもなってないけど。
>>831 質問しに来て逆切れするのはそれ以前の問題だろ
837 :
デフォルトの名無しさん :04/11/21 15:26:38
いや 816 は逆ギレもしてねえぞ ごく平静に礼儀をもって話しているつもりがあのとおり 要するに人格障害だ 一番苦しいのは本人てとこで許してやろうぜ(・∀・)ニヤニヤと
SysMsgProcでMSGF_MENUなメッセージを捕まえてあれこれしようと思ったんですが、IEの「お気に入り」とか「スタートメニュー」は「メニュー」じゃないらしくて、メッセージが来ないんですよ(とりあえず、手元のW2K+SP4+IE6ではそうでした)。 こういう偽物(?)をひっくるめたメニュー由来のメッセージを扱う方法はないものでしょうか? メニューも子ウィンドウの一種らしいんで、ウィンドウのハンドルからそれがメニューっぽいかどうか判別できれば良いんじゃないかと思うんですが…
エディットテイストで文字列を設定するのは、SetWindowText( HWND hwnd, LPCSTR lpString)ですが、 今エディットテキスト内にあるテキストの指定した部分に文字列を挿入したい場合は、どのAPIをつかえばいいのでしょうか。 申し訳ございませんが教えていただきたいです。
>840 GETしてSET
842 :
デフォルトの名無しさん :04/11/21 19:30:13
>844 まだ誰も答えてなかったんだ。 GetPageMemSize でしょ。
>>845 そんな API あるんですかい?
GetProcessMemoryInfo じゃないのか?
NT系限定だけど。
あと、VirtualQueryEx でもできたような気がする。 こちらは 9x系でも使える。
>>826 本購入しました。少し難しいですけど頑張って勉強することにします。
どうもありがとうございました。
>>838 少々誤解されているので一応補足します。
>Googleは精度悪い、ちゃんとサイト出せ
これは全く的外れです。
Googleは精度悪いなど言ってません。
>>818 で述べたように「文章で検索するのは精度落ちるから
「キーワードで検索するほうがよい」といった意味で教示したまです。
リンク先を読めば理解できると思うのですが。
私が希望したサイトの情報の回答がこの時点で得られてないので引き続き回答を
受け付けていると言ったまでです。
本当に意図が理解できなかったのか、それとも揚げ足を取りたかったのかどちらでしょう?
いずれにしても非常識極まりないですし、こちらとしても不愉快です。
長い間このスレにいますが、少々良識ない人間が最近入り込んでいて残念に思います。
もう一つ補足。
「文章で検索するのは精度落ちる」というのは
>>817 に対するレスです。
「VisualBasic6.0でAPI呼び出す」という文章で検索してるので
キーワード絞って検索したほうがいいといった意味で
参考までに
>>818 のリンクを貼りました。
>>817 が少しでも正しくgoogleを使えるようになるといいと思います。
>849 やっぱ死んだ方がいいよ、君は。 同じ失敗をまた犯している。もう救いようがないな。
>>850 死ななくて良いけど、ネットはしない方が良いな
人付き合いも問題がありそうだから、プログラミングよりそっちの勉強をした方が良い
最近は職業訓練所とか行けばやってくれるのか?
まぁ
>>816 の意図はどうあれ大抵の人は
「またカキコしてるようぜぇな」とレスを読んでません
バカって API 呼び出すのもいちいち本買わなきゃならんのか。 大変ですな。
854 :
デフォルトの名無しさん :04/11/21 22:04:15
全くもって残念極まりないです
ム板をリファレンス代わりにするのが天才。
856 :
デフォルトの名無しさん :04/11/22 01:22:02
調査方法の基本を知らんDQNがカメレオン現象でわめくから・・・
857 :
デフォルトの名無しさん :04/11/22 09:10:27
カメレオン現象ってなんだろ?Googleさんも15件しか知らない言葉だ
>858 つか、相手にするな。
861 :
デフォルトの名無しさん :04/11/22 16:09:47
MFCを使用せずに、リッチエディットコントロールを使った簡単なテキストエディタを作成しています。 文中に特定のワードが現れたときに、その部分だけ色を変えたいのですが、うまくいきません。 普通に入力していき、特定ワードが完成した瞬間にその部分の色が変わり、 逆に一文字削除したらその瞬間に元の色に戻るようにしたいのです。 特定ワードをハイライトする部分は完成したので、 「テキストファイルを読み込んだ直後、一度だけ色付けする」 というようなことなら出来ていますが、リアルタイムに変更させることができません。 具体的には、 1)メインウィンドウの中にリッチエディットコントロールを貼り付ける 2)ウィンドウメッセージを監視して、WM_KEYDOWNの瞬間にリハイライトルーチンを呼ぶ ということを行っていますが、 リッチエディットウィンドウ内で一度マウスをクリックして、カーソルが「I」の形に変化した状態になると、 いくら文字を入力してもWM_KEYDOWNを検知することができません。 C/C++は15年くらい経験があるのですが、Windowsプログラミングは全くの初心者なので、 根本的に違っていたらご指摘ください。
>>861 リッチエディトコントロールの中で起こる事はリッチエディトコントロールのウィンドウプロシージャが処理するから、
親ウィンドウではいくら待ってもWM_KEYDOWNは来ない。
代わりにWM_COMMANDでEN_CHANGE通知メッセージが来るのをを待てば良いんじゃないかな。
そしてEN_CHANGEが来るようにするにはリッチエディトコントロールへEM_SETEVENTMASKメッセージを送る必要がある。
>862 ありがとうございます。
#define UNICODE #define _UNICODE ではなにが違うのでしょうか?
ヘッダからのコピペ #ifdef _UNICODE #ifndef UNICODE #define UNICODE // UNICODE is used by Windows headers #endif #endif #ifdef UNICODE #ifndef _UNICODE #define _UNICODE // _UNICODE is used by C-runtime/MFC headers #endif #endif
>>865 UNICODEはWindows.h以下でAPIやTEXT/__TEXTマクロ、TCHARなどの切替。
_UNICODEはTChar.hでCライブラリ関数や_tmain/_tWinMain、_TEXT/_Tマクロ、_TCHARなどの切替。
>>866-867 レスありがとうございます。
CライブラリやMFCを使っている場合は_UNICODEもしろって感じですかね(自信なしです
常に両方指定してても問題無いですよね?
>870 全部聞くなよ。最近この手の新人多いんだよなー 全ての判断を人に委ねる奴。 ひどい評価付けてやってるけどね。
>>870 は私じゃありません
_UNICODEでコンパイルしてみたら「wsprintf・lstrlen・DrawText」が通らなかったので調べてました
とりあえず私は両方使います orz
>>872 単に渡してる文字列がcharになってるだけだな。
間違いない。
>873 うーん、それはありうりますなぁ
ありうりそがりいまそがり
>875 アホ
s/う/を/
>877-878 くだらん
「はべり」を指摘してないので全員アホ
>880 アホじゃないけど存在不要
ここはひどいインターネッツですね
>882 アホ
そろそろこのスレも閉鎖かな?
>884 そうだな。どうせろくな回答もないし。
じゃあスレ住民の総意で次スレは無しということで。
>886 いいとも >887 ごもっとも
889 :
デフォルトの名無しさん :04/11/23 13:32:59
890 :
デフォルトの名無しさん :04/11/23 13:56:04
質問です。 switch(msg) case WM_COMMAND: //処理(ボタンとかメニューとかを処理) return 0; case WM_NOTIFY: //処理(リストビューとかの処理) return 0; } ってやってたんですけど。 これってやっぱりreturnしちゃまずいですかね? HIWORD(wp)とかLOWORD(wp)とかある場合だと自分が処理する以外の 他のメッセージとかDefWindowProcにいかないので処理されないですかね?
…
>>890 それ、動かしてみたか?
まともに動くわけ無いだろ。
>892 この手の質問する奴ってまともに動いてるかどうかの 判断もできてないから問題ないんじゃない?
素直にダイアログボックス作って貼れ
897 :
デフォルトの名無しさん :04/11/23 16:37:22
>>892 実際はDefWindowProcが一番下にあって
switch文のWM_COMMANDの中身は
switch(HIWORD(wp)とか判断してBN_CLICKとか
switch(LOWORD(wp)とかIDC_XXXとかあるわけですよ。
んで、実際に動いてます。
いまのところなんの支障もありません。
また、return 0で返してしまおうが、breakでぬけて
DefWindowProcに渡そうが動作はまったく変わりません。
WM_COMMAND に関してはシステムは何もしないから、 return で帰ろうと、DefWindowProc に渡しても違いは無いよ。
switch文の勉強しような
返却値はメッセージによって違う 同じメッセージでもSDIかMDIかによって変わる ヘルプ読む
901 :
デフォルトの名無しさん :04/11/23 17:01:19
>>898 ,900
そうなんですか。
いまのところSDIのアプリしか作ったことがないので
その辺気にしたことがありませんでした。
ありがとうございます。
902 :
デフォルトの名無しさん :04/11/23 20:06:02
WINE って Win32 API を独自に実装しているのでしょうか? それとも Windows のシステム DLL を逆アセして、 C 言語で書き直しているんでしょうか?
>902 アホ
こんばんわ Winsockでヤフーのサーバwww.yahoo.co.jpへGET送信したんですけど、 返答してきたデータが文字化けをしてるんですね。 これってなぜこうなるのかご存知でしょうか? HTTP/1.1 200 OK Date: Tue, 23 Nov 2004 11:29:45 GMT Cache-Control: private (一部省略) Content-Type: text/html;charset=euc-jp Content-Encoding: gzip domain=.yahoo.co.jp 25aa ・ミソノ・1」X�ル^+<-箕tウ葎クmxョ・rヲ・ロ厩ロ]鑒/lレ哩・@ュrq &Y1i ー諢ュ3ャヘT=JS^x07ヘU ・4#2d!フh暮ォR)9「。リリ&ォ帥Rエャ 1ocW^?e+{・ィ3H験4y・ハラェTa・8蘇3・dA慢埒8&イ_・A ・リ v咽「ェjゥ0オ<フク=E{BC}Gナヲ�ゥ-マHュ・K)9)%g・゚ヤエョコタE「 ゚Fタt・S・・エサΜ怯設オ(t�綉・ =gV」ソbレXPGqヒ�!イ啓~カ・qW'Nコ+ケ~%p&恩・・
> Content-Type: text/html;charset=euc-jp > Content-Encoding: gzip これ見た?
>904 すげーな。わかんないところは適当に読み飛ばしか。
>>904 Content-Type: text/html;charset=Shift_JIS
をつけてGETすれば、おk
>>904 GET送信する際、恐らくAccept-Encoding: gzipと入れてるのでしょうか?
Accept-Encodingは圧縮されて受信しますので、そのような文字化けされた形になります。
Accept-Encodingを削除してGET送信してみてください。
プレーンのテキストで受信されますよ。
910 :
デフォルトの名無しさん :04/11/23 21:18:42
>>910 たぶん(最悪でも建前上は)前者じゃないと駄目だろ。
>>911 でも、相互運用のための逆アセは合法だって聞いたよ。
>912 誰に?
米国の話。 実際にそれをやった企業があるらしいし、 裁判になって勝った例もあるらしいよ。
>915 サンクス
ヽ、 `;、 .; 丿 ノ ` 、_,{ `‐、_ ,* ,、' ~`y' ) r' ~`'rr-、、,,,_ ,ノ"§ _,、< ,;;ゝ `~`i' ,'r´:::::::::`;丶、 ,_ _,,、-'´,ノ ,ノ ,、 ‐'"`, ';‐'" ,' ,','::::::::::::::,' ````` `"´ `"´~`''''''''''T´::::::::::::::',', | i ,','::::::::::::::,' ( ) (ブリブリッ',::::::::::::::::::ii :! ,r'" ,','::::::::::::: ,' ).∧ ) ',::::::::::::::::::!! i、 r''"' ノノ:::::::::::: ,' (:::::::::) ',::::::::::::::::',', i!ヽ {____,、-'/:::::::::::::;;' ポルポト (:::::::::::::::) ',:::::::::::::::::ヾ、__)
そんなお金があればうれしいのですが・・・・
>>918 それ買ってみたけど損したよ
関数の解説だけで構造体の解説が載ってないのがリファレンスとして片手落ち。
構造体の解説を読むにはMSDNを開く必要がある… 結局MSDNしか使ってない罠。
コンボボックスで、ボタンを押してアイテムを選ぶのではなく 何かメッセージを送って任意のアイテムを選択させるやり方を教えてください
CB_SETCURSEL
926 :
デフォルトの名無しさん :04/11/24 11:38:28
例えば20秒ごとにプログラムを動かす時に使うような 経過した秒数がわかるようなAPIを教えてください
GetTickCount
でも、起動には SetTimer() を使ってねっ♥
>>927 >>928 レスありがとうございます
GetTickCountとSetTimer()の長所と短所を教えてください
どっちを使った方がいいのか迷ってしまいました
>>929 両方やってみろ
それで分からなかったら、頭悪すぎだからプログラムやめとけ
火を見るより明らか GetTickCount() 無限ループ SetTimer() イヴェントドリヴン
>931 それは>929に対する回答にはなってないですね。
>>929 両者は、使用目的が違うので比較するようなものではないです。
ループで GetTickCount() の値の変化を待つのは
CPU時間の浪費につながるので、あまり望ましくないのです。
>934 いいえ
すべてはわたしがつくったモノなのです
マルチメディアタイマー
TextOut (hdc, (22 * cxCaps) + (40 * cxChar), cyChar * i, szBuffer, wsprintf (szBuffer, TEXT ("%5d"),GetSystemMetrics (sysmetrics[i].iIndex))); というコードがあったのですが%5dってどういう言う意味なんでしょうか。 %dとの違いがよくわからず困ってます。
APIの説明の width のところを読め
5桁
すいません。訂正します。 APIの説明の width のところを読んでください。
騙るな、この野郎 訂正なんかしねえぞ
荒れ気味なのでほかで聞きます。
俺は無視かよ
当然無視
すいません。今精神が不安定で通院中なんです。 本当にすいません。病気なので許してください。
フォルダ選択ダイアログの出し方を教えてください。 開発環境はC言語、ボーランドです。
>948 SHBrowseForFolder でググってください。
SHFolderなんとかを使う
>949 それそれ
>>948 VisualC++逆引き大全500の極意
って本がかなりいいよ。
MSDNの100倍役に立つ。
これからは「MSDNの100倍役に立つVisual(以下略
って出してもいいくらい。
最近MSに下記原文まんま(ハゲ抜かしてw)で送ってみた。
おい!MS!てめぇんところにもう何年投資してやってるとオモテンだ!ハゲ!
いつになったらWin32APIが日本語訳されんだよ!ハゲ!
全然進歩してねぇよ。ハゲ!
最近じゃ英語ヘルプも含めて、日に日にWin32APIにヒットしなくなってるのは
どういうことだよ。ハゲ!
日本語訳そっちのけで、新機能なんか追加してんじゃねぇよ!ハゲ!
フィルタの種類ももニーズにあってないんだよ!ハゲ!
センスの悪さがMSDNからにじみ出てんだよ!ハゲ!
まだ、レスが返ってこないよw
>>952 ゲイツ「これだから英語も出来ない極東の小国の民は困る」
>>952 VisualC++逆引き大全500の極意
買ったけど損した。
使えるサンプルコードが少なすぎ。
たとえばSHBrowseForFolder の所なんかサンプルコードないだろ
>>954 でも、ここまで詳しく書いてあれば十分だよ。
俺はその存在をしっただけでもよかった。
逆引き大全、俺も VC++ を始めたての頃に買った。 誤植も多いけど、結構役に立ったよ。初心者にはいいと思う。
957 :
デフォルトの名無しさん :04/11/25 00:52:04
htmlでルビ付きの文字列を作成し、それをVB6で WebBrowserを使用してフォーム上に表示してますが、 WebBrowserは透過が出来ないため、WebBrowserの背景が 長方形型にくっきりと残ってしまいます。 どうしても、枠を消してフォームの背景上にWebBrowserの ルビ付き文字だけを表示させたいのです。 VBでWebBrowserを透過表示させる方法を教えてくらはい
たしかにMSDNは逆引きには向いてないな。 とくにShell/OLE/COM周りは。
>>957 特に簡単な手はないです。get_Documentでドキュメントを手に入れて、
body の style を操作して背景イメージを適切に設定するのが良いと思います。
なぁ? ディレクトリリストボックスってなかったっけ? なんか古いタイプのファイルオープンダイアログにはついてんだけどなw 単体では無いんだなw
LB_DIRのことか?
>>962 おお!それそれ!
なるほどリストボックスだったんか・・・
SHBrowseForFolderとどっちがいいかな?
コンボボックスのオプションで HTMLのOPTGROUPの様なものはありますか?
966 :
デフォルトの名無しさん :04/11/25 15:20:56
コマンドラインやD&Dで渡されたファイル名を全部取り出すには GetCommandLine() の返り値を全部解析するしかないですか? またコンソールプログラムの場合はmain() の argc, argv でいいんですか?
967 :
デフォルトの名無しさん :04/11/25 15:27:58
Win2K、VB6で開発を行なっています。 NetUserGetLocalGroupsを使ってUserの所属するグループを取得しようとしているのですが、 同じUser名でドメインの違うユーザーの区別はどうすれば良いのでしょうか? NetUserEnumでUser名を列挙すると、"UserName"、"VUSR_USERNAME"と区別されているよう なので、返された名前をNetUserGetLocalGroupsに渡してみたのですが"VUSR_USERNAME"の 方で関数が失敗してしまいました。
MSDNに <DomainName>\<UserName> て書いてるけど
>>966 NT系ならCommandLineToArgvWがつかえる。
>>968 ああ、本当だ。吊ってくる..(´・ω・`)ショボーン
グループは取得できました。ありがとうございました。
それと、USR_USRERNAMEは何の関係も無かったです。
971 :
デフォルトの名無しさん :04/11/25 16:20:39
WriteFileにてテキストファイルを上書きするとき、 元々書いてあった文字列より短いものを上書きすると、 前の内容が残っているようです。 ↓こんな感じになります。 ファイルの文字列「あいうえお」 上書きする文字列「OK」 更新後のファイル文字列「OKうえお」 解決法を賜りたいです。
>>972 ありがとうございます。
それを調べてみます。
974 :
デフォルトの名無しさん :04/11/25 17:16:15
Windows XP 64-bit Edition上で32bitアプリから64bitアプリが CreateProcess()で起動可能か検証したことのある方。 できましたでしょうか?
976 :
デフォルトの名無しさん :04/11/25 18:06:05
例えばWindowsの検索を選んで、検索したいファイル名やフォルダを探すため、 エディットボックスのハンドルを得ようとしますよ。 その際、僕はVC++のSpyとか言うのを使って、子ウィンドウとなっているそれが 上から何番目になってるか調べてChildWindow(?)とかいう関数を使ってGW_NEXT で順々にハンドルをとる、面倒で馬鹿な事やってるんですが、 これ以外にいい方法はありませんか? なんかわかりにくいですが、要は一発で 検索のような入り組んだアプリケーションの、エディットボックスのハンドルを得たいんです。 無理でしょうか?
>>976 ウィンドウクラスで検索して、GetDlgCtrlIDでコントロールIDを取得して
目的のものかどうか判断するってのはどうでしょう?
前の方に出ていたOpenProcessToken()とCreateProcessAsUser()を使ってサービスからログオンユーザーの デスクトップでアプリを実行させようと思ったんですが、ログオンユーザーのプロセスハンドルの取得 方法が分かりません。どうやってアカウント名からプロセスハンドルを引っ張ってこればよいですか?
979 :
デフォルトの名無しさん :04/11/25 20:36:03
CreateWindowExでリストボックスを作っているのですが、 コレは・・・高さが文字の高さの整数倍にしかならないみたいなんですけど、 ウィンドウの幅にぴったり合わせるにはどうしたらいいでしょうか? 今はMoveWindowでウィンドウに合わせようとしています。
>>978 LogonUser( "UserName", NULL, "Password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
& hToken );
でトークン作ったほうが簡単。
>>980 その方法だとパスワード引っ張って来るのに、gina.dllに細工するとかちょっと仕掛が必要ですよね?
ちょっち、難易度が高い気がするです。
各アカウントのパスワードをユーザーに開示してもらうっていうのも現実的ではないですし…困り
ました。
winsta0のプロセスと同じアカウントである必要はなしです。 適当な実行権があればCreateProcessAsUserはwinsta0\Default上に起動しますが。 (つかSIDからトークンにするやり方わからん)
だから
>>732 だっつってるのに。
このスレだけで三度目だぞその質問
ああ方法が分からないって言ってるのか。 現在ログオンしてるユーザーでいいんだろ? だったら現在走行中のプロセス列挙してどれでもOpenProcessすればいい どのプロセスもwinlogonが作成したトークンを引き継いでるはずだから (Terminal Serviceや「ユーザーの切り替え」や「別のユーザーとして実行」は 考慮してないが)
ちょっくら次スレたててきますよ。
すまん、立てられなかった。orz ↓代わりによろしく
まかせろ
>>990 それだと権限がLocalSystemのままだから危なくない?
ってリンク先にも書いてるけど
992 :
979 :04/11/26 15:26:50
もう一つ質問です。 リストボックスの文字色を変えるにはどうしたらいいんでしょうか? エディットボックスの場合には、WM_CTLCOLOREDITをつらまえて SetTextColorで変更できたのですが、 リストボックスの場合は、WM_CTLCOLORLISTBOXをつらまえて SetTextColorをやっても変更されません。 フォントの種類は変更できました。 リストボックスの文字色は、部分的にではなく、 全体としての文字色を変えたいです。 検索してオーナードローが出てきたのですが、 オーナドロー時にSetTextColorをやっても変更できませんでした。 よろしくお願いします。
>>992 [SetWindowPos]
∀・)っ[カスタムドロー]
>>992 UIの部分だけVBで作るっていう手もあるけど・・・
995 :
デフォルトの名無しさん :04/11/26 17:15:11
指定したファイルが更新された場合に通知してくれる APIがあったと思うんですが、関数名なんでしたっけ? 誰かご存知の方ご教授願います
FindFirstChangeNotification?
ありがとうございます。
>>993 それで頑張ってみます。
>>994 VBは触ったことがないので分かりません。
ごめんなさい。
リストボックスはカスタムドローできない。 できるのはリストコントロール。
999 :
デフォルトの名無しさん :04/11/26 18:41:35
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。