スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
∧_∧
( ´∀`) < 0x20
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
ニダ
ごんた
無駄無駄無駄ァァァァァ
七面鳥
うっかり八兵衛
九重佑三子のコメットさん
十兵衛@ハレンチ学園
獣医乳首
女子十二楽坊
阪急十三駅
尾道市十四日町
十五少年漂流記
17 :
デフォルトの名無しさん :2005/05/28(土) 21:15:41
RegisterClipboardFormatで、 自分専用のクリップボードフォーマットの番号をOSから頂いたんですが、 この情報はレジストリに登録されるのでしょうか? それとも、一時的なもので、再起動してRegisterClipboardFormatすると 再度割り当てが行われるものなのでしょうか? (極力レジストリは汚したくないもので・・・)
一時的だよ
19 :
17 :2005/05/28(土) 21:28:09
>>18 ありがとうございます。
心置きなく使えます。
> OSから頂いた わろた
21 :
デフォルトの名無しさん :2005/05/28(土) 22:07:32
"C:\\"のプロパティ(Explorerの右クリックと同じもの)を表示するのはどうすればいいですか?
>1Z
>>21 ShellExecuteの2番目の引数をTEXT("properties")にしたらいけるんじゃない?
24 :
デフォルトの名無しさん :2005/05/28(土) 23:06:43
CreateDialogParamでダイアログボックス何個か作って各々WM_MOVEきたら座標を記録して終了時に保存、 起動時に読み込んでMoveWindowで位置を復元してみたところ xyともに+3pixずれてるんですがそういうもんなんでしょうか。
違います
>>24 WM_MOVEはクライアント領域で、
MoveWindowはウィンドウ全体の座標ですよ。
質問失礼します。 キャレットが表示されたら処理を行いたいのですが キャレットが表示された、されない、の識別方法が解りません。 ウィンドウに左右されない キャレットの状態を監視する方法がさっぱりです・・・。 どうすればいいのでしょうか?
28 :
24 :2005/05/29(日) 00:46:01
レスありがとうございました。多謝。
WM_SETFOCUSとか?
>>17 レジストリが気になるなら、れぐもんでも使って変更点調べてみ。
3D関連のAPIは無いのでしょうか? もしくはDCに書き込めるフリーの3Dライブラリ無いでしょうか? ワイヤーフレーム、球、半透明、程度の機能でいいんですが、、、 (独自ウインドウに書き出すようなのはいくつか見つけました)
DirectXはお嫌い?
33 :
31 :2005/05/29(日) 02:08:13
DirectXとOpenGLは無しでお願いします。 あまり大層じゃなくやりたいので、、、
DirectGL作れ
OpenGL = IndirectX
>>31 大層なものじゃなくてもDirectX使ったほうが楽な結果に終わることもあるよ
GDIのみ→GDI+→DirectXと結局作り変えてる俺
ご利用は計画的にorz
つーか、GDI+DIBSectionあたりでガリゴリやるほうがDirectXよりよっぽど大層なことだろ
>>31 MoveToEx();
LineTo();
ウインドウメッセージやスタイルを,0x0201→WM_PAINTといった感じに,数値から文字列に変換する方法を探しています。 FormatMessageの様な便利なAPIは用意されてないのでしょうか?
前スレ1000は、ギャグのつもりでやっちゃたんだろうか
>>39 ないよ
windows.hのWM_〜部分を全部持ってきて
Cならマクロで値と文字列のテーブル作るのが簡単
#defile WM_DEF(msg) {msg, #msg},
struct {
UINT msg;
const char *msg_str;
} msgtbl[] = {
WM_DEF(WM_CREATE)
WM_DEF(WM_DESTROY)
WM_DEF(WM_COMMAND)
:
};
で
struct {
UINT msg;
const char *msg_str;
} msgtbl[] = {
{WM_CREATE, "WM_CREATE"},
{WM_DESTROY, "WM_DESTROY"},
{WM_COMMAND, "WM_COMMAND"},
:
};
というのができる
すいません、質問させてください。 MBCSかどうかをチェックするAPIがあったはずですが、 忘れてしまいました。 今Googleで調べてますが、ご存知な方がいらっしゃいましたら、教えていただけないでしょうか? よろしくお願いいたします。
>>42 IsDBCSLeadByte()
あとCharNext()とCharPrev()もある。
44 :
42 :2005/05/29(日) 13:32:37
>>43 即答いただきまして、ありがとうございます。
助かりました。
キーボードやマウスの操作を無効にしたいと思いBlockInputを使ってみたのですが Windows95などでは使えないみたいなんです。Hookする以外に方法は無いでしょうか?
>>41 ありがとうございます。
Spy++等で表示されてるのを見てひょっとしたらと思ったのですが用意されてないのですね。
てきとーに置換してテーブル作ることにします。
その前の章に解説があるようだが?
おとなしくそのアプリを使えよ。
51 :
49 :2005/05/29(日) 18:29:03
>>50 うーん、自アプリにこの機能を組み込みたいんですよね。
どうかお願いします。
こぴぺっぽい前スレ998だけど、北斗の拳は実写版があるぞ。 たしかハリウッドで。
>>48 ありがとうございます、でも分かりませんでした。
外側のmaxはスクロール後の位置がマイナスにならないように正規化するためのものですよね。
でも、SetScrollInfoはオーバーフローとアンダーフローを自動的に補正してくれます。
また、内側のminでの計算でnPageが考慮されていないのでオーバーし放題です。
( ・ω・)∩先生!質問です! [hoge] hage=100,200,300 という感じで一つのキーに複数の整数パラメータがあるiniファイルで 二つ目以降のパラメータを整数型で取得する方法は無いのでしょうか? GetPrivateProfileIntは試してみたけど一つ目のパラメータしか取れないみたいだし、 GetPrivateProfileStructは文字コードのまま構造体に放り込むだけだし・・・ やっぱりGetPrivateProvileStringで文字列から整数に変換するしか方法はないんでしょうか?
>54 API だけだと無理だと思う。素直に解析しましょう。 あるいは、ini ファイル側の仕様を変えて [hoge] foo1=100 foo2=200 foo3=300 みたいにするか。
MFCなら GetProfileBinary WriteProfileBinary があるんだが
57 :
54 :2005/05/29(日) 20:41:08
>>55 やっぱり無理なんですね(´・ω・`)
作ろうとしているのが他の人が作ったソフトのiniファイルを編集するツールなので
iniファイルの仕様を変えることができないので素直に解析するようにします。
>>56 「へぇ〜そんな関数があるのか」とMSDNライブラリを見てみたけど
MSDNライブラリに載っていなかったのでぐぐったらあっさり見つけました。
これなら希望通りの動作をしそうですね。
今回はMFCを使わないのですが、MFCを使うことがあれば利用したいと思います。
もう一つ質問なんですが、
文字列を整数型に変化するにはatoiなどの標準ライブラリの関数を使うしかないのでしょうか?
初歩的な質問ばかりで申し訳ないですがよろしくお願いします。
>>57 APIでなくてもいいならsscanf()
>>49 Spy++でメッセージを拾うとか、
ApiMonで呼んでいるAPIを見るとか。
そんな面倒なことやってられないからここで聞いているんだろうに、 使えない奴は答えるなよ、ボケ
StrToIntを試してみたら希望通りの動作をしたので今回はStrToIntを使うことにしました。 初心者丸出しの質問に答えてくださった皆さんありがとうございました。 ・・・もっと勉強しなきゃ・・・sscanfも知らなかったし(;´д`)
64 :
デフォルトの名無しさん :2005/05/30(月) 05:18:19
>> 49 www.autohotkey.com オープンソースらしい.
リストビューの横スクロールバーだけ自動で出現しないようにする方法ありませんか?
>>65 カラム幅を制御して横スクロールバーのいらない寸法を維持する。
67 :
siokosho :2005/05/30(月) 09:00:34
素人の質問ですみません。うまく日本語化できないのですがどうしたらよいでしょう? お願いします。
まず日本語を勉強する
>>66 WM_SIZEを乗っ取ってカラム幅とウインドウのクライアント幅を同じにしました。
ウインドウの縦サイズを調整して、縦スクロールバーがない状態からある状態にすると縦&横スクロールバーが出現するので、
カラム幅をクライアント幅に一致するように縮めスクロールしないでも収まるようにしたのですが、
それが横スクロールバーに反映されないので困っています。もう一段階サイズを変更すると消えるのですが・・・。
CloseDriver DRV_CLOSE と同様の機能らしいAPIが二つあるのですが 使い方の違いですか?
標準入出力のストリームをバイナリモードにするAPIを教えてください。
>>71 後から変更することは出来ない。
が、改めてオープンしなおすことは出来る。
CreateFile(TEXT("CON"),
Window Media Playerの設定を変更するアプリケーションが作りたいのですが 経験者の方はおられますか?
おりますよ。何でも聞いてござれ。
Explorerをシェル拡張するのではなく、 リパースポイントを使いたいのですが、 マイクロソフトと何か契約を結んだりしないとダメですか?
質問です。 CreateEventをリモートで実現するにはどうしたらいいでしょう? ソケットとか使わないとダメ?
79 :
74 :2005/05/31(火) 07:15:14
>>75 [ツール]-[オプション]-[ネットワーク]タブにあるチェックボックスを
ON/OFFすることなんてできますか?
メッセージ処理(WM_TIMER)に依存しないウェイトのかけ方を教えてください>w< SetTimerは内部でメッセージ使ってるようなので‥‥
Sleepとか?
昔はリソースの関係でタイマーを大量に作れなかったので Sleepで実装したりもした、と聞く。
Sleepだとスレッドが寝ちゃうから中断できなくてダメなんです>w<
MsgWaitForMultipleObjects
85 :
デフォルトの名無しさん :2005/05/31(火) 14:05:51
タイマスレッド、イベントオブジェクト
空ループ
日本語版Windows2000 VC6にて 入力された文字をStaticで表示させるDLLを 作っている(MFC無し)のですが、英語版NT4(GlobalIME IE4)環境下にて、 日本語が文字化けします。どなたかうまく表示させる方法をご存知ではない でしょうか? 以下はソース抜粋です。 #include <windows.h> #include <stdio.h> #include <tchar.h> void SetTxtMsg(LPCTSTR lpTxtMsg) { LOGFONT lf; memset(&lf, NULL, sizeof(lf)); lf.lfCharSet= SHIFTJIS_CHARSET; lf.lfOutPrecision= OUT_OUTLINE_PRECIS; lf.lfClipPrecision= CLIP_STROKE_PRECIS; lf.lfPitchAndFamily= DEFAULT_PITCH | FF_SWISS; lstrcpy(lf.lfFaceName, TEXT("MS Gothic")); hFont = CreateFontIndirect(&lf); msg_hWnd = CreateWindowEx( NULL, "STATIC", TEXT(lpTxtMsg), WS_CHILD | WS_VISIBLE | SS_CENTER, WNDMSG_X, WNDMSG_Y, WNDMSG_WIDTH, WNDMSG_HEIGHT, hWnd, NULL, hInst, NULL); SendMessage(msg_hWnd, WM_SETFONT, (WPARAM)hFont, TRUE); }
m9(^Д^)プギャーーーッ!
やはwwwwwwwwwwwwwwwwwwうぇwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>80 timeSetEvent() とか SetWaitableTimer() とかは?
タイマーは、呼び出される関数のポインタをNULLにするとメッセージで来るんだけどな 正確なのがほしけりゃマルチメディアタイマー使ったら
92 :
デフォルトの名無しさん :2005/05/31(火) 21:40:11
スレッドとプロセスの違いを教えてください。
それはいい所に気付いたね。
DirectDrawあたりのSetDisplayModeとかそのへんで 適当に解像度を落としてから解像度を戻すと Windowの配置が目茶目茶になるので EnumWindowsとGet/SetWindowPlacementで処理したは良いが、 なぜか最大化しているWindowがタスクバーの下にえぐれてしまうのです。 タスクバーに適当にメッセージでも流せば戻るのかと思ったんですが 試した限りでは駄目でした。 タスクバーのエッジをクリックするとか、何か新しいWindowでも開くと直るのですが 何とかする手立ては無いんでしょうか。 ちなみにWindows2000上でしか試していませんので他の環境では分かりません。
95 :
デフォルトの名無しさん :2005/05/31(火) 22:23:20
質問させて頂きます。 アクセラレータのメッセージが親ウィンドウに来ないで そのときフォーカスのある子ウィンドウに行くようになってしまったのですが 私は何をしてしまったのでしょうか。
ミス。
アクセラレータはTransrateMessageだけど 何か思い当たる事ないか
TranslateAcceleratorじゃなかったっけ
99 :
デフォルトの名無しさん :2005/05/31(火) 23:23:42
イベントログファイル(*.evt)からイベント情報を取得してダンプするためには、 ReadEventLog関数を用いて1つずつレコードの内容をファイル等に書き出して いくしかないのでしょうか? もし書き込み用関数やサンプルソース等がありましたら教えて頂きたいので よろしくお願いします。
>なぜか最大化しているWindowがタスクバーの下にえぐれてしまうのです。 えぐれる?
えぐるように打つべし!
>>95 TranslateAccelerator( HWND hWnd, HACCEL hAccTable, LPMSG lpMsg );
このHWNDに、呼び出すその時のMSG構造体のHWND渡してるとかじゃないか?
103 :
94 :2005/06/01(水) 00:00:42
最大化Windowがタスクバーの下にもぐりこんでいる状態と言えばいいでしょうか。
普通に最大化するとタスクバーを避けるように大きさが決まるのに解像度変更から 復帰したときはなぜかタスクバーを無視して最大化されてしまうってこと?
タスクバーが原点方向(左・上)にあるときの話ならGetWindowPlacement/SetWindowPlacementの仕様上の問題。というか罠。
XPでWindowsキー + [U]を押してユーティリティ マネージャーを開くと、 まずsystemアカウントでutilman.exeが起動して、その子プロセスとして 現在ログオンしているユーザーの権限でutilman.exeが実行されているのですが、 どうやってパスワードなしで現在のユーザーのトークンを得ているのでしょうか?
107 :
94 :2005/06/01(水) 01:27:27
>>104 そんな感じですかね。SetWindowPlacementすると
最大化していたWindowがタスクバーの下に滑り込んでしまいます。
>>105 一応タスクバーはBottomに置いてあります。
今確認したところ左と上の時はいい感じですが、
右と下だとやっぱりタスクバーを無視した感じのサイズになるようです。
>>99 BackupEventLog()じゃダメ?
リモート接続ならリモート先にしか保存できないという素敵な関数さんだけど
情報メッセージとかちゃんと変換して吐き出すなら
1レコード読み込んで吐き出すしかないと思われ
109 :
95 :2005/06/01(水) 03:35:46
>>102 その通りでした。
「猫でも〜」を見て作ったときは
TranslateAccelerator(hWnd, hAccel, &msg)
としていたのですが、VCにひな形を作ってもらうと
TranslateAccelerator(msg.hwnd, hAccelTable, &msg)
このように作るようです。
どうもありがとうございました。
今までWANIPの取得はENVを表示するCGIにアクセスさせて取得させていたのですが WANIPを取得できるような関数ってありますか?
>>110 残念ながらOSが管理してる情報じゃないのでそんなAPIはありません
>>110 DDNSで登録しといて、Winsockでgethostbynameするとか
>>110 UPnPに対応しているルータならUPnPで取れる
114 :
110 :2005/06/01(水) 12:19:53
皆さんレスありがとうございます。検討してみます。 とても参考になりました。
チルトホイールマウスのチルトに反応するにはどうしたらよいのでしょうか?
・spyでなんかメッセージが出てないか見る ・MSでそれっぽいSDKが出てないか探してみる
質問です。 スクリーンセーバーを作りたいのですが、 外部シンボル 'WinMain' が未解決 とエラーがでてしまいます。 ソースは「猫でも〜」のコピペなので間違いはないと思います。 コンパイラはBCCで開発環境はBCCDeveloperです。 原因があるとすればどこでしょうか?
>>117 猫にはscrnsave.libを使うと書いてあるだろうが、これはVC++の本当のライブラリで、BCCには存在しない。
DLLのインポートライブラリではないからimplibで解決できるわけでもない。
>>117 写したから間違いは無いと思うその思考がまず間違い
人間とは間違うはずの無いところで間違うもの
何よりも、間違いが無いならエラーが出るわけがない
エラーが出るということは間違っているということ
>118-119 dクス ( ノД`)゚・。
>121 クスコ
>>108 レスくれてありがとうございます。
BackupEventLog関数でファイルそのものを
バックアップすることはできるのですが、
1レコード読み込んで、そのメッセージ内容を
dllから読み込み変換、ファイルに出力という事を
やろうとしています。
そういう処理は、LoadLibrary、ReadEventLog、FormatMessage等を
駆使してやるしかなさそうですね。
数少ないながらもネット上にサンプルがありまして、
参考にして何とか実装することができました。
Windowsのイベントビューア上で、「ログファイルの名前を付けて保存」と
同じ事をしたいわけですが、どういう実装になってるか予想できますか?
(それ使えばいちいち作らなくてもいいわけですが…)
>>123 プラットフォームSDKにサンプルがあったような希ガス。
質問です。 現在、テキストエディタを制作しているのですが、 保存処理で詰まっています。 CreateWindow()で生成したエディットコントロールから文字数を 取得してmalloc()でその分のバッファを用意します。 そのバッファにエディットコントロールの内容をコピーして、 WriteFile()でファイルに書き込む、という感で作りたいのですが どうすればエディットコントロール文字数を取得できるのか がわかりません。どうすればいいのでしょうか?
エディットコントロールはコントロールの一つ。 コントロールはウィンドウの一種だ。 Windowsは1個のウィンドウに対して一つの名前(文字列)を付けることが出来、 その名前を操作するためのAPIを提供している。 タイトルバーのタイトル文字列はメインウィンドウの名前を表示している。 そして、コントロールはこの名前(文字列)をスタティックコントロールの文字列や エディットコントールの編集しているテキストとして扱っている。
128 :
126 :2005/06/02(木) 03:30:46
>>127 ありがとうございます。
GetWindowText()ってことですよね?
GetWindowText()でバッファに文字列を格納する前に
malloc()でバッファを作りたいのですが・・・
つGetWindowTextLength
130 :
126 :2005/06/02(木) 03:57:33
>>127 >>129 ありがとうございます!解決しました。
こんな関数があったとは知りませんでした。
こんな関数があったとはって、MSDNでGetWIndowTextの次に出てくるんだがなぁ・・・
こういう奴はいつまでたっても無能
無能といえば無能だが、title bar の caption を取るのも GetWindowText() ってのは 最初はとっつきにくい感じはある。空の window で文字列があるのは title bar だけだから text はそこしかないが、多くの window にはあちこちに text が あるように「見えて」そんなことは最初は分りにくい。 dialog には GetDlgItemText() が用意されているが、GetEditControlText() や GetTitleBarText() とかあると直感的には分りやすいと思う。 マクロ定義で済むのにね。
違うだろGetWindowTextLengthを探せないのが無能なんだよ
ISAPIの一覧が見たいのですがどこにあるかわかりますでしょうか?
16x16のビットマップをアイコンとして使用したいのですが hIcon = LoadImage(hInst, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); としてロードしたものを ImageList_AddIcon(hIList, hIcon) として利用可能でしょうか?
Altキーを押したり、マウスカーソルを一番上に持っていった時だけメニューが出るようにするAPIはどれ?
無い
ビットマップを横に並べて表示させたいのですが、 何も表示されません case WM_PAINT: hdc = BeginPaint(hWnd , &ps); for(i = 0;i > 256;i+=64) { BitBlt(hdc , i , 0 , 64 , 64 , hMem2 , 0 , 0 , SRCCOPY); BitBlt(hdc , i , 0 , 64 , 64 , hMem1 , 0 , 0 , SRCCOPY); } EndPaint(hWnd , &ps); break; 原因を教えてください。お願いします。
ループが1回も回らないから。
>>133 それはWindowsのWindowの構造が理解できてないからだ
>>137 LoadImageでIMAGE_BITMAPで何が返って来ると思う?
てか似たような質問前スレにもあったぞ
>>140 まずhMem1とhMem2の出所を教えてくれ
143 :
140 :2005/06/02(木) 21:18:55
HDC hdc; static HDC hMem1 , hMem2;//メモリデバイスコンテキスト PAINTSTRUCT ps; HBITMAP hBmp; int i; case WM_CREATE: hdc = GetDC(hWnd); hBmp = LoadBitmap( ((LPCREATESTRUCT)lp)->hInstance , TEXT("BASE") ); hMem1 = CreateCompatibleDC(hdc); SelectObject(hMem1 , hBmp); DeleteObject(hBmp); hBmp = LoadBitmap( ((LPCREATESTRUCT)lp)->hInstance , TEXT("BASE_M") ); hMem2 = CreateCompatibleDC(hdc); SelectObject(hMem2 , hBmp); DeleteObject(hBmp); ReleaseDC(hWnd , hdc); break; 小出しスマソ。 マスク画像を表示するプログラムにしようと思ってます。
144 :
141 :2005/06/02(木) 21:26:30
俺は無視かい
145 :
137 :2005/06/02(木) 21:26:48
>>142 すんません、過去ログみれないんです;;
>144 スマソ。よく分かりません。。。
147 :
141 :2005/06/02(木) 21:35:28
for(i = 0;i > 256;i+=64) ~~~~~~~
>>137 最初のインスタンスハンドルはリソースを読み込むときに使うものだから、
LR_LOADFROMFILEを指定するときにはNULLで良い。
>147 神様ありがとう。馬鹿だ漏れ。。。
DeleteObject(hBmp); もつっこんどいてやったほうが親切?
151 :
137 :2005/06/02(木) 21:58:46
>>148 NULLですね・・すんません;;
で、やはり .bmpを読み込んで
ImageList_AddIconに渡しても-1が戻ってだめぽ、なんで
何らかの解決方法ってないですかね・・
bmpを読み込んで動的にiconに変換させるとか
そのままiconとして扱えるとか、お手軽なAPIとか手法はないものでしょうか?
おとなしくiconファイルに変換したものを渡した方が無難でしょうか・・・?
CreateIconIndirect
HDCをstaticにするのも感心しないが・・・
NTFSに複数同時にログを書き込むと高確率でフラグメントが発生してしまうんですが 最終的に書き込むサイズが(だいたい)わかっている場合ヒントを与えるような仕組みってないですか?
ファイルマッピングでやったら確実かもね
>>154 SetFilePointer
SetEndOfFile
157 :
149 :2005/06/03(金) 06:56:48
>150 ごめん、気になるから教えて神様。 >153 グローバルにすればいいですか?
>>157 必要な時に宣言するという思考は無いのか?
>>157 case の中でも、{ } でくくればブロックの先頭で変数の宣言できるよ
そもそも複数の処理を記述するのに{}でブロックを作らないVCの雛型がおかしい
そんな雛型に頼るのがおかしい。
162 :
デフォルトの名無しさん :2005/06/03(金) 10:07:15
Windows 2000 で USBメモリ等のリムーヴァブルメディアの とりはずし操作 # 物理的なとりはずしではなく, # 前もってOS上でやる「安全なとりはずし」 が行われたらそれを検知したいのですが, 方法はありますか?
>>162 WM_DEVICECHANGEはどう?
164 :
162 :2005/06/03(金) 10:54:46
>>163 いまドキュメントを読んでも
要領をえないんですが,
WM_DEVICECHANGE
が実際にメディアを抜いたときにくる
メッセージなんですか?
OS の「ハードウェアの取り出し」操作を
キャッチしたいのですが,
このメッセージでできるんでしょうか?
質問する前に試せ
166 :
163 :2005/06/03(金) 11:25:38
>>164 『OS のハードウェアの取り出し操作をキャッチ』というのは
ハードウェアの取り外しダイアログで[停止]ボタンを押したときのことか?
今試したらWM_DEVICECHANGEが来たぞ。
何かLPARAMに値がセットされてたが、それは面倒なので調べてないが。
(調査にはWin2000&WTLを使用)
167 :
164 :2005/06/03(金) 12:31:29
>>166 > ハードウェアの取り外しダイアログで[停止]ボタンを押したときのことか?
まさにそれです
> 今試したらWM_DEVICECHANGEが来たぞ。
ならばいけそうです
168 :
デフォルトの名無しさん :2005/06/03(金) 12:54:48
実際の経過時間を知りたいのですが。 time()やGetSystemTime()などでは時刻の設定をされたり「Windows Time サービス」がSetSystemTimeAdjustment()をしていたりするので、正しい 経過時間が不明です。ハード的な誤差はあってもよいがソフト的な設定 による影響を避けたい。
GetTickCount
170 :
149 :2005/06/03(金) 13:45:23
>159-160 亀レスですが、よく分かりません。 詳細キボンです。
>>170 こういうことかと思われ
×な例
case WM_PAINT:
int a;
○な例
case WM_PAINT:
{
int a;
}
>>170 PAINTSTRUCT ps; が戦先頭にあったもんでね。
WM_PAINTでしか使わないようなこういうのは、
case WM_PAINT:
{
PAINTSTRUCT ps;
・
・
break;
}
とかね
>171 な〜る。dクス
174 :
149 :2005/06/03(金) 15:02:13
>172
d
しかし
>>150 の言いたいことがよく分かりません。
誰かつっこんでくれる方いませんか?
>>174 hDCにSELECT中のhBmpをDeleteObjectしてどーすんの
176 :
デフォルトの名無しさん :2005/06/03(金) 15:31:41
>169 望みどおりのことができました。ありがとうございます。
177 :
164 :2005/06/03(金) 15:54:25
WM_DEVICECHANGE このメッセージなんですが > ハードウェアの取り外しダイアログで[停止]ボタンを押したときのことか? のときにたしかにくるんですが, 当然,USBメモリをさしたときとか CD をぬきさししたときにもきます. このメッセージがきたときに > ハードウェアの取り外しダイアログで[停止]ボタンを押したときのことか? かどうかを判定し,どのドライヴ文字にわりあてられていた 記憶装置かを知ることはできますか?
>>177 PlaformSDK or MSDN LibraryのWM_DEVICECHANGEの説明嫁
179 :
149 :2005/06/03(金) 16:29:04
>175 dです。 つまり二番目のビットマップをロードする前に Deleteする必要ないってことですか?
>>179 おそらくそのDeleteObject失敗してるよ。
戻り値調べてごらん。
DeleteObjectするときは、hDCを使わなくなったときに
別のhBmpをSelectしたときに返ってくるhBmpを使うか
しないとね。
hDCにSelectされた状態でDeleteするなって書いてなかったか?
181 :
180 :2005/06/03(金) 16:53:12
何か日本語変だけど、めんどくさいので察してくれたまい
>>179 とりあえずおまいはMSDNをよーく読め
183 :
180 :2005/06/03(金) 17:09:39
実際にやってみたらDeleteObjectはTRUEを返して かつ表示はできてたな、、、、 まあやっちゃいけないことではあるが
184 :
149 :2005/06/03(金) 17:18:27
>180 色々とdクス。 何となく理解できますた希ガス。
185 :
デフォルトの名無しさん :2005/06/03(金) 19:52:24
すべての Windows API の関数プロトタイプを プログラムから操作したいのですが、 API の宣言を、C 言語のヘッダーではなくて、 XML などの扱いやすい形式で入手することはできないでしょうか?
フォルダ内のアイコンの表示位置を取得・設定することってできますか?
>>185 既に出来上がってる関数の宣言を弄って何をしようと言うのだ・・・
190 :
デフォルトの名無しさん :2005/06/03(金) 20:17:45
>>189 とある言語で、Win32 API を使いたくて、
すべての宣言をコンバートしたい。
昔のSDKはCSVで関数名とライブラリ名が 入ったファイルがついてたけど今は無いのかな
関数名だけならBccのimpdefとかで取り出せばいいじゃないか。
>>192 もちろん、プロトタイプが必要だよ。
構造体のサイズとかアラインメントとかも。
とある言語ってなんだ?
すいません、メインウィンドウのみで子ウィンドウを一つも 持たないアプリケーションがあってそのアプリケーション上で ふつうにキー入力をする分には認識しますがプログラムで メインウィンドウにWM_CHARを送っても認識していません。 恐らくそのアプリケーションでそういったことを対策してると思うのですが どういったトリックを使ってるのでしょうか?教えてくださいお願いします
ハァ? WM_CHAR 以外でキー処理してるんじゃねーの?
ちなみにそのアプリーションはdirectXを使っています。 明らかにメインウィンドウのほかにも別のコントロールが存在してると 思うのですがEnumChildWindowsでは検出できませんでした。
DirectX使ってるならWM_CHARでキー入力処理してないって推論で何も間違ってないと思うが。 煽り口調でレスされると中身とは無関係にとにかく煽り返さないと気が済まない人ですか?
198はボクではありません
200はボクではありません
202 :
ボク :2005/06/04(土) 04:12:06
さて問題です。 ボクとは誰でしょうか?
ボクではありません。
急速にスレの質が低下してまいりました
>>195 普通キー入力の処理はKEY_DOWN
DirectXアプリならDirectInput使ってる可能性もある
206 :
デフォルトの名無しさん :2005/06/04(土) 09:32:17
ページテーブルを見たくてCR3を調べたのですが、変な値(1とか20hとか)しか出てきません。 この値は本当の値なのでしょうか、それとも例外ハンドラに引っかかってでたらめな値になっているのでしょうか? ページテーブルを取得する方法があったら教えて下さい。
ボクの振りしないでください。
ボクボク、ボクだよ。 鯛焼き屋さんのおじさんに捕まっちゃった。 今まで盗った鯛焼き代払えって放してくれないんだよ。うぐぅ。 今すぐ口座に100万円振り込んでよ、 ねえ、アッコさん。
現実と空想の区別がつかなくなった妄想オタが引っかかりそうだな。
210 :
デフォルトの名無しさん :2005/06/04(土) 16:08:59
今あるCのプログラムでSTLを利用した機能をつけたいのですが、 C++で作成したdllやlibを、Cで作成したプログラムから使用することはできるのでしょうか? (クラスを使用するとしてもライブラリの中だけで使用して、exportは行いません。)
>>210 extern "C" でCリンケージを指定すれば、その関数は普通にCから使えるよ
>>212 逆じゃないだろ。
C++で作成するライブラリの外に見せる部分を
extern "C" {
}
で囲うのが正解。
Cからextern "C++"を使うのは邪道。
>214 よく嫁よ
Cの方を修正で ってことだよねぇ? extern "C++"やるよりかは、C++の方直してやったほうが良いと思うに一票 ってかWinAPIと関係ねぇw
C++でCリンケージが指定されてないんなら、ねーむあんまんぐる された名前でCから呼ぶしかなくなるが、あれってCシンボルとして つかっていい文字以外とかも使われてるからダメかもな。 試したことないからわからんが。
>>210 のやりたいことって、dllにするほどのことなんだろうか。
単に、Cで書いたobjファイルとC++で書いたobjファイルをリンクすればいいだけのような気もするが。
>>218 それは今回の問題にはあまり関係がないけどな
どっちみちリンケージ指定は必要だし
ファイルマッピングって、メモリに読み込むわけじゃ無いんですか?
ローカルエリア接続に割り当てられたネットワークデバイスに ネットワークケーブル(LANケーブル)が接続されているかどうかを検出するAPIってありますか?
無い
ip helper apiにあるんでねーの?
228 :
デフォルトの名無しさん :2005/06/05(日) 11:14:08
>>223 もちろんあるが、今、出先だから思い出せない。
ところで対象OSは何?
ありますん
有無だけ聞いているんだから有るだけでいいよ
昔はヘルプファイルとかCSVファイルとかにAPIの一覧とか解説がビッシリあったのに 最近は凄く説明がいい加減になっているのは何故ですか? もうAPIという物を無くしたいのかなM$は('A`)
昔はなかったサンプルコードが増えてる
233 :
223 :2005/06/05(日) 16:55:17
GetIfEntry()でネットワークケーブルの接続されているか検出できました。 MibIfRowのdwOperStatusで5だったら接続されてて0だったら切断されてるっぽいです。 それ以外のステータスがよくわからない・・・orz
>>231 日本語ドキュメント作るのマンドクセ(M$談)
GetWindowModuleFileName()って役立たず?
うん
オマエのチソコと同じだなww
239 :
デフォルトの名無しさん :2005/06/05(日) 19:32:32
Windows XP上で、FDからプログラムを立ち上げた場合、プログラム中でスレッドを作成 (CreateThread()や_beginthreadex()を実行)するたびにディスクへのアクセスを行うようです。 おそらく、ライブラリを検索しているんだと思うのですが(違っていたらご指摘ください)、 この(FDへの)ディスクアクセスを抑制する方法がありましたらご教示ください。
スマン、知らん
SetCurrentDirectory
>>241 ありがとうございます。早速試してみたのですが、残念ながらだめでした。
どうやらカレントディレクトリを調べているというわけではなさそうです。
ちなみに、リストビューのアイテムを最初にクリックしたときも
>>239 と同じ現象が見られるんですよね…。
CDみたいなリムーバブルメディアから起動したときのための 何かがあった気がする
244 :
239 :2005/06/05(日) 22:48:36
>>243 どうもありがとうございます。
で、ヒントをもとに探してみたのですがやっぱり分かりませんでした_| ̄|○
>>243 たまたまAdvancedWindowsのメモリ管理のページ読んでたら、
それ関連の記述があった。リンク時に/SWAPRUNなんとかってオプション付けると、
実行時にメモリ上に実行イメージ全てを読み込むらしい。
98や2000だと、FDから実行した場合は標準で/SWAPRUNな動作になるらしいんだが、
それだと
>>239 みたいな動作にはならなさそうだよな。標準動作が変わったのかね?
.exeのあるディレクトリを探索する何かが実行されてんだろうか よそうだけど、SWAPRUNが影響するのは、 .exeとそれに暗黙にリンクされたdllだけだろうし・・・
LoadLibraryとかが呼ばれるとexeのあるフォルダから検索される。
248 :
239 :2005/06/06(月) 02:36:47
>>245 Advanced Windows を持っているのにそのあたりは読み飛ばしていました_| ̄|○
>>243 さんがおっしゃっているのは、どうやら /SWAPRUN のことみたいですね。
試していなかったのですが、Windows 98 と 2000 ではFDへのアクセスは発生しないようです。
しかし、リンク時に /SWAPRUN を付けてもXPだとやはりFDへのアクセスが発生してしまいます。
>>246 >>247 そうですね…「.exeのあるフォルダ」の情報を上書きするAPIでもあると
一気に解決するのですが、それも見つからないので困ってしまいます。
249 :
デフォルトの名無しさん :2005/06/06(月) 12:37:02
こんにちは ユーザーに色を選ばせる様なポップアップ またはダイアログを表示したいんだけど、 VBのプロパティのBackColorで出てくるような ポップアップとかChooseFontみたいな便利な 関数ってありますか? やさしいお兄さん教えて WinXPpro、VC++6.0
ChooseColor
251 :
249 :2005/06/06(月) 13:40:41
>>250 ありがとう!的中しました。
いや〜ChoseFontは知ってたんだが、
Colorバージョンもあったなんて
目から鱗のクラッカー
愛してるよ
252 :
デフォルトの名無しさん :2005/06/06(月) 14:48:30
>>248 2000 で起きなくて XP で送るなら、漏れなら manifest を疑う。
VC++6.0 を携えて出てくる初心者が後を絶たないんだが、 どうして新参者が6.0を持ってるんだろう? それも決まって6.0だ。5.0じゃない。 どうなっているのか?
.NETを購入していない大学or会社でピコったに100ガバス
新参者がVS6.0持ってちゃあかんのか?
確かに253の疑問はもっともだが、どうせ割れなら最新のを使わない手はない気もするしなぁ。 俺もそろそろIDE買い換えたいなぁ…。最近のは関数毎にテキストを畳めるらしいな…。
VC7以降のIDEは、常時使用するにはモッサリしすぎな気がするが。 デバッガは我慢して使ってるが、 それ以外はコマンドライン+makefileに逆戻りしたよおかげさまで。
>>253 2003に移行した人から貰ったんじゃないの?
>>255 新参者なら最近開発環境購入したはずなのだからVC++6.0であるはずがない、
ということでしょ。
>>257 確かにVC++6.0やVB6.0あたりとは軽さが圧倒的に違うね。
でも、インテリセンスつきのエディタとデバッガはやはり欲しいから、IDEから離れられない。
260 :
デフォルトの名無しさん :2005/06/06(月) 17:44:02
上げてしまった...orzスマソ
>>259 プログラマとして新参者でも、最近開発環境購入したとは限らんだろう
貧乏会社に就職したばかりの新人プログラマとかなー
こんばんわ 質問ですが リストビュー(リストコントロール)に挿入されてるカラムの数を取得したいのですが、 そのAPIを教えていただけないでしょうか。 アイテムを取得するAPIはわかったのですが、どうしてもカラムの数がわかりません。
GDIの座標の変換のところで 三角関数とか行列とかでてきた。 図形の回転。。。XFORM構造体。。。 やはりこれは高校の教科書なの、だろう。
266 :
239 :2005/06/06(月) 19:14:50
>>252 manifestって、XPスタイルにするための.manifestファイルのことでいいんですよね?
とりあえず、次の2つを試してみました。
・設定をクラシックスタイルに変更して実行
・.exeファイルのリソースにmanifestを埋め込んで実行
やっぱりどちらもスレッド作成時にFDをアクセスしに行きます…もうだめぽ
>>264 ヘッダーコントロールに対して HDM_GETITEMCOUNT とか Header_GetItemCount() とか
>>248 一時的にハードディスクにコピーして実行するのが簡単だと思うよ
269 :
239 :2005/06/06(月) 22:20:26
>>268 そうですね…確かに現時点ではそれが最も手っ取り早い解決方法かもしれません。
まあ、そもそもいまどきFDから起動するという状況自体がレアケースなので、
無視してもどうということはないのですが…あまり気持ちのいいものではないですよね。
漏れはVS.NET 2002を買ってMSDNで送られてきたVC6を愛用してるよ。 大したことをやっていない、というのもあるけどね。 ちなみに会社では今だにVC4.2
271 :
デフォルトの名無しさん :2005/06/06(月) 23:12:05
ダイアログボックスを使用したプログラムを組んだんですがウィンドウとは 別でダイアログでもうひとるウィンドウみたいなのができますよね。 これをウィンドウとあわせたりできますか?
うひとるウィンドウ ってなんだ?
RegOpenKeyExでKEY_ALL_ACCESSで開いているのに RegEnumValueでキー名がFilterClassesとか出て値が得られないんだけど、 これらを得る方法はありますか? 例えば HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network 以下にあるキーとか。
#include <windows.h> /* 島津印のマーカーを、出す */ void Marker(LONG x, LONG y, HWND hwnd) { HDChdc; hdc = GetDC(hwnd); MoveToEx(hdc, (int)x - 10, (int)y, (LPPOINT)NULL); LineTo(hdc, (int)x + 10, (int)y, (LPPOINT)NULL); MoveToEx(hdc, (int)x, (int)y - 10, (LPPOINT)NULL); LineTo(hdc, (int)x, (int)y + 10, (LPPOINT)NULL); ReleaseDC(hwnd, hdc); } LRESULT CALLBACK MainWndProc(HWND hwnd, UINT messge, WPARAM wParam, LPARAM lParam) { /* FIXME: もうねる */
>>270 漏れは古いソースをコンパイルするときはそのとき使っていたものをずっと使ってる
新しいのでコンパイルし直すだけで古い環境では動作しなくなるらしいから
>>273 >HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network
>以下にあるキーとか。
サブキーを列挙したいのなら RegEnumKeyEx な。
RegEnumValue はエントリ(値)の列挙。
277 :
デフォルトの名無しさん :2005/06/07(火) 00:50:04
>>273 方法を問わなければ、WSHで列挙してテキストファイルに写すってのはどうよ?
たしか、WSHなら制限無く値を得れるはず。(RegEnumValueで制限あるなんて知らなかったが)
指定の値を取れる記述をしたvbsをShellExecuteで呼び出してとかね。
>>276 値が得られないって言ってるんだから、RegEnumValueでいいだろう。
以下のキーの値が得られないって言ってるんだと思う
WindowsXPやWindows2000でパスを追加したいのですが、環境変数を操作する方法を教えてください。
>>278 Get/SetEnvironmentVariable APIがあるけどシステム環境変数は無理っぽいから
レジストリを操作するしかないとおもふ
280 :
デフォルトの名無しさん :2005/06/07(火) 12:10:05
GetAsyncKeyState()の引数にVK_Aと書いたら 'VK_A' : 定義されていない識別子です。 というエラーになってしまいます。 VK_LEFTやVK_UPなどは大丈夫です。 何故でしょうか?
定義されていないからだよ。
282 :
280 :2005/06/07(火) 12:33:05
でも仮想キーコードの表などにはVK_Aが載ってるから使えると思ったんですけど、 どうしたら使えるようになるんでしょうか?
>>282 どうしても、その記述が使いたければ自分で定義するしかないんじゃない?
漏れのwinuser.hにはコメントで↓のように書いてあるし
VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
ありがとうございました。 単に'A'と書いたら大丈夫だったんで、これでいきます。
285 :
デフォルトの名無しさん :2005/06/07(火) 12:56:35
質問させてください。 マウスフック(グローバルフック)を使いたいのですが、うまくいきません。 1回のクリックにつき10回くらい呼び出されてしまいます。 何か対処方法はありますか? 現在下記のようなコードで試しています。 //フックするプロシージャ LRESULT __stdcall CallWndProc(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode == HC_ACTION) { if (wParam == WM_RBUTTONUP) { //処理 } } return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); }
286 :
デフォルトの名無しさん :2005/06/07(火) 16:01:04
一度はずしたUSB機器(特にUSBメモリ)を つかみ直す方法を教えてください # プログラミングで
ExitWindowsExでEWX_REBOOT
288 :
286 :2005/06/07(火) 16:08:24
「デヴァイスマネージャ」の 「USBルートハブ」を無効にして 再度,有効にするとUSB機器が再度認識されます # USB を物理的にはずすことなく これをプログラミングでやりたいんです
289 :
デフォルトの名無しさん :2005/06/07(火) 16:40:07
deviceをデヴァイスなんて気持ち悪い読み方するなら、 managerもマネイジャと読めよ。 んで、使ったことないけどMSDNのDevice Managementあたりを みりゃいいんじゃないか?
ヴァイブ
ヴァイヴ
ゔぁいゔ
ジャグァ
>>280 =282
「ちゃんと定義してある」のか「ただファイル内にそういう文字列があるだけ」なのかが判らんようじゃアプリ開発など夢のまた夢じゃ
OpenMutexって重いですか軽いですか? 全てのトップレベルウィンドウのHWNDにちなんだ文字列の Mutexを順々に検索してヒットしたHWNDに対してメッセージを 投げるという処理をしたいんですが。
>>288 なんとなくマジレスしたくないけど、マジレスすると
SetupDiGetClassDevs
SetupDiSetClassInstallParamsでDICS_PROPCHANGE
SetupDiChangeState
でいけるハズ
>>295 関数がわかってるならやってみりゃいいだろ
そんな自分で計測すりゃわかるようなことを聞きに来るな
相手にしてもらえると喜ぶからスルー汁 >297
>>295 あくまでも一般論としてだけど、Open〜は反復呼び出しを
想定されているので*比較的*軽いと言える。
>>297 ,298
分かんないんなら無理して反応すんなよ。
この板は答えられない質問を見かけると、ムキになって
否定して掛かるのがときどきいるな。
と、やっと自分が答えられる質問が来てちょっと得意げなヒキデブでした。
ヴァイブレイシャン
盛り上がってまいりました(゜∀゜)ノ
そして盛り下がってまいりました(゜д゜)
急速にスレェァドゥのクァリティが低下してまいりましたフォー
だれもムキになってないと思うけど 面白がってるだけだからフォー
ゲイは帰れフォー
何この流れフォー
310 :
295 :2005/06/07(火) 19:30:45
〃 i, ,. -‐ r' ィ=ゝー-、-、、r=‐ヮォ.〈 / ! :l ,リ|} |. } / .や . {. | ′ | } l レ-、{∠ニ'==ァ 、==ニゞ< | ら !∩|.}. '"旬゙` ./''旬 ` f^| | l(( ゙′` ̄'" f::` ̄ |l.| | な . ヽ.ヽ {:. lリ | . }.iーi ^ r' ,' ノ い !| ヽ. ー===- / ⌒ヽ . /} \ ー‐ ,イ l か __/ ‖ . ヽ、_!__/:::|\ ヽ
だが断る!
ヮォ
>285 「処理」の中で MessageBox() とか呼んでない?
>>285 nCode < 0 ならCallNextHookExだってばよ
んで改善されないならハンドルみて確認しろや グローバルなんだべ?
316 :
285 :2005/06/08(水) 01:18:16
>314 >「処理」の中で MessageBox() とか呼んでない? あ、呼んでます。フックできてるか確認するために、 とりあえずMessageBox()で確認しているので。 このせいですかね?他の方法で確認してみます。
OpenPrinter をする際に、ネットワークプリンタの場合は文字数が30文字を超えてしまって オープンエラーになってしました(GetLastErr では、1801 プリンタ名がおかしい) 長い名前のネットワークプリンタの場合の OpenPrinter はどうやるのでしょうか?
318 :
にゃこ :2005/06/08(水) 02:57:24
質問させて頂きます WindowsMediaPlayerのように歪んだウインドウをつくるには どのようにすればよいのでしょうか
検索キーワード「ウィンドウリージョン」または「レイヤードウィンドウ」 ウィンドウリージョンの方が難易度は低いと思う。
321 :
にゃこ :2005/06/08(水) 03:48:05
319さん、320さん ありがとうございます。がんばってみます。
そういうアプリは好きじゃないな。
>>299 答えるまでもない質問にいちいち答えるなよ
スレがみにくくなる
タイムポカーン
326 :
デフォルトの名無しさん :2005/06/08(水) 12:30:48
オーナードローでリストビューを描画しています。 ところが、アプリ側でLVM_SETITEMSTATEを使い、リストビューの項目を選択状態にしても、 WM_DRAWITEM時に、ODS_SELECTEDフラグが立ってくれなくて困っています。 (マウスで普通に項目を選択した場合は、問題なくODS_SELECTEDが付いてます。) 何か解決方法をご存知の方、ひとつよろしくお願いします。
乱数の初期化は、こんな↓でいいですか? GetSystemTime(&t); srand((t.wSecond << 16 | t.wMilliseconds));
331 :
330 :2005/06/08(水) 18:40:42
すいませんtime()ありました。
QueryPerformanceCounter()なんt(ry
好みはSetWindowRgn
乱数の使用目的による。 ゲーム程度ならそれで十分だが 暗号鍵の作成だったらやめとけとか
暗号鍵の作成にsrandとかrandとか使うなよ(w
乱数とはちょと違うがGUIDを生成する手もある。
>>326 LVM_SETITEMSTATE送るときにLVITEMのstateMaskを間違えてない?
(ListView_SetItemStateマクロの方なら第四引数のmask)
すいません、特定のアプリケーションのプロシージャとかではなくて windowsがアプリケーションにメッセージを送る前にメッセージを フックしたいのですがどうすればいいですか。教えてくださいお願いします。
”グローバルフック”か”システムフック”でサーチすると幸せになれると思うよ。
こんにちは 質問ですが、 タブコントロールのタブ部分につけるテキストのサイズを変更したい場合は、 どのようにすればよいのでしょうか。
343 :
デフォルトの名無しさん :2005/06/09(木) 11:10:30
質問なんですが、プロセスIDを取得済みのExplorerに対して、トップウィンドウなりフォルダビューなりにメッセージを送るなどして、他のフォルダに移動したいのですが、どうしたらよいでしょうか?(新しくウィンドウを開くのではなく) とりあえず今の時点では、その時に表示中のフォルダのサブフォルダの一つに名前を指定して移動できればいいので、キーボード系のメッセージをフォルダ名の順番に送って最後にエンター送ろうかとも思ったのですが、それだと日本語のフォルダ名に対応できません。 将来的には任意のフォルダにフルパス指定で移動っていうのも視野に入れたいので、何かいい方法があったら教えてください。
リストビューのアイテムの中にコンボボックスを入れることはできますか?
USB接続の新しいドライブが増えたり、フォルダ内の内容が変わったりしたときに、それを検出するにはどうしたらよいのでしょうか?
RegisterDeviceNotification
FindFirstChangeNotification
348 :
デフォルトの名無しさん :2005/06/09(木) 15:31:58
現在のデフォルトプリンタと、給紙トレイを取得する方法を教えて下さい。
トイレの紙を補給する方法を教えて下さい。
マニュアルを読んでください。
拭き取るのは、体に付いた栄養素を取ってしまうことと一緒だからな。
>>353 つまり、拭き取ってもう一度口から摂取すればいいわけですね。
デフォルトプリンタはたしか GetProfileString("windows", "device",・・・ でいいんじゃなかったかなあ
PrintDlg / PD_RETURNDEFAULT
指定したフォルダにあるファイル一覧を取得したい場合はどのようにすればよいのでしょうか。 よろしくお願いします。
>>358 FindFirstFile()
FindNextFile()
FindClose()
360 :
デフォルトの名無しさん :2005/06/09(木) 19:24:21
デスクトップ上のウィンドウで一番手前にあるウィンドウをアクティブにするにはどうすればいいですか?
一番手前にあるのにアクティブじゃないWindowなんてありません
なこたない
>>360 理屈ではSetActiveWindow(GetTopWindow(NULL));
でもXPとかでは勝手に手前に出さないようになった。
364 :
デフォルトの名無しさん :2005/06/09(木) 20:16:21
PlgBlt、 MicroSoftによると2000、XPは対応で 95,98は未対応とのことだが、 これってMeは未対応ってことですよね。
365 :
デフォルトの名無しさん :2005/06/09(木) 20:18:40
ウィンドウの背景描画用ブラシを動的に交換することはできますか? あるラジオボタンがクリックされたときに、そのラジオボタンの領域 の色(これはウィンドウの背景色ですよね?)を変更したいのです。
そう。
WM_CTLCOLOR
HWND_TOPMOST ((HWND)-1) winuser.h ウィンドウをすべての最前面ウィンドウよりも前に置きます。ウィンドウは、 アクティブでなくても手前に置かれます。
MFCではなくAPIを使ったSDKというのでプログラムを書けるようになるのが目標の 初心者プログラマです 今後の勉強の仕方に悩んでおり、相談にのっていただけると助かります Cの入門書が終わり、この後、VC++を購入して 猫でもわかるWINDOWSプログラミング プログラミングWindows第5版〈上、下〉 Win32API完璧マスタ―Visual C++プログラミング のどれかの本を購入して勉強していこうと思っております 正直、VC++とかMFC・SDKとかAPIとかについて良く分かっておらず このような勉強の仕方でよいのか不安があります 私の認識では ・VC++とは、コンパイラ・デバッガ・MFCと呼ばれる各種ライブラリ等が入った 開発環境で、MFCではなくSDKを使いたい人にも便利で、Cをやるなら買っておいた ほうがよいソフト ・MFCとは、WINDOWS用プログラムを作る際、知らなければならないAPIは命令の数も 多く難しい。VC++では、APIを知らない人でもWINDOWSプログラムが簡単に作れるように MFCという各種ライブラリがある。一般的にVC++用の初級本では、特にAPI・SDK用と書いていない場合 MFCを中心とした本が多い ・SDKとは、APIを使ってWINDOWSプログラムを作る技術 ・APIとは、WINDOWSプログラムを作る際、WINDOWSのOSに命令を渡す方法 こんな認識であってますか? また、C入門書の後、前記の3つの本でVC++とWINDOWSプログラムを勉強しようと 思っておりますが、これらの中でC++やVC++の使い方を前もって知らないときつい 本はありますか? このような勉強方法以外に、お勧めの勉強法はありますか? 長くなりましたが、宜しくお願いします
コンパイラ・デバッガはツールでMFCはライブラリでVC++はそれらを含む パッケージ。SDKだけならVC++はそう便利でもないような。API知らないと MFCは苦しい。むしろMFCで覚える量は増える。減るのはコーディングの 量だけ。本は「ウィザードで雛形を作りましょう」って感じのが殆ど。コードを 直に書きましょうってのはほとんどない。そしてウィザードの作ったコードの 意味が分からずにドツボにハマる。SDKはSoftware Development Kitの略。 その名の通り、kit。技術ではない。APIは渡す「方法」ではなく、命令(または その集合)そのもの。
SDKだけでもVC++は便利だと思います
376 :
375 :2005/06/09(木) 21:24:33
クラスってかC++だな
377 :
デフォルトの名無しさん :2005/06/09(木) 21:59:39
>>368 「オーナードロー」を調べてみました。そして、WM_DRAWITEM がプローシージャにきた時に、
そのまま return 0; するプログラムを書いてみたのですが、ラジオボタンの◎もテキストも
表示されなくなりました。なんだかよくわかりません。ラジオボタンの◎とテキストを返し
てください。
>>369 WM_CTLCOLOR は windows.h で定義されていないようです。コンパイラに怒られました。
コンパイラに怒られる前にMSDNあたってみろよ
>377 オーナードローというのはコントロールの描画をコントロールに任せず自前で描く事。 チェックの状態やテキストは BM_GETCHECK や WM_GETTEXT で取得。
>>363 GetTopWindowするとうちの環境ではIMEのツールバーが返ってきてしまい
それをアクティブにするとエラーがでてしまいます(成功してもあまり意味ないですし・・・)。
Alt+TABで切り替えられるウィンドウに限定することは出来るでしょうか?
やりたいのはこんなことなんですが
// アクティブウィンドウを裏に回して次のウィンドウに切り替える
HWND h = GetForegroundWindow();
SetWindowPos(h, HWND_BOTTOM, ...);
h = GetTopWindow(0); // <-ここでIMEのツールバーが引っかかる
SetActiveWindow(h);
382 :
デフォルトの名無しさん :2005/06/09(木) 22:21:19
>>379 ということは◎やテキストも自分で描くんですか?背景色を変えたいだけ
なんですけど。今、ラジオボタンの領域の背景はグレーなのですが、
クリックして選択された場合には赤などに(選択されたことを強調する意味)
したいのです。その他の点はまったく同じで。
漏れは、サブクラス化してWM_PAINTを乗っ取る方法を 使ったな。ほかにも幾つか捕まえるべきメッセージが あったはずだけど、それは忘れた。
だから、WM_CTLCOLOR
385 :
デフォルトの名無しさん :2005/06/09(木) 22:51:50
>>384 調べたらMFCがどうたらとか出てきたのですが。。。
このスレMFCはなしでしょ?Win32APIの呼び出しで解決したいのですが。
WindowBackgroundBrushChangeHappy(hMyRadioButton, hMyBrush) みたいな。
WM_CTLCOLORはWIN16時代のもので、 今は WM_CTLCOLORBTN、WM_CTLCOLORDLG、WM_CTLCOLOREDIT、... に分かれている つかMSDN嫁
388 :
365 :2005/06/09(木) 23:47:44
>>386 ありがとう。ありました。でもうまくいきません。どなたかソース見てください。
元の質問は
>>365 です。
#include <windows.h>
#define IDR_COKE 10001
#define IDR_COFFEE 10002
void OnCreate(HWND hWnd)
{
CreateWindow("BUTTON", "コーラ", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
0, 0, 100, 18, hWnd, (HMENU)IDR_COKE, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 0);
CreateWindow("BUTTON", "コーヒー", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
0, 20, 100, 18, hWnd, (HMENU)IDR_COFFEE, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 0);
}
389 :
続き :2005/06/09(木) 23:48:47
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_CREATE: OnCreate(hWnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CTLCOLORBTN: return (LRESULT)CreateSolidBrush(RGB(0xff, 0, 0)); default: return DefWindowProc(hWnd, msg, wp, lp); } }
390 :
続き :2005/06/09(木) 23:50:05
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow) { WNDCLASS winclass = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInst, 0, LoadCursor(0, IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1), 0, "MainWindow", }; RegisterClass(&winclass); HWND hWnd = CreateWindow("MainWindow", "test", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (int rt = GetMessage(&msg, 0, 0, 0)) { if (rt == -1) break; TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
ソースを貼り付けんな馬鹿。 どっかにうぷってそのアドレスを貼り付けろ
392 :
365 :2005/06/09(木) 23:53:36
どっかにうっぷる方法が分かりません。もうしないので、ご勘弁を。
荒らしヨクナイ
> return (LRESULT)CreateSolidBrush(RGB(0xff, 0, 0)); アフォ
395 :
365 :2005/06/10(金) 01:28:33
>>394 もっと詳しく。リークなら怖くありません。テストプログラムなので。
ラジオボタンなら WM_CTLCOLORBTN じゃなくて WM_CTLCOLORSTATIC だ。
どうでもいいけど
>>365 はC++で完全にC + SDKスタイルで書いてるんだな
そういう人、結構いるの?
個人でMFC使う利点がわからないので俺もSDKスタイル
COM関係扱うときはMFCとかATL/WTLのほうが楽じゃないか? といいつつ俺も普段は生APIだな。
俺は生APIから入ったからAPIは知ってるけどMFC・ATL/WTLを知らない
ぶっちゃけ生API派な俺にはMFCとかキモ過ぎ 自分で必要なクラス設計した方が気持ちいい
ATL/WTLはいいと思うけどな。ATL/WTLを使い出す前はメッセージクラッカー使っていた。 どっちも使っている人少ない……。 ○| ̄|_
生APIはソースが汚くなるから、ATL/WTLかMFCを使う。
ここは生々しいインターネッツですね。
やっぱり生がいちばん
質問です コンパネにある「サウンドとオーディオ」の ハードウェアtabにある既定のデバイスを、 ソフト側から変えたい (たとえばあるソフトを使うときは特定のデバイスを出力対象にしたい) のですが、APIは何を使えばよいんでしょう? ボリュームをかえるmixerってのはよく検索にひっかかるんですが、 どうも求めるものじゃなさそうだし・・・ ちなみに開発環境はXPでVB
しかし、MFCにあるけどAPIに無い、って場合 ソース見てどのAPI使ってるかの確認くらい できないのかねぇ
FillSolidRectとかな
409 :
デフォルトの名無しさん :2005/06/10(金) 10:27:36
Windows 2000 「ハードウェアの取り外し」ダイアログで 適当な装置に対して取り外し操作がおこなわれたときの アクションをつくる必要があります APIドキュメントを読むと WM_DEVICECHANGE というメッセージがきて 「取りはずし要求」をしめす DBT_DEVICEQUERYREMOVE というイベントをもっている, ということになっています. ところが実験してもこのイベントのメッセージがきません 「取りはずし」が終わったことを示す DBT_DEVICEREMOVECOMPLETE というイベントはちゃんときています. ほしいのは「取りはずし」の事前のメッセージなんです なぜこれが来ずに終わった後のは来るのでしょうか? どうしたら事前に来るようになるのでしょうか?
SDKでグローバル変数を使わず作るのが本当の熟練者。
>>410 熟練者とまで行かなくても使わずに済ませられると思うが
もちろんウィンドウプロシージャ内でのstatic変数も駄目。
使っても問題ないしな
GetWindowLongだのGetPropだのサンクだの程度では熟練者じゃないな。
>>402 ATLはやはりCOM系の開発で使われることが多い希ガス
ATL7+WTLで普通のWindowプログラム書くの、悪くないんだけどWTLは
非標準だしドキュメント不足なので、仕事で使うには二の足を踏んでしまう
まあATL7だけでも、生APIゴリゴリよりはぜんぜんマシだと思うけど。
特にActive X controlのホスティングとか、生APIではやってらんない。
あれと同等のものを作るのは車輪の再発明でしかないよ。
>WTLは非標準だし WindowsAPI、MFCは標準なのか?
最近メッセージクラッカーを覚えて少しだけソースが読みやすくなったと思っています。 MFCとかATL/WTLってどういうもの? Win32APIをクラスでラップしたものという解釈でいいの? 覚えてみようかとも思っているけど、MFCとATLってどっちがいいのかわからないんですが。
>>417 MFCよりATLの方がAPIをラップしただけという感が強いと思う。
ATL自体はメッセージクラッカーのような物を持っていない。(W/LPARAMがそのまま渡される)
そこへWTLを使うとメッセージをクラックするのがついてくる。
FindFirstFileを使って、フォルダ内のファイルを検索したんですが、 FindFirstFileからWIN32_FIND_DATAに格納される値が必ず"フフフフフフフフフフフフフフフ"となってしまいます。 なぜなのでしょうか。 C言語ソースファイルだけを抽出しようとしています。 ちなみに、指定しているパス名は、 WIN32_FIND_DATA FindFileData; HANDLE hFind; hFind=::FindFirstFile("C:\\MySourceFile\\*.c",&FindFileData); というかんじです。
>>416 MS的には非標準でしょ
>>417 C++使ってオブジェクト指向でWindowを扱おうとすると
Window class --> C++ class
Window --> C++ object
のように対応付けるのが普通。というかそうしたくなる。
そうすると問題になるのが、グローバル/staticな関数であるWindowProcで、
これをC++クラスのインスタンスメソッド(メンバ関数)にマップしたい訳。
で、その方法は色々あって、一番単純なのはSetWindowLongでC++クラスの
インスタンスのポインタをWindowに設定してしまうことなのだが、
# こうした方法の例はPlatformSDKのCOMサンプルなどに存在する。
ATLのようなライブラリではもっとマシで効率の良い方法が用いられている。
まあC APIのラッパーで基本的には間違ってないんだけど、
上述したように、よりC++的にWindowingできる仕組み・フレームワークを提供している
という点がまあ一番のポイントじゃないかな。
それと、利便性だけで言うなら、COMコンポーネントを使うのは
MFCやATLを使う方がCで直触りするよりずっと簡単。
COMサポートに関しては、ただの「薄いラッパー」をはるかに超える
充実した機能が提供されてるから。
>>419 関数が失敗してるんじゃね?
戻り値をチェックしる
フフフ・・・はdebugモードでの未初期化の内容
つまり、フフフがセットされたのではなくて
誰もセットしてないってこと。
>>421 の言うように失敗してると思われ
ちょいと気になることなんだけど VirtualAllocVlmのような64bitAPIは抹殺されたの? 英語版のMSDNに載ってないんだけど。
フフフはint3
ヒヒヒヒヒ は ネオ麦茶
ウホッ は ヤマジュン
>>417 ATL にも MFC にも、APIを適当にラップしたクラスと、
アプリケーションやコンポーネントを作るためのフレームワークとの
両方が入ってます(他にユーティリティ的なものもある)。
API をラップした部分ははっきりいってどうでも良いものが大半なのですが、
フレームワークの方は VC++ の独自拡張構文や VisualStudio の支援とも
有機的に結合していて大変結構役に立ちます。
429 :
417 :2005/06/10(金) 19:24:59
ちょっと調べてみたところ、ATLやWTLが面白そうです。 Win32APIは今までどおり使いたいけど、 生でAPIを使ってGUIを書くと面倒ですし。 といっても、その辺に転がっているGUIの独自なライブラリだと、 自由にできなくて不満だったり。 WindowsのGUIの仕組みって、もう少し簡単にはできなかったのかな。 といっても、現行のメッセージを投げる以上にいい仕組みが思いつかないへたれですがorz
430 :
365 :2005/06/10(金) 21:31:05
>>396 ありがとう。まだうまくいかないけどがんばってみます。
フフフフフフフフフ って笑われてんだよ おめー何つくってんだよって
WTLがバージョンアップした日にWTLスレよりWTL関係のレスが多いスレはここですか。
433 :
デフォルトの名無しさん :2005/06/11(土) 01:15:56
Windowsプログラミングの達人になるためにはどのくらいの期間が必要ですか?
今まで食ったパンの枚数×秒
435 :
デフォルトの名無しさん :2005/06/11(土) 01:24:04
まじめに頼む。
すまんかった
437 :
デフォルトの名無しさん :2005/06/11(土) 01:24:59
1秒でレスが。。。
どれぐらいのレベルならWindowsプログラミングの達人なんだろうな IEやMicrosoft Excelが自分で組めたら達人か? カーネル書くとかは、Windowsプログラミングとはいえないような気がするな
>>439 初心者の質問に
迅速かつ丁寧に答えられるようになったらマスターだぜъ( ゚ー^)
デュアルディスプレイの環境で2つ目のディスプレイのDCを取得するにはどうしたらいいのでしょうか?
442 :
デフォルトの名無しさん :2005/06/11(土) 05:21:09
Windowsのページ保護を勉強して悩んでいるんですが、プロセス空間内に、読めるけど書き込めないページが存在してますよね? これはページ属性のR/Wビット(PTE-b1)を0にしているからだと思うんですが、このビットは486以降の機能だと本に書いてありました。(アスキー出版局「はじめて読む486」P.308) Windows95や以前のWindowsNTでは386(SX)が最低スペックですよね? だとするとそうしたマシンではこの機能が実現されてなかった、というわけなんでしょうか・・・?(どのページも書き込めてしまったのか!?) 誰か、386で95やNTを動かしてみた、あるいは現在動かしている、という方、いらっしゃいますかね? ご存じの方、お教え下さい。
ウィンドウを作って、ステータスバーを付けたのですが スクロールバーを付けていると、水平スクロールバーの 上にステータスバーが表示されてしまいます。 ステータスバーをウィンドウの1番下に表示したいのですが なにかいい方法はないでしょうか。
親ウィンドウにステータスバーを貼り付け残りの部分に子ウィンドウを一枚張る。 その子ウィンドウにスクロールバーをつける。
>>445 「質問箱」ですよね。だからここで質問してるのです。
何の質問箱か。それが重要だ。
一応メモリ割り当てAPI関係の質問じゃないか? というか他に該当スレ思いつかん 分かるのがいるかどうかは別として 386SXじゃ95はおろか3.1でも実用にならないしなぁ
APIをはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
APIとは関係ありません。
こんばんわ リソースにあるビットマップファイルをLoadBitmapで読み込むのはわかりますが、 ファイルとしてある.bmpを読み込みHBITMAPへ格納するための手順がわかりません。 簡単で構いませんので、使用するAPIを教えていただけ無いでしょうか。 後は私が調べます。 よろしくお願いいたします。
LoadImage
>>451 LoadImage()でLR_LOADFROMFILE指定
リストビューのアイテム欄にコンボボックスつけられたっけ?
そんな機能はリストビューには無い。
ただ上に被せるだけだがな
リストビュー+エディットやコンボでお手軽グリッドみたいなのは よくやるな
OfficeやVisualStudioで使われているリバー(ウィンドウ上側についてる)のライブラリは一般公開されてますか? 是非使いたいのですが。
460 :
デフォルトの名無しさん :2005/06/11(土) 20:30:45
>>444 助かりました。
ありがとうございます。
>>460 それはOfficeで使われてるツールバーとは違いますよ。
じゃXPとか2003とか言わんと
Windowのコンテントカラーを変えたい場合はどのAPIを呼べばいいのでしょうか? Windowsの場合は、ウィンドウでデフォルトが白、ダイアログで灰色ですよね。
466 :
464 :2005/06/11(土) 23:36:49
>>465 できれば、ウィンドウ個別に色を変えたいのですが。
467 :
デフォルトの名無しさん :2005/06/11(土) 23:43:27
VCでウィンドウソフトを作っているんだけど(APIのみ) そのソフトを閉じるときタマに反応が返ってこなくなりOS(XP)の動作もおかしく なってしまいます。 原因はスレッドのシグナル待ちが考えられるけどそれ以外に原因が思いつきません。 メモリーはリークはしていません。 誰かアドバイスください。
>>467 そのスレッドのシグナル待ちをどうにかしろよとしか言えない。
>>467 デバッグ実行すれば、どこで制御が返って来なくなるかわかるだろ。
>>467 GetMessageが-1返してるとか
CPUとHDDの温度を取得する方法を教えてください
ThemeAPI関係で質問させてください。
VSを適用したときのReBarコントロールの背景を描画したいので
すが、OpenThemeDataでReBarのテーマハンドルを取得し、
DrawThemeBackgroundでRP_BANDを指定したのですが何も描画
されませんでした。
CodeProjectから
ttp://www.codeproject.com/w2k/xpvisualstyle.asp このようなものをみつけ、RebarのRP_BANDを調べてみたのです
が、どのテーマを調べても何もセットされないことがほとんどでした。
他のパーツなのかと思い、一致するものを探したのですがどうも
同じパーツを見つける事ができません。
Rebar(もしくはToolbar)コントロールの背景はどうすれば描画できる
のでしょうか?
CPUの現在のクロック数などを取得するにはどうしたらよいのでしょうか?
GetCPUClock
GetCPUClockAndSoOn
TreeView_SetItem(m_hWnd,pItem);で、TV_ITEMをセットした後、なぜか強制終了するのですが、 このような不具合ってご存知な人はいますか? case WM_NOTIFY: { MSGFILTER *pmf; TV_DISPINFO *ptv_disp; int x,y; if (wp==11000) { ptv_disp=(TV_DISPINFO *)lp; if(ptv_disp->hdr.code==TVN_ENDLABELEDIT) { tree.SetItem(&ptv_disp->item); } } } void CWinMyLapTree::SetItem(TV_ITEM* pItem) { TreeView_SetItem(m_hWnd,pItem); }
if (wp==11000) { 11000というのは、リストビューのIDです
TreeView_SetItem(m_hWnd,pItem)の返り値は0で成功してます。
484 :
デフォルトの各無しさん :2005/06/12(日) 14:38:58
return も break もしてないから次のラベルまで走ってんジャネーノ 知らねーけど
485 :
デフォルトの名無しさん :2005/06/12(日) 15:28:32
C言語を一週間前に始めてifとかwhileとかを一通り覚えただけの俺が 今すぐにwinAPIでのゲーム作りにとりかかるのって無謀ですかね?
486 :
483 :2005/06/12(日) 15:32:40
どうやら、TreeView_EditLabelを呼び出し処理後(エディット後)、強制終了します。 現在、原因究明中です。
487 :
デフォルトの名無しさん :2005/06/12(日) 15:32:55
>>485 無謀だと思う。
平仮名覚えたてで小説書こうとするようなもんだ。
やりながら覚えるしかねーよ やらなきゃ覚えねーよ 目標あるのはいいことだ ただ自分の予定してる期間の100倍はかかると思っとけ ゲームの内容にもよるが
489 :
デフォルトの名無しさん :2005/06/12(日) 15:44:50
レスどうも。 やはり無謀でしたか・・・。HPとかみてもチンプンカンプンなわけだ。 出直してまいります。
シューティングやアクション系なら素直にHSPでもつかっとけ
俺は29歳だけど、Win32APIは余裕だよ。 MFCもマスターしてるし。 今から.NET覚えるつもり。 ただ、そんな俺も、18歳の時に始めてMacintoshのToolboxAPIを見て、「なんじゃこれ!???」と驚いたものです。 あまりの難しさに。
つ チラシの裏
φ(・∀・) チラシの裏
494 :
483 :2005/06/12(日) 17:13:46
解決しました。 ツリービューのエディタ部分って、編集が終わったらマウスのクリックじゃないと終われないんだな。 キーボードのリターンキーだと無反応だわ。
495 :
デフォルトの名無しさん :2005/06/12(日) 17:19:20
CPUの現在のクロック数などを取得するにはどうしたらよいのでしょうか?
その質問最近どこかで見かけたな
CPUの現在のクロック数などを取得するにはどうしたらよいのでしょうか?
>>442 PTEのR/Wビットなら386の時代からあるよ。
その本が変なこと書いてるか、喪前さんが誤読してるかのどっちかだろ。
あと、CPU特化話だから機械語なんとかってスレで聞いた方がいいかと。
>>491 難しいっていうか、面倒臭いんだよな。
WinAPIからDefWindowProc()を取り除いた風って言えばわかりやすいかな。
最新技術.NETのほうがWin32より簡単な罠
>>442 はじめて読む486にはこう書いてるよ。
>リードライトビット
>0ならば、特権レベル3では書き込みできない
>0ならば、CR0レジスタのWPビットが1のとき、特権レベル2以下でも書き込みできない(486のみ)
要するに一番下の行に書いてあることが\486のみだっていうことだ
すいません、WM_APPというのが具具ってもよくわかりません。 グローバルフックでWM_APP+100までのメッセージを受け取って キー入力があったこと自体は判別できたのですがWM_CHARの wparamのように入力されたキーを判別する方法がわかりません。教えてくださいおねがいします
WM_APPは、アプリケーションが勝手に定義して勝手に使うメッセージ。 だから、WM_APPでキー入力の判定が出来るというのが、そもそも そのアプリケーション特有の動作。
エスパーだな
>>498 1クロック命令を1秒間繰り返し実行して、実行した回数を取得する。
winプログラムでゲームを作ろうとしているのですが、 ビットマップを描き消しするためにInvalidateRectを使っています。 しかし、頻繁に使っているせいでもありますが、ちらつきがよく目立ちます。 なんとかならないでしょうか?
WM_ERASEBKGND でも抑制したら。
ダイアログボックスをつっくてEDITTEXTコントロールを使用したのですが、何も表示されないのですがこれはなぜでしょう。 EDITTEXTの部分は EDITTEXT IDC_EDIT,59,7,60,13,ES_AUTOHSCROLL となっております。
510 :
477 :2005/06/12(日) 22:56:37
うーん丸一日弄ってたけどさっぱりわからなかった…。 CodeProjectのほうでも同じような質問が出てるっぽいし解決法 なしでFAなのかな。
>507-508 おお、早々とありがとうございます。
>>510 fMaskにRBBIM_BACKGROUNDじゃだめなのか?
513 :
477 :2005/06/12(日) 23:15:54
>>512 すみません、たびたび質問で申し訳ないのですがfMaskとは
どの関数のパラメータでしょうか。
DrawThemeBackground(Ex)には見あたらなかったもので。
あ、悪い。 通常のrebarと勘違いしてた。
515 :
477 :2005/06/13(月) 01:28:36
>>514 申し訳ないです、通常のReBarならそのまま作ってやればいいん
ですけどねぇ。
いろいろ探ってみます。ありがとうございました。
winのアクセサリのペイントなどでBMPを扱う際に 範囲指定などで始点と終点を結ぶ点線の矩形を表示していますが あれはどのように実装すればいいのでしょうか? MFC使用不可でおねがいします。
>>516 普通にAPIで矩形描画すりゃいいじゃん
すいません、猫でもの通りにdll作ってみたのですがlibファイルが生成されません。なぜでしょうか教えてください
>>516 CreatePen()で破線作って書いたり消したり。
ちらつきが気になるならバックバッファでも作る。
XORペンってなかったっけーとおもったけど見あたらなかった。
漏れなんか勘違いしてるのかな・・・。
>>518 猫でものとおりにやってないor猫と環境が違う。
猫でもの簡単に作るのとこのはできるんだよ。161章のソースで "hookdll.h"とか存在しないファイルをインクルードしてるたり ソースの途中にコメント入れてたりして激しくむかついてくるんだが
他のサイトみてやっとできたぜ。EXPORTの説明ぐらい書けよ糞猫が
そもそも猫は勉強するためには使わない方が吉。 Win32のソース集だけと思っておけ。
>>519 SetROP2(hdc,R2_COPYPEN);
SetROP2(hdc,R2_XORPEN);
ニャンコと呼べ
>>516 MFCのソースを見ると、リージョンを駆使した挙句にPatBltしてる。
MFC使用不可でもソース見てみたら?
ロックしてるファイルを削除したいの どお、できそう?
マシン再起動して起動時に削除
他に意見のある方いますか?
異議な〜し
待て待て、ロックを解除してからファイルを削除すると言うのはどうだ?
他の人(アプリ)がロックしたものでも だいじょうぶ?
ロックもへったくれも無いな
そこをなんとか
窓から投げ捨てろ。
他のアプリがロックしてるならそのアプリを終了させればよかろ?
タブコントロールの指定したタブをアクティブにしたいのですが、 Win32の場合ですと、どのようにするのでしょうか。 おそらく、SendMessageで何かしらのメッセージを送っていると思いますが。
>>537 やっぱそうなる?
他に意見のある方いますか?
ロックを強制的に解除できるIFSレイヤでも書いたら。
SendMessageとPostMessageの違いですが、 イベントキューに入れるのではなく、即メッセージ処理をしてくれるのはどっちのほうでしょうか?
>>542 「即メッセージ処理」させるAPIなんてない。
どっちもメッセージキューに入れられる。
リッチエディトの選択範囲の文字サイズを変えたいのですが、 どうもうまくいきません。 何に問題があるのでしょうか? void CMyRichEdit::SetFontSelected(char* pFontName,int fontSize) { HDC hDC=::GetDC(m_hWnd); CHARFORMAT cfm; memset(&cfm,0,sizeof(CHARFORMAT)); cfm.cbSize=sizeof(CHARFORMAT); cfm.dwMask=CFM_CHARSET|CFM_FACE|CFM_SIZE; cfm.bCharSet=SHIFTJIS_CHARSET; cfm.dwEffects=0; cfm.yHeight=MulDiv(fontSize,GetDeviceCaps(hDC,LOGPIXELSY),-1440); strcpy(cfm.szFaceName,pFontName); ::SendMessage(m_hWnd,EM_SETCHARFORMAT,SCF_SELECTION | SCF_WORD,(LPARAM)&cfm); ::ReleaseDC(m_hWnd,hDC); }
546 :
545 :2005/06/13(月) 20:26:39
上記は解決しました。 もう一点ですが、リッチエディットに設定されてる文字数を得るにはどうすればいいのでしょうか?
>>546 GetWindowTextLengthは駄目?
>>540 絵だけ見ても判らんが、描画順序の問題じゃないの?
EDITTEXTを描画した後に同じ座標に重なっている別のWindowをSW_HIDEしているとか。
SendMessageは投げたメッセージを処理するまで帰ってこない PostMessageは投げたら即帰ってくる どっちもメッセージキューにはいることに変わりは無い。
>>551 そうじゃない説明よく見るけどなぁ。ほんとう?
MSDNのSendMessageの解説より 指定されたウィンドウが、呼び出し側スレッドが作成したものであった場合、 そのウィンドウのウィンドウプロシージャがサブルーチンとして即座に呼び 出されます。指定されたウィンドウが、他のスレッドが作成したものであっ た場合、システムはそのスレッドへの切り替えを行い、次に適切なウィンド ウプロシージャを呼び出します。複数のスレッド間で送信されたメッセージ が処理されるのは、受信側スレッドがメッセージ取得コードを実行したとき だけです。送信側スレッドは、受信側スレッドがメッセージの処理を終える まで、ブロックされます(待機状態になります)。
Advanced Windows に何か書いてたような気がするけど、 手元にないからわからん。 でも GetQueueStatus には > QS_SENDMESSAGE > A message sent by another thread or application is in the queue. これって関係ないかな?
Sendされたメッセージの処理中に別のメッセージがSendされて来たら どうなる?
>>556 Windowsメッセージなら、キューにたまるだけだろ
SendMessageされたメッセージがキューに入るって事は、 GetMessageやPeekMessageで取れるってこと?
つか
>>553 のはキューを介さずに直接呼ぶよって説明でないの?
別スレッドからの時はよく分からんけど。
>>560 ああなるほど、そっちか。
確かにそうだな。
プ
AdvancedWindows読め、の一言なんだけどな、実際。
>>553 をもちょっとかみ砕くと:
スレッドDが作成したウィンドウに、スレッドDまたはSからSendMessage()するとしよう。
(1)スレッドDからSendMessage()した場合
メッセージキューを介さずに直接WinProc()が(関数コールで)呼ばれる。これは皆も知っての通り。
(2)スレッドSからSendMessage()した場合
メッセージはスレッドDの「SendMessage専用メッセージキュー」に一旦溜まり、
スレッドDの「プロキシ的何か」がWinProc()を(関数コールで)呼ぶ。
つまり、Post用のキューとは独立して、他スレッドからのSendMessage用のキューがあって、
「プロキシ的何か」がスレッドSの代わりにスレッドD内でWinProc()を呼び出す仕組み。
>>556 上の例だと、スレッドDの「SendMessage専用メッセージキュー」に溜まって順次処理される。
ちなみに、「プロキシ的何か」ってのはGet/Peek/WaitMessage()なんだけど、
内部的に、暗黙的に処理してるので、外部からはその様子はうかがえない。
なので
>>559 はNO。
ちゅうことは、スレッドDがGetMessage等の関数を呼び出した際に、 「SendMessage専用メッセージキュー」を処理して、何食わぬ顔で 通常のメッセージキューの内容をもって返ってくると言うことか。
565 :
477 :2005/06/14(火) 03:22:31
すみませんが自己解決したっぽいので報告しておきます。 HTHEME hTheme = OpenThemeData(hWnd, "REBAR"); if ( hTheme != NULL) { DrawThemeBackground(hTheme, hDC, 0, 0, pRect, NULL); } ってな感じのコードで描画することが出来ました。 0とかあのリスト見たら指定しちゃいけないっぽい感じがするよ…。 何はともあれやりたいことは実現できちゃったということで。 レスいただいた方ありがとうございました。
>>563 知らなかったー。役に立つ情報さんくす。
>>563 グローバルフック中、Postしたメッセージが
再度フックにかからない理由がようやく分かった気がする
俺からもd
>>548 寝てる間に遅レスになってしまったが
何らかの方法で出来ることが分かった
Thinks
使ってみたけど、ファイルを掴んでる プロセスを殺さないと削除できないのね。 でも、ヒントになったよ。
質問ですが タブコントロールでマルチライン表示をした場合ですが、 複数行あるタブの下側にタブ別のウィンドウを表示させますが、 その複数行の一番下の行の位置を得るにはどうすればいいのでしょうか? 今までシングルラインでタブを作ってまして、 タブごとのウィンドウを表示させるにはシングルライン(一行)の後なので、必ず決まった位置になるので ウィンドウ表示もできますが、 マルチラインタブの場合、動的に複数行になることもあるので、 一番下の行の位置がどこになるのかがわからないので、どのように調べればいいのか教えていただきたいのですが。
>>570 TCM_ADJUSTRECT。きめうちだと、タブ下側とかにつけたとき困るだろ。
572 :
540 :2005/06/14(火) 18:40:50
>>549 特に別のWindowをSW_HIDEなどはしていません。
全てのソースを晒すってのもありですか?
最新のPSDKをインストールしてみたら、WinMainがこんな風に説明されているんだけど……。 int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); なんで__stdcallついてないんだろう。
>>573 俺はPSDKでは呼び出し規約は省略されているのが当たり前だと思っていたけど。
>>569 548のページにはハンドルだけ閉じる機能があるって書いてるけどできないの?
576 :
デフォルトの名無しさん :2005/06/14(火) 21:22:40
異なるプライオリティをもつ2つの(レディな)スレッドがあるとします。 プライオリティが高い方をスレッドA、低いほうをスレッドBとします。このとき、 1. B は A よりプライオリティが低いのでプロセッサタイムを全くもらえない。 2. B は A よりプライオリティが低いので A と比べて少しのプロセッサタイム しかもらえない。 どちらが正しいのでしょうか。
>>576 Aが処理している間は一切Bには時間は与えられない。
AがヘヴィループをまわしているならBは動かないし
IO待ちなんかでAが寝ればその間(だけ)Bが動く。
Aが起きたらその瞬間Bは止まる。
リアルタイム優先度クラスのスレッドを作ると簡単にシステムをロックできるんだったな lazy writeのスレッドとかも動けないからデータあぼーん これもAdvanced Windowsに出てたような
580 :
デフォルトの名無しさん :2005/06/14(火) 22:18:34
>>577 >>578 ありがとうございます。間違った先入観をもっていたので、スケジューリングが理解
できずにいました。ちょうど
>>577 のリンク先のドキュメントを読んでいたところです。
581 :
デフォルトの名無しさん :2005/06/14(火) 22:45:54
PostMessageで画面を再描画しているのですが、再描画するまえに次のPostMessageが 呼ばれたら処理がおもくなってしまいます。メッセージキューを削除みたいなことは可能でしょうか?
>>581 よくわからんがSendMessageにしたらだめ?
>>581 PeekMessageでPM_REMOVEを指定
WM_PAINT(とWM_TIMERとWM_QUIT)は ほかのメッセージが空になるまで アプリケーションキューの中にあって、 しかも複数きたら、ひとつにまとめる、 と、PSDKの付属文書に書いてあり、てすと >メッセージキューを削除みたいな PeekMessage()の最後の引数がなんかそんなみたいな
UpdateWindow()はWM_PAINTがメッセージキューに溜まっていたら即座にSendすると書かれている。
せんせい、 アプリケーションキューをバイパスして直接hWndのWndProcにおくる、 とかいてあります
...すると、GetMessage()でWM_PAINTをフィルタすると WndProcにはとどかないのでせうか? すいません、もうねます。
いやむしろ キューにたまってるWM_PAINTを出して UpdateなリージョンをSendMessage()の出した WM_PAINTのとmergeして、 おくる、 ということなのか、と おもいますたほんとにねます
WM_PAINTはユーザが直接Sned/Postしてはいけないものだぞ。 ユーザーから出したいときにはInvalidateRect/Rgn
>>578 Windowsの場合はAが処理中であっても、Bも動くよ。
あまりにもCPU時間が与えられていないスレッドに対しても
動的なブーストがかかる。
>>581 PostMessageで良いんなら、InvalidateRect でも構わんのじゃないか?
>>591 ああ、そのへんもAdvanced Windowsに書いてあったなあ。
for(;;) printf("%d", c++); で普通と低で試してみたら低の方は数秒に一度1,2回カウンタが上がるな。 一応終了できるようにメッセージループを回してあげようって事なのか。
お前ら大して英語読めないくせに生意気に本家へのリンク貼るのやめろよ
597 :
デフォルトの名無しさん :2005/06/15(水) 10:17:58
ファイルを新規作成されたときや 削除されたときに出るメッセージってありますか?
微妙に違うけどIShellChangeNotifyとか
FindFirstChangeNotification
>>597 ReadDirectoryChangesW()
601 :
597 :2005/06/15(水) 12:52:05
FindFirstChangeNotification ReadDirectoryChangesW() こういうのは知ってますが さる事情で使えないので もしメッセージが出てるなら それを横取りしたいのですが
サル地蔵
>>601 どの程度ちゃんととれるのか知らないけど
SHChangeNotifyRegister
メッセージって?
OSはみんなこれから自分が作るアプリに都合がいい仕様になってるのさ
さる事情:能力がサル以下なので。 それはそうと、IRPはメッセージと言ってもよくね?
>>606 メッセージっぽいと言って言えないこともないとは思うけど、
デバドラはさすがにスレ違いな希ガス。
でも、ファイル単位で変更通知あげてくれるフィルタドライバなんてあったら便利そうね。
609 :
デフォルトの名無しさん :2005/06/15(水) 19:50:27
タブを下に表示させるのには どうしたらよいのでしょうか
TCS_
611 :
576 :2005/06/15(水) 22:01:54
>>591 >>書いてないですが、576の質問の中の「プライオリティ」はブースト後
のプライオリティ(ダイナミックプライオリティ)です。
それでもスレッドBはプロセッサタイムを(ほんの少しでも)もらえますか?
613 :
576 :2005/06/15(水) 22:24:44
>>612 この実験では、次の(A)なのか(B)なのか分かりません。
(A) プライオリティが低い方のスレッドにブーストがかかってそのスレッドの
プライオリティが高くなり、そのためそのスレッドが実行された。
(B) プライオリティが低いほうのスレッドが低いまま実行された。
「(B)みたいなことがありえるのか?」が質問です。つまり「プライオリティ」
の根本的な意味が知りたいのです。
リッチエディット2.0でEM_AUTOURLDETECTを使ってURLを 検出しているんですけど、リッチエディットの背景を黒色に していると、URLの文字も黒くなって見えなくなってしまいます。 これの対処方法ってないでしょうか? ぐぐってみたところ、同様の問題の報告は見つかりましたが 対処法はみつかりませんでした。
>>613 Aだといっても納得しないんだろうな・・・
シリアル通信のCreateFileのフックについて質問です。 現状、シリアル通信のCreateFileをフックするアプリケーションを作成しています。 C++で作成したWindowsAPIのCreateFileを行うテストプログラムは、 フックできています。 そこで、質問なのですが、VBで作成した 通信制御用ActiveXのMSCommでのPortOpenを行うプログラムを フックさせたいのですが、上手くいきません。 ActiveXも最終的には、WindowsAPIをコールしているのかなと思って、 いたのですが、全くフックできず、途方にくれています。 そもそも前提であるWindowsAPIをコールしていると思っている、 発想が間違えているのでしょうか?
CreateFileをフックする? どういうことだろ・・・メッセージは何だろう・・・
へたれ発見
>>617 OpenFileとかCOMポートを開きうる命令は他にもある。
>>618 API HOOKでぐぐってみ?
ども。へたれです。SetWindowHookExとかサブクラス化などをイメージしてしまいました。 ぐぐりました。とても勉強になりました。620さんありがとう。 フックっつーかハックのような感じですね スレ汚しすまん
いいえホックです
はいジャックです
>>596 そもそもリファレンス以外は翻訳がないわけだが
>>623 Q. スティックですか?
A. いいえステッキです
素敵なステッキ
すいませんが質問させてください スレ違いなら誘導おねがいしますm(__)m OleLoadPictureを使って読み込んだGIFファイルを ウィンドウに表示しようとしたのですが、GIF画像の タテヨコのサイズによっては画像が一部ズレて表示されます。 例えば240x240のgif画像なら正しく表示されるのに238x240だと少しズレます。 こういうものなのでしょうか? 具体的にはIPictureを使って以下のようにしています OLE_XSIZE_HIMETRIC stWidth; OLE_YSIZE_HIMETRIC stHeight; iPicture->get_Width( &stWidth ); iPicture->get_Height( &stHeight ); HDC hdc = GetDC( hWnd ); long w = MulDiv( stWidth, GetDeviceCaps( hdc, LOGPIXELSX ), 2540 ); long h = MulDiv( stHeight, GetDeviceCaps( hdc, LOGPIXELSY ), 2540 ); iPicture->Render( hdc, 0, 0, w, h, 0, stHeight, stWidth, -stHeight, NULL ); ネット上に落ちているプログラムも上記となんら変りないので ちっとも原因が分かりません。 ご存知の方、ご教授お願いします。
>>628 GIFを使おうとしたことが無いんでよくわからんが、
1ラインの総バイト数が4の倍数になるようにパディングがしてあったりしないか?
BMPはばっちりされてるんだが、GIFはどうなんだろか
631 :
630 :2005/06/16(木) 05:32:02
直接操作してるわけじゃないから関係ねぇな・・・スルーしてくれ・・・
634 :
614 :2005/06/16(木) 10:48:58
もう少し詳しく調べてみました。 リッチエディットコントロールの背景色をRGB(27,27,27)では大丈夫なのですが RGB(26,26,26)にした途端に、リンクの色が黒になってしまいました。 また、RGB(26,27,27)は大丈夫で、RGB(26,26,27)は駄目でした。 青成分を0に固定した場合はRGB(40,40,0)まで問題なく、RGB(39,40,0)で黒く なりました。 コントロールの背景色ではなく、部分的に文字列の背景色だけを設定した場合も 同様の現象が起こっています。 この件に関して、対処法などの情報があれば教えてください。
>>634 背景を余り暗くしない(R+G+B>=80)か、リンク文字色も自分で設定するしかないんでね?
>>628 DC側を SetMapMode で MM_HIMETRIC にして、w と h を使わずに
HIMETRIC のままでサイズ指定するとどうなりますか?
今まで、ダイアログやメッセージボックスを普通に使っていたのですが、いきなり ダイアログやメッセージボックスがなぜか表示できなくなりました。 しかし、不思議なことにAltキーを押すと表示されます。 ダイアログボックスやメッセージボックスが表示されない以外におかしい所はありません。 もしわかる人がいたら教えてください。
こんにちは 質問ですが、 VC++6でアプリケーションを作ると、Windows2000風なGUIデザインになりますが、 その際、.exeがあるフォルダにマニフェストファイルを入れれば、XPスタイルになりますが、 そのマニフェストファイルを入れなくても、.exeだけでXPスタイルになる方法はありますか?
>>638 最後の行だけで十分な質問だな
リソースとしてマニフェストやらをもたせるとよいぞ
>>638 CreateToolbarEx で作成した ToolBar は XPスタイル(Luna)にすると
ボタンの上で マウスの 左右の 両方のボタンをおすとハングしてしまうので
サブクラス化して、右クリックを無効にしましょう!
さくらエディタ、FFFTP でハングを体験してください。
デバッグでアプリケーションを起動し、アプリケーションを終了させると、次のメッセージがVC++上で出ます。 Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application. スレッド 0xC0C 終了、終了コード 0 (0x0)。 とエラーが出た場合、何に問題があるのでしょうか。 特定するのが難しいです。 一応、表面上はアプリケーションは正常終了しているようですが。
Win32アプリケーションとしてプロジェクトを作ったのですが、 MFCを使いたくなりました。 その場合は、ソースコードに何を追加すればいいのでしょうか。
>>642 そのメッセージの通りなんだが。
つかスレ違い。
m_hWnd=CreateWindowEx( WS_EX_CLIENTEDGE, "RICHEDIT", "", WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE | WS_VSCROLL|WS_HSCROLL|ES_AUTOVSCROLL|ES_AUTOHSCROLL, 0,0,0,0, hParentWnd, (HMENU)10012, hInst, NULL); ウィンドウを作る時に固有のID値を渡しますが、 ウィンドウ作成後にそのIDを変える方法を教えていただきたいのですが、 よろしくお願いいたします。
SetWindowLong
SetWindowLongPtr
649 :
617 :2005/06/16(木) 23:11:33
>>620 さん
レスありがとうございます。
Openfileも試してみましたが、ダメでした。
もう少しAPI関係の書籍などにあたってみようと思います。
_lcreatというのもあるぞ
>>649 デペンデンシーヲーカーとかで調べるとか
652 :
デフォルトの名無しさん :2005/06/17(金) 09:08:08
>>651 なにそれ?
東京ウォーカーみたいなもんか?
dipends.exe 持ってないの??
GetProp(hWnd,_T("MYCLASS")); の_T(" ")はL" "と同じくワイド文字を扱うということでよろしいのでしょうか?
>>655 _UNICODE が定義されてればL" "、されてなければ " "
657 :
デフォルトの名無しさん :2005/06/17(金) 15:07:47
フロッピィの実物のディスクの出たり入ったりを 動的に知る方法はありますか?
,、__,、 ( ・∀・) フポッピー! (、っiョc) ゙'ー'゙ー'゙ ┃┃ ┃┃ ┃┃ フポッピー!! / \ (( )) / \ \ (( )) / \(( )) /
660 :
デフォルトの名無しさん :2005/06/17(金) 15:27:26
スレ違い的な質問すいません。 実行プログラムの名前変更はどうやればいいのでしょうか? とあるネトゲで実行プログラム一覧が表示されているみたく、 名前を変更したいのですが・・・ どうかよろしくお願いします。
SetWindowText
すいません。 ウィンドウのサイズを右下のつまみで変更するとウィンドウサイズが変わりますが、 その変更の際、WM_PAINTが呼ばれ再描画がされますが、 ちらつきが激しく、見た目が汚くなります。 おそらく、バックグランドカラーで一旦クライアント領域を消去してから、再描画をしているからちらつくのだと思いますが、 そのちらつきをなくす方法を教えていただきたいのですが。 よろしくお願いいたします。
ウィンドウにBUTTONを貼り付けたんだけども、 WM_PAINTでBUTTONの部分がちらつきます。 BUTTONがある部分の再描画処理をしないようにするにはどうすればいいのでしょうか。
WS_CLIPCHILDREN
日記 某月某日晴 題 エディット・コントロール ちょっとややこしめの引数で コントロールをCreateWindowしたあと 親WndProcでやることは WM_SIZEでクライアント領域を コントロールウインドウにぜんぶ割り当てて WM_SETFOCUSでインプットフォーカスを コントロールウインドウにぜんぶ割り当てて WM_COMMANDでエラーをtrapして MessageBoxで"エラー"とか表示するだけなので ...こんなでできるのね という感想 しかしたぶんこれは極端な例なのだろう 日記終
スレ違いなら、誘導お願いします。 今、StartServiceを使ってローカルサービスを 起動するプログラムを作っているのですが、 2つの問題があります。 ・サービス制御マネージャ(以下、SCM)がロックされていると エラーになる ・StartServiceを発行する際にSCMがロックされ、 そのタイミングで他のサービスが起動しようとすると、 そのサービスが起動できず、エラーになる 一点目については、QueryServiceStatusなどを 使って待ち合わせることで解決可能ですが、 二点目について解決できません。 ただし、ATLで当該サービスをラップする サービスアプリケーションを 作るというのは、運用上できません。 この状況で、以下の解決策を考えたのですが、 実験した結果そうだ、というだけで裏付けがないので どこかにソースがあればご教授いただきたいのですが。 LockServiceDatabaseでSCMをロックしているときに DOSコマンドのNET STARTを発行すると、 なぜかエラーになりません。 この方法で上記の2点を解決できるでしょうか。
簡単な質問かもしれませんが、 ウィンドウのサイズを固定する方法を教えてください
>>669 WM_SIZINGをとらまえて、LPARAMとして渡されてくるRECT構造体を
修正すれば、そのサイズになるよ。
サイズ変更可能でないスタイルにする。
>>669 マウスでドラッグしてウインドウサイズを変更されたくないなら、
ウインドウスタイルにWS_THICKFRAMEを指定しない。
これだけだとシステムの最大化ボタンが有効なままだから、
WS_MAXIMIZEBOXも指定しない。
でもこれだけだと、外部からメッセージ投げられたときとか、ウインドウサイズが変わってしまうんだよね。
というわけで、WM_GETMINMAXINFOを処理する。
>>657 フロッピドライブにアクセスできなかったら入ってない
フロッピドライブにアクセスできたら入ってる
カリカリうるさいかもしれないが、これでいいじゃないか。
というより実際FDの場合そうするしかない。
PC98時代、有名なファイラーでそういう機能を持ったやつがあったけど。 filmtn だったか、HF だったか・・・ FDじゃなかったような木がする。
X68kではフロッピーをプログラム側から自動排出できたぜ 5インチ最高
677 :
デフォルトの名無しさん :2005/06/18(土) 03:05:08
ATL難しいっていうかデザインが悪いと思う。 みんな頭悪いと思われたくないから言わんだけちゃうか。
>>677 ATL使うこなすために必要な周辺知識が多すぎなだけ。
低レベルすぎて、本当にCOMの全てを理解していないと使いこなせないのよ。
ウィンドウを全画面表示にするにはどうすればいいでしょうか?
おはようございます。
質問があるのですが、
ウィンドウにリバーコントロールを貼り付けたまではいいのですが、
ウィンドウサイズをウィンドウの端をクリックドラッグすることで変える最中に、
リバーのつまみとタイトル文字列の部分が「ちらつく」現象がでてしまいます。
どうしてこうなるのかがわかりません。
リバーのつまみとテストボタンという文字列の部分がちらつく
http://www.geocities.jp/ts_d285/rebar.JPG ご存知な方がいらっしゃいましたら、教えていただきたいのですが。
よろしくお願い致します。
682 :
681 :2005/06/18(土) 10:37:02
インターネットエクスプローラも同じリバーコントロールを貼り付けていますが、 ウィンドウサイズ変更中にちらつく現象はまったく見受けられません。
>>681 テーマがクラシックスタイルだったらちらつかない とかあるかも(適当
684 :
デフォルトの名無しさん :2005/06/18(土) 11:25:30
SendMessage()でWM_CLOSEを送るとメモ帳や電卓は閉じることができたのですが、エクスプローラやIEは閉じることができませんでした。 PostMessage()ならどちらも閉じることができました。これはどうしてなのでしょうか?
686 :
681 :2005/06/18(土) 12:11:33
>>685 WM_ERASEBKGNDは親ウィンドウのプロシージャに分岐させてます。
土日をかけて、この問題を解決しようと思ってます。
もちろん私の不手際もあるでしょうから。
何かご存知な方がいらっしゃいましたら、教えていただけると助かります。
よろしくお願いします。
687 :
681 :2005/06/18(土) 12:17:52
リバーとかボタンとかコントロールはCreateWindowExをする際、決められたクラス名を登録するので、 それ専用のウィンドウプロシージャは設定しませんが、 今リバーにウィンドウプロシージャを設定したら、::SetWindowLong(m_hWnd,GWL_WNDPROC,(long)wndProc); リバーそのものを描画してくれなくなりました。 コントロールの描画はWindows側でしているのは当然ですが、 その描画はどこでどのイベントで処理してるのでしょうか? たぶん、リバーのWM_ERASEBKGNDを処理しないようにすれば、 ちらつきはなくなると思うのですが。
>>687 いや、WM_ERASEBKGNDはレバーの親ウィンドウで処理しなきゃだめ。
FALSEを返せば背景を消去しなくなるんでちらつきはなくなるはず。
689 :
681 :2005/06/18(土) 12:27:59
>>688 case WM_ERASEBKGND:
return false;
親側でそのようにしてみましたが
まだちらつきます。
いろいろ試して見たいと思います。
691 :
681 :2005/06/18(土) 12:33:29
クラシックスタイルでもちらつきました。
SPYでメッセージ見てみた? まあ、ちらつくっつーかWM_NCPAINT飛び交いまくり、システムが更新しまくりだったら 当然っちゃあ当然なのだろう。嫌ならシステムに渡す前に一時的にリージョンから テキスト部分除くなりなんなりすればよいかもナー
↑とか適当なこと言っちゃったけどアレか サイズ変更の時だけな
>>681 CS_VREDRAW CS_HREDRAWを取る
WM_ERASEBKGND で返すべきは nonzero じゃなかったっけ?
ダイアログボックスにパスワード入力領域を持たせたいのですがどのようにすればわかりません。 どんなコントロールを使用するのでしょうか?
今は普通にエディットコントロールを持たせてるのですが、 入力した文字列を*や黒丸にするようなコントロールはありませんか?
エディットコントロール
>>698 エディットコントロールのプロパティにそうするのがある。
どんなプロパティですか?
ウィンドウスタイルだろ
見つけました、ES_PASSWORDですね
現在ThemeAPIを使ってテキストを描画しようと思っています。
DrawThemeTextを使えばテーマに使用されている効果を使って
描画してくれるようなのですが、そのまま使うとフォントも色もテー
マのものと異なってしまいます。
http://www.microsoft.com/japan/msdn/windows/windowsxp/xptheming.asp によるとデバイスコンテキストに任意のフォントを追加して呼び出す
ように書いてあったので、GetThemeFontを使いCreateFontIndirect
でフォントを作成、SelectObjectでデバイスコンテキストに割り当てて
みたのですが一向に変化する様子がありません。
たとえばLunaのキャプション文字列はMSUIゴシックに白文字、ボールド
ですが、これと同じようにテキストを描画するには上記の方法で間違って
いるのでしょうか。
よろしくお願いします。
Macアドレス取れねぇ!と思ったらLANケーブルが抜けていた。 NetBiosだめじゃーん。 いや、ただの雑談です。
ぬるぽしか返ってこない LANケーブルがぬけているのだろうか if ((hResource = LoadResource(hInst, FindResource(hInst, TEXT("HAGE"), MAKEINTRESOURCE(IDR_HANGE100)))) == NULL) { MessageBox(NULL, TEXT("ぬるぽ"), TEXT("ぬるぽ"), MB_ICONERROR); PostQuitMessage(0); return 0; }
MacアドレスとLANケーブルは何も関係ないとおもうんだが。 リモートのMacアドレスが欲しいのか?
いや、オレも関係ないと思ってたんだけどね。 ケーブル抜いてPC起動するとNetBios系のAPIが全滅なんだよね。 個体差かなぁ。一応、他のPCでもやってみるか。 GetAdaptersInfo()で代用したからいいんだけど。
自分のだろ。 ネットワークケーブル抜けてたら、自分のそういう情報も取得できないような 話は聞いたことある気がする
ボタンやコンボボックスのような描画はWindowsが処理しますが、 そのような描画をAPIから呼ぶことはできるのでしょうか。
ボタンならDrawFrameControlで描ける
713 :
681 :2005/06/18(土) 19:53:04
原因がわかりました。 リバーを作ると通常はクライアント領域がリバーの下側にオフセットされますが、 何故か知りませんが、リバーを作ってもクライアント領域がリバーの下側に移らず、 リバーとクライアント領域が被さった状態なのでちらつくといったものだと思います。 ただ、なぜリバーを作ってもクライアント領域の範囲が変わらないのか? もう少し調べてみたいと思います。
714 :
681 :2005/06/18(土) 20:34:54
リバーの部分はWM_PAINTで計算して、その部分は描画しないようにしないといけないんですね。。。
WS_CLIPCHILDRENを付ければいいだけだったりして
>>713 え?
レバー(ツールバーやステータスバーも)つけたときは自分でクライアント領域再計算だろ。普通。
それをやって無かったってこと?
レバーとリバーどっちやねん
プログラム実行時に特定のAPIが実行環境において サポートされているか、調べる方法ってあるんでしょうか? あと、サポートされていないAPIを呼び出した場合は、 例外が生成されるんですか?
>>717 レバーは猫書いた奴の間違いとそれを鵜呑みにしたヴァカ
720 :
681 :2005/06/18(土) 21:31:52
どうもうまくいきませんね ウィンドウスタイルの設定が繊細すぎる
>>718 1. LoadLibraryに失敗→その関数をエクスポートしているDLL自体ない
2. GetProcAddressに失敗→関数がエクスポートされていない
3. 呼び出してみたらERROR_CALL_NOT_IMPLEMENTEDで失敗→実装されていない
/DELAYLOAD付きでリンクすると1.と2.は省略できる。その場合関数がない環境で
呼び出そうとすると例外が発生する
722 :
718 :2005/06/18(土) 21:37:58
723 :
704 :2005/06/18(土) 21:42:09
ThemeAPI関連やってる人ってもしかして(しなくても)少ない? それとも場違いな質問しちゃったんだろうか…(汗
>>723 なんだテメー新手の煽りかコラ
手っ取り早く部分的にどのタイミングで描いてるかソース晒せ
725 :
704 :2005/06/18(土) 23:37:10
煽りじゃないです、そうとられたならすいません。
WM_CREATEでテーマハンドルを
HTHEME hTheme = OpenThemeData(hWnd, "Window");
にて取得しておき(エラーチェック諸々は済んでいます)
WM_PAINTにて
PAINTSTRUCT paint;
HDC hDC = BeginPaint(hWnd, &paint);
RECT rect;
GetClientRect(hWnd, &rect);
DrawThemeText(hTheme, WP_CAPTION, CS_ACTIVE,
L"test", -1,
DT_CENTER | DT_VCENTER | DT_SiNGLELINE, NULL,
&rect);
EndPaint(hWnd, &paint);
というこれだけのプログラムです。
http://www.ascii.co.jp/pb/msdn/article/f21_0041.html#fig0007 に記載されているMSDNマガジンのサンプルコードと大差ないと
思っていますが…。
726 :
704 :2005/06/18(土) 23:39:38
727 :
704 :2005/06/19(日) 03:33:02
CS_SAVEBITS を指定してpoppメニューには効いているんだけど、ダイアログには効かないで 毎回再描画してしまうんですが。。。。 ダイアログの生成方法に何か指定があるのでしょうか? モーダル、モーダレス どっちも効かないんですけど。。。
そんなに再描画サボりたいならレイヤードウィンドウにしろ
>>728 たしかCS_SAVEBITSはポップアップウィンドウのみ。
731 :
デフォルトの名無しさん :2005/06/19(日) 13:59:53
おしえてください ディスプレイキャプチャしたいのですが GetDC,CreadDC("Display" では、IMEバー、ポップアップのレイヤー等を 拾ってくれません。 なにかよい方法はあるのでしょうか?
画面にあるものはのGetDC(NULL), CreateDC("DISPLAY"...で捕れます。 (動画とマウスカーソル以外) キャプチャー操作の瞬間に消えてるような。 ためしにタイマーとかで捕ってみては?
_______________ | _____________ | | |:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::| | | |:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::| | ザー | |:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::| | | |::::::::::::::::::::::::::::::::::::;;;;;;;;;;;::::::::::::::| | | |:::::::::::/ ̄ ̄ ̄`´ `ヽ:::::::| | | |::::::::::| :ill||||||||||ll: ,-‐‐、l::::::| | |  ̄ ̄| ||||||||||||||||「しi .l ll ̄ .| | ̄「 ̄| |||||||||||||||||i ̄川リ ̄| ̄| |_| ノ |||||||||||||||||| |_| / |||||||||||||||||| / /|||||||||||||||||| / ̄/ ̄ ||||||||||||||||| / / |l|l|l|l|l|l|l|l / / |l|l|l|l|l|l|ll / ヘJ l|l|l|l|l|l|l ノ川 ||l||l||ll 【呪いのコピペ】 このレスを見た人は1週間以内に他のスレへコピペしてください。 そうしないと突然ディスプレイからうわなんだおまえやめ
>>730 ダイアログも最初に出た位置のママ閉じると WM_PAINT は来ないで
勝手に戻ってくれるのですが。。ダイアログを移動すると WM_PAINT が来てしまいます。
ダイアログが出た1回目だけっていう仕様なのでしょうか?
CS_SAVEBITS 自体Win 3.1 の頃の仕様で、今時の Windows では画面上の動きが違うので
移動したらもうダメなのかな?
735 :
734 :2005/06/19(日) 16:25:40
すいません。 win32APIでブロック崩しをつくる為に不可欠な関数を教えてください。
>>731 IMEを半透明化していませんか?
だったらCAPTUREBLT
>>736 コンソールプログラムにすればコンソールAPIが要るし、
ウィンドウに出力するのならGDIかGDI+、もちろん基本的なウィンドウの作成もできる必要がある。
それぞれさらにさまざまなアプローチがあるのでブロック崩しには〜が絶対に必要と言えるようなものはない。
704がスルーされまくっててワロスwww まあ俺もわからないわけだがな。
741 :
705 :2005/06/19(日) 22:19:12
>>740 =704
ごめんよ、でもその質問の仕方じゃレスつかないと思うよ。
失せろバカ
俺も昔サンプルコード動かしたがうまくいかなかったので 力になってやりたいが無理なんだよな。 誰かわかるやつ助けてやってくれ。
おまえら自演もたいがいにしろよ
体内ならいいんですか?
SystemParametersInfoで取得できるフォントはテーマと関係ないのか? よくわからんが言ってみただけ
GetSystemParametersInfoFont GetSystemParametersInfoThema
748 :
736 :2005/06/20(月) 10:59:59
基本的なウインドウ作製はできたので、次は玉を作りたいんですけど 例えば @ SetPixelV関数で打った点を 玉に見立てる @´玉の絵を書いたビットマップを使う だったら、この後の処理はどうなるでしょうか? この経路で作ったとしたら、どんな関数が挙げられますか? 手元には、猫でもわかるwindowsプログラミングとmsdnライブラリがあります
>>749 別につまづいてないと思うけど
まぁ自分が苦労と時間費やして調べたことをワンレスで解決されたら
おもしろくないわなw
752 :
704 :2005/06/20(月) 16:25:52
>>741 別に705さんのせいとか思ってませんよ、ホントに。
質問の仕方が悪かったですか…どうも申し訳ありませんでした。
>>746 テーマのフォントはGetThemeFont(もしくはGetThemeSystemFont)で
取得できることは突き止めました(
>>727 )。
>>747 PlatformSDKにはご指摘の関数は見つけられませんでした。
もう少し掘り下げて調べてきます。ありがとうございます。
目的
Themeのフォント、色、効果を使ってテキストを描画したい。
(DrawThemeTextが該当すると思われる)
問題点
DrawThemeTextをMSDNのSample通りに記述しても期待した
目的の動作を行わない。
1.フォントの取得 -> GetThemeFontで解決
2.色の取得 -> おそらくGetThemeColorだが必要なのか?
3.DrawThemeTextで描画するとフォントのサイズ、色が一致しない
ということなのですが…、スレ違いとかアドバイス等ご指摘がありまし
たら少しご教授して頂きたかっただけです。申し訳ありませんでした。
iniの操作をしたいんだけどどうしたらいいの?
GetPrivateProfile○○ WritePrivateProfile○○
>>753 iniファイルのことなら{Get|Write}PrivateProfile*()
背景が透明な文字を表示したいのですが、 どうすればいいでしょうか?
SetBkMode
>759-760 dクス
>>752 もうあきらめろ、ここにはおまえの質問に答えれるやついないぞ。
おまえもそこまでやって無理なら別のアプローチを考えるかMSに
聞くしかないだろ。
×答えれる ○答えられる
巣に帰れ
>>764 今時「ら抜き言葉」に目くじら立てるなんて。
年がばれますよ。
ジオボタンにベルを付けたときのメッセージハンドについて教えてください。
二十歳前だけど答えれるはさすがに無いな
自分が使っているWindowsXP SP2を対象OSとします 文字コードは内部ではUNICODEを使っているそうですが、 ファイル名やディレクトリ名、クリップボード、main()のargv、 標準入力や標準出力などをプログラムで得ると、 UNICODEで得られるのでしょうか? 2バイト目に¥があって云々という話は 9x 系だけでしょうか?
>>771 プログラム側もUNICODEに対応していないといけない。
NT系は何でもUNICODEが使えるが、9x系ではAPIにほとんどUNICODEが使えないから。
そこでUNICODEが#defineで定義されているかどうかで切り替える仕組みがあってコンパイル時にどうするかを決められるようになっている。
クリップボードはUNICODE切り替えとは無関係にCF_UNICODETEXTを指定すればいい。UNICODEテキストじゃなくても勝手に変換してくれる。
標準入出力はAPIでやればUNICODEで入ってくる。ほかにもC/C++のワイド文字入出力も使える。
ただしこっちはMBCSで読み込んでからUNICODEに変換するという風になっているので9xでも使える。
さぁね 俺は知らんが、デバッグモードで実際にAPIでも使ってファイル名取得して実データ見てみりゃ判るだろ
>>771 別に9xでも一旦Unicodeに変換して作業して、終わったらMBCSに戻せばいいだけだよ。
>>770 心でそう呟きながらコーディングしてますが何か?
結局誰も704にアドバイスしてやれないんだろ(俺も含めて) それを指摘されたからってら抜き表現がどうとか 揚げ足取りして話しを逸らそうとするのはちょっと 格好悪いと思った。
↓華麗にスルー
>>704 にレスしたいのだが、残念ながらWin2Kなのであります
同じく
残念ながらMacなのであります
デバイスコンテキストハンドルからウィンドウハンドルを取得する関数ってありますか?
子ウィンドウにリバーをつけることはできますか?
784 :
デフォルトの名無しさん :2005/06/21(火) 20:11:07
プログラムからセーフモードで起動する方法はないでしょうか。 msconfig などをみるとオプションがあるので、APIなどからできないものかと思った次第です。 InitiateSystemShutdown() や ExitWindows() などではオプションもなく、何か方法がないものでしょうか。ターゲットはWindows XPです。
boot.ini書き換えればイヤでもそうなるけど、あんまりいい方法じゃ無いよな。
>>774 それを自動的にやってくれるライブラリ(MSLU)もあるし
率直に申し上げて、ウィンドウを固定する方法を教えてください。 お願いします。
>>787 ウィンドウスタイルにWS_THICKFRAMEやWS_SIZEBOX、そしてWS_MINIMIZEBOXとWS_MAXIMIZEBOXを指定しないことから。
そしてWM_GETMINMAXINFOを処理する。位置も動かしたくなければWM_MOVINGも処理する。
789 :
771 :2005/06/21(火) 22:19:45
UNICODEが定義されているか否かで、たとえば
TCHAR
TEXT()
LoadAccelerators()
などが適切に切り替わる
>>772 にあるように、プログラムがWindowsから
どのように文字コードを受け取るかは
APIで決まる(UNICODEで切り替わる)
ここらへんまではわかったのですが、
リソースファイルやリソースコンパイラは
どうふるまうのでしょうか?
Makefileでは
リソースコンパイラには特にオプションなし
C++コンパイラには -DUNICODE
SJISコードのリソースファイルでは
acc ACCELERATORS DISCARDABLE
{
VK_ESCAPE, 100, VIRTKEY, NOINVERT
}
ソースファイルでは
LoadAcceleraors(hInst, TEXT("acc"))
こうやってmakeしましたが、とりあずうまくいっているっぽいです
リソースコンパイラはUNICODEでリソースを生成するのでしょうか?
そう。リソースはWin9xでも常にUnicode
>>788 わざわざご丁寧に位置の固定までありがとうございます。
>>789 リソースはUnicodeなのだがLoadAcceleratorsの引数はTCHARで切り替わるようになっているのに注意。
>>789 本筋とは関係ないが、正確に言えばUNICODEでAPIが、
_UNICODEでTEXTマクロ類が切り替わる
>>794 UNICODEでTEXTが
_UNICODEで_TEXTマクロが切り替わるみたいだけど。
前者はWindows API用で(TEXTマクロも)後者はVC++ランタイム用
ということに(とても厳密に言えば)なるんだけど TEXTと_TEXTを意識して使い分けてる人いますか?
_Tってマクロもあるね なんかこんがらがってきた
普通はみんな_T()使ってんじゃないの。みじかいし。
_Tも_TEXTもTEXTも使ってねぇ
WinMainで メッセージループの手前で終わるときは、 0で終了するべき、 というのが、ちょっと if (error) return EXIT_SUCCESS; うーん
GetLastErrorについて教えてください。 マルチスレッドの各スレッドでGetLastErrorを呼び出します。 複数のスレッドで同時にエラーが発生した場合、GetLastErrorが返す エラーコードはスレッド単位のものなのですか? それともプロセス内で発生した一番最後のエラーコードになるのですか?
MSDN引け。ちゃんと書いてある。
せっかくネタ提供してあげたのに... もう質問してあげない ぷんぷん
あ、そ、じゃサヨウナラ
>>796 こんなことをしているヘッダもあるから大丈夫。
#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
#ifdef _UNICODE
#ifndef UNICODE
#define UNICODE
#endif
#endif
指定したスレッドが使っているスタック領域の範囲を知る方法ってありますか?
使ったこと無いけどGetThreadContextとか?
>>732 ,737
IME半透明の件 ありがとうございました
解決しました
呪いの貞子で気づかず読み飛ばしていました・・・
申し訳ない
810 :
デフォルトの名無しさん :2005/06/24(金) 10:03:57
>>806 x86 32bit版Win2K以降。自プロセスならスレッドハンドルとるの楽だろうからWin98でもできるだろ。
エラー処理はてめーでやれ。ポインタとDWORD混合してるのはほっとけ。
void GetStackArea
(DWORD dwProcessID, DWORD dwThreadID, LPDWORD pdwHigh, LPDWORD pdwLow)
{
typedef HANDLE (WINAPI *OPENTHREAD)(DWORD, BOOL, DWORD);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
HANDLE hThread = OpenThread(
THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, dwThreadID);
CONTEXT ctx = { CONTEXT_SEGMENTS, 0 };
GetThreadContext(hThread, &ctx);
LDT_ENTRY ldt = { 0 };
GetThreadSelectorEntry(hThread, ctx.SegFs, &ldt);
DWORD dwTibPtr= (ldt.HighWord.Bytes.BaseHi << 24)
| (ldt.HighWord.Bytes.BaseMid << 16)
| (ldt.BaseLow) + 0x18;
DWORD dwReadBytes = 0, dwTIBAddr = 0, dwStackArea[2] = { 0, 0 };
ReadProcessMemory(hProcess, (LPBYTE)dwTibPtr,
&dwTIBAddr, sizeof dwTIBAddr, &dwReadBytes);
ReadProcessMemory(hProcess, (LPBYTE)dwTIBAddr,
dwStackArea, sizeof dwStackArea, &dwReadBytes);
CloseHandle(hThread);
CloseHandle(hProcess);
*pdwHigh = dwStackArea[0];
*pdwLow = dwStackArea[1];
}
811 :
デフォルトの名無しさん :2005/06/24(金) 10:35:28
すまん、さっきのはなしだ。こっち使ってくれ void GetStackArea (DWORD dwProcessID, DWORD dwThreadID, LPDWORD pdwBase, LPDWORD pdwLimit) { typedef HANDLE (WINAPI *OPENTHREAD)(DWORD, BOOL, DWORD); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); HANDLE hThread = OpenThread( THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, dwThreadID); CONTEXT ctx = { CONTEXT_SEGMENTS, 0 }; GetThreadContext(hThread, &ctx); LDT_ENTRY ldt = { 0 }; GetThreadSelectorEntry(hThread, ctx.SegFs, &ldt); DWORD dwTibPtr= (ldt.HighWord.Bytes.BaseHi << 24) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.BaseLow) + 0x18; DWORD dwReadBytes = 0, dwTIBAddr = 0, dwStackArea[2] = { 0, 0 }; ReadProcessMemory(hProcess, (LPBYTE)dwTibPtr, &dwTIBAddr, sizeof dwTIBAddr, &dwReadBytes); ReadProcessMemory(hProcess, (LPBYTE)(dwTIBAddr + 4), dwStackArea, sizeof dwStackArea, &dwReadBytes); CloseHandle(hThread); CloseHandle(hProcess); *pdwBase = dwStackArea[0]; *pdwLimit = dwStackArea[1]; }
812 :
デフォルトの名無しさん :2005/06/24(金) 10:41:39
あと、補足すると、コミットされた分のスタック領域しかとれないので スタックオーバーフローするリミットがどれだけか知りたい場合は VirtualQueryEx で MEM_COMMIT されつつ PAGE_NOACCESS 保護の領域探して鯉。 ここらへんはアド嫁
813 :
デフォルトの名無しさん :2005/06/24(金) 16:15:57
タブコントロールで、みんな当たり前の様に、Ctrl+TabやCtrl+PgUp/Downでタブを切り替えれてますが、あれってどうやってるんですか? 非MFCです。
プロパティシートだったりして。
C言語を使ったAPIを勉強しはじめたばっかの初心者です 内容の無い骨組みだけのWINDOWSプログラムを見て勉強しておりますが インスタンスハンドルというのが いまいち分かりません ハンドルというのはメモリアドレスのポインタなのでしょうか? それともポインタ以外でも、メモリ上の住所のような数値があるのでしょうか?
>>815 HANDLEはvoid*のtypedefだが、その内実はさまざまだ。
意味論的にはカーネルメモリなどにある何らかのオブジェクトを指し示すモノ、ということになるが、
それが実際に直接なポインタであるとは限らないし、そう仮定すべきではない。
>>815 インスタンスハンドルは実行しているEXEを識別するためのものと思えばいい。
818 :
815 :2005/06/24(金) 17:27:00
816様、レスありがとうございます 正直、意味論的 とか カーネルメモリ とか オブジェクト とか よく分からなかったのですが 色々ややこしいもので今の段階ではなんとなくこんなもんとだけ覚えて先進む事にします また質問ですが return時の TRUE と FALSE についてよく分かりません C言語を勉強していた時、return 0;で終わると正常な終了。return 0以外で終わると不正な終了 と書いて有りました。 APIを勉強していると TRUEは1 FALSEは0 と書いて有りました。 で、 return TRUE は正常な終了。 return FALSE は不正な終了っぽい文脈を見つけました。 return TRUE は正常?? TRUEは1だから return 1;と同じだから 不正??? っと混乱しております、助けていただけると助かります
819 :
815 :2005/06/24(金) 17:30:06
817様もありがとうございますm(_ _)m
>>818 return 0;が正常ってのはmain()のことじゃね?
どの値が正常で、どの値が異常かは常にMSDNで把握しろ。 型に騙されるな(w
どれが正常でどれが異常かはプログラマによって書き方が違う。 main()は0が正常だが他は0以外が正常となってる場合がほとんど。 俺の関数は0やNULLが異常、1やポインタやハンドルが正常ということにしてるけど。
COM関係のHRESULTだとS_OK==0だしな まぁ、BOOLとかboolでTRUE/trueが失敗って言われたら蹴るが。
IsFaultみたいなメソッドならTRUEで失敗なんだが。
GetMessageみたいな関数もあるしなぁ
なんにしろ固定観念にとらわれる人はプログラマ向いてないね。
827 :
815 :2005/06/24(金) 18:07:24
皆様ありがとうございます、とても助かりました また質問させてください BOOL型についてよく分かりません GetMessage関数の際、GetMessage関数の戻り値がBOOL型になっております BOOL型とは0か1の型だと思うのですが GetMessage関数は関数が失敗したときに-1が返りますよね これが分かりません。 本には、win16APIの時との互換性がどうこう書いてますが そもそもBOOL型が-1を返せるということは、int,char,long等の基本データ形と違い typedefで作った形とは、後からプログラムを見やすくしたり作り直したりしやすくする ための物で、BOOL型は0か1を入れるのを推薦の形ということで -1どころか 100とかまで 実際に入れれる範囲は広めにできている物なのでしょうか? 説明下手っぽく分かりにくいですが、宜しくお願いします
BOOLの正体はint
処理系によって1バイトだったり4バイトだったりする
BOOLがintの代わりになるとしても信用性はかなり低いと思われ
BOOLに-1を入れるM$は信用に値しないということだ でも仕方がないのでGetMessageで-1の場合のエラー処理を書かざるを得ない
こんなBOOLを見た BOOL value; for(value=0;value < 100;value++){
intやDWORDをtypedefしただけのBOOL =信用性高いがわざわざそれ使う意味がない 0と1の二つを入れる上で最小限の領域だけを準備したBOOL =信用性低いがそれなりの用途に使えば速度面でメリットがある
こんばんわ ウィンドウのタイトルバーの高さを得るにはどうすればいいでしょうか? OverlappedとToolWindowでは高さが異なります。 よろしくお願いいたします。
835 :
834 :2005/06/24(金) 18:51:55
SM_CYCAPTION
>>834 AdjustWindowRectの結果から逆算とか。
>>835 ToolWindowのキャプションの高さがとれない。
SM_CYSMCAPTIONつーのは違うのか?
GetSystemMetricsを調べてこい
840 :
デフォルトの名無しさん :2005/06/25(土) 07:11:47
> DeviceIoControl()を使うのだと思いますが、 使わない。開いたらファイルのように読み書きするだけ
>>834 GetClientRectとClientToScreenとか
ワークグループに参加しているPCのIPを全部取得したいのですけど、 何かよいAPIないでしょうか?
無い
>>845 知らんけどWNetOpenEnumあたりから始めてみる?
C言語+Windows APIを使っているのですが、 最大化やウィンドウのリサイズを禁止するにはどうすればいいんでしょうか? 最小化はそのまま使えるようにしたいのですが…
>>848 CreateWindow(Ex)を呼ぶときにWS_MAXIMIZEBOXやWS_THICKFRAMEを指定しなければ良いだけ。
850 :
840 :2005/06/25(土) 22:18:16
>>841 、
>>842 、
>>843 みなさん、どうもありがとうございます。m(_ _)m
私はWin98(1st)です。無料版BCC++を使っています。
まず、最初にCreateFile()のMSDNの説明通りにドライブを開いて見ようとしましたが、エラーで開けません。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createfile.htm <<x.c>>
#include <windows.h>
#include <stdio.h>
void main(){
HANDLE hDrive;
hDrive = CreateFileA("\\.\C:", GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
printf("hDrive = %08X\n", hDrive);
if (hDrive == INVALID_HANDLE_VALUE){
printf("error\n");
exit(-1);
}
printf("normal\n");
}
NT系でないからでは、と思うのですが、MSDNの説明だと、
>Windows 95 では、上記の形式で文字列を指定すると、CreateFile 関数はエラーを返します。代わりに、次の手順に従ってください。
>dwCreationDistribution パラメータで、OPEN_EXISTING を指定しなければなりません。
>フロッピーディスクや、ハードディスクのパーティションを開く場合、dwShareMode パラメータで FILE_SHARE_WRITE フラグを指定しなければなりません。
と、開けるようなことが書いてあるのですが、これは違うのでしょうか?
851 :
840 :2005/06/25(土) 22:19:56
次に、ご紹介のRWFDのソースを流用してリードのテストをしてみました。 843さん、いいものをどうもありがとうございました。 <<main.c>> #include <windows.h> #include <stdio.h> #include "diskio.h" #define BUF_SIZE (0x200 * 8) BYTE buf[BUF_SIZE]; DWORD const nDrive = 2; // 'C:' DWORD const dwStartSector = 0; WORD const wSectors = 1; void main(){ HANDLE hVWin32; hVWin32 = OpenVWin32(); if (hVWin32 == NULL){ printf("error: OpenVWin32()\n"); exit(-1); } ABSDiskRead(hVWin32, nDrive, dwStartSector, wSectors, buf); printf("label = \"%8s\"\n", buf+3); CloseVWin32(hVWin32); } <<ビルド法>> bcc32 main.c diskio.c
852 :
840 :2005/06/25(土) 22:20:47
これは、うまくいきました。 しかし、"\\\\.\\vwin32"というのは何なのでしょうか・・・ regs.reg_EAX = 0x7305; とか、 VWIN32_DIOC_DOS_INT25 というのを見ると、これはまるっきり16ビットDOSインターフェースなのですが、この方法が一番良い方法なんでしょうか・・・? 純粋な32ビットプロテクトモード・インターフェース風な手法はないのでしょうか?
> 純粋な32ビットプロテクトモード・インターフェース風な手法はないのでしょうか?
Win9xは純粋な32ビットOSじゃないからそんなものはない。
純粋な32ビットOSであるNTにはある(
>>850 )。
>>850 Win98ということだから今回は関係ないが、"\\.\C:"じゃなくて"\\\\.\\C:"だ。
Cでは\は特別な意味を持つことに注意。
マウスでクリックしたところに円を描いて その矩形の座標を配列に記憶(複数個)。 MW_MOUSEMOVE時に、 PtInRect()で矩形の外か中かで SetCursor()を使ってマウスカーソルを 切り替えています。 円の数が増えるたびに反応が鈍くなって カーソルがちらつきます。 矩形の検索がまずいんだと思いますが いい方法はないでしょうか。
858 :
デフォルトの名無しさん :2005/06/26(日) 09:26:17
こんにちは MoveWindow(m_hWnd,0,0,772,450); RECT rect; GetClientRect(&rect); MoveWindowで幅を772とした後、GetClientRectでRECT値を取り出したところ、rect.rightが749と指定した「772」とは違う値になります。 これはどういうことなのでしょうか? MoveWindowは内部で何かしらの理由で数値を修正したりするのでしょうか? よろしくお願いいたします。
859 :
858 :2005/06/26(日) 09:27:18
GetClientRect(&rect); は GetClientRect(m_hWnd,&rect); と修正します。
>>857 配列数がどれだけかしらんが500個あったら全部に対してPtInRect呼んでるのか?
だったらリージョンにしちまえよ PtInRegionな これで一発だ (円が増えるたびにリージョン更新な
ちらつきは毎回描画してんのか?変化があったときだけ書けばよろし
>>858 スクリーン座標とクライアント座標というものがある。
基点(0,0)となる位置が異なる。この基点のズレは自分で調整しる
WM_CREATEが呼ばれる前にSetWindowLongで ウィンドウにパラメータのようなものを渡すことはできませんか?
864 :
858 :2005/06/26(日) 10:01:14
m_hWndはリッチエディットでした。 どうやらクライアント領域にはスクロールバーが含まれないため、その分「差」が生じたみたいです。 スクリーン座標から幅を得たら、スクロールバーも含まれる値が得られました。 リッチエディットにおいて、クライアント領域はエディタ部分だけということを理解してませんでした。 スクロールバーも含まれると思ってましたので。 皆さんありがとうございました。
(゚д゚)・・・・
866 :
858 :2005/06/26(日) 10:13:37
タブの中にリッチエディットを埋め込んでまして、ボーダーをドラッグすることでタブとリッチエディットがドラッグした分だけRight値とBottom値が変わるような クラス設計をしてまして、結構ややこしいですね。
>>857 2bitなり8bitのビットマップでも用意してヒット領域塗って、カーソル座標部分の色で判定すればいいんでない?
削除した場合は配列から再計算
>>863 WM_CREATEが呼ばれる前じゃ、HWNDも分からないじゃないか。
SetWindowLongを呼べるわけ無いだろ。
WM_CREATEはウィンドウが作成された時に呼ばれるのに、 それが呼ばれる前、つまりウィンドウが作成される前に何をできると思っているのか・・・
ウィンドウクラス名を知る方法を教えてください。 ツリーならWC_TREEVIEWみたいな
871 :
865 :2005/06/26(日) 11:12:39
>>870 GetWindowClassName(HWND hWnd);
872 :
870 :2005/06/26(日) 11:44:05
>>871 そのようなAPIは見当たりませんでしたが。
>>870 GetClassName(HWND hWnd, LPTSTR lpClassName, int nMaxCount);
GetClassName
875 :
857 :2005/06/26(日) 12:18:35
一番頭(親)のウィンドウハンドルをGetするAPIはあると思うのですが…。
阿呆 それはあくまで自分の親を取得するだけだ 一番頭と決まったわけではない
881 :
876 :2005/06/26(日) 15:19:56
無いようなので自作しました NULLが返るまでループを繰り返して、一番頭を得られるようになりました。 どうもです。
じゃ、GetAncestor?
EnumWindow
GetDesktopWindow()とか。
ちょっとうけた
ダイアログのボタンを押したときにメッセージボックスを出すようにしたのですが、 ボタンを押すとメッセージボックスが2回立て続けにポップアップします。 なぜこのような現象が起きるのか分かりません。どのように対処すれば良いのでしょうか? コンパイラはBCCです。
そりゃ2回出るように書いてるからだとおもうよ。
>>887 エスパーな漏れがおまいさんの悩み事を解決してやろう。
うむ、今の君に必要なのはずばり、「break」と見た!
890 :
887 :2005/06/27(月) 01:38:07
WM_COMMANDメッセージが2回送信されているようなのですが...
891 :
887 :2005/06/27(月) 02:57:42
ボタンスタイルのBS_NOTIFYが原因だったようです。 リソーススクリプトについての理解がまだ不十分なのですが、 リソーススクリプトに関する詳細な日本語のドキュメントがあれば教えて下さい。
猫プロやWisdomでも見とけ
>>869 遅レス
WM_NCCREATE は使えないか?
リッチエディットを作成したあと、SetWindowTextで文字列を設定し、ShowWindowで表示させたのですが、 リッチエディットの下側のスクロール部分が描画されないという不具合がなぜか発生します。 右側のスクロールバーは表示されるのですが、 このような不具合を御存知な方はいらっしゃいますか?
>>896 思いつくのは
・メッセージをフックしている。
・上にラベルなどが重なっている。
・縦幅が大きすぎて親からはみ出してる。
・単に水平スクロールのスタイルが指定されていない。
898 :
デフォルトの名無しさん :2005/06/28(火) 11:26:53
WS_HSCROLLないとワードラップモードになるんだよなあれ
任意のプロセスが所有しているウインドウを探すにはどうすればいいんでしょうか。
>>899 ウィンドウを所有するのはプロセスではなく、スレッドなのでEnumThreadWindows()ならある。
LoadImageで取得するHANDLEからイメージがICON,BMPであるかとか判別するAPIってありません? さらっと見た感じみあたらないのですが・・
天堂加速器のようにプロセスの実行速度をあげるにはどうしたらいいか教えてください
>>900 スナップショットでオーナープロセスは特定できるみたいなので
それでなんとかなりそうです。さんくす。
>>901 それは呼び出す側が指定するんじゃないのか?
>>901 LoadImageの引数にタイプの指定があるのになぜそんなことが必要なのだ?
>>902 SleepにAPIフックかけてSleepに意味をなさなくさせる
908 :
901 :2005/06/28(火) 20:59:16
ちとこちら側の仕様上、LoadImageで使用した引数がなんであるか不明なのです。 HANDLE値がわたされるだけなので・・ よって、HANDLE値を元に元データが何であるかを判別する方法があればよいなと いうことでして・・
909 :
901 :2005/06/28(火) 21:19:11
GetObjectあたりでなんとかならないんですかね・・ BMPに関する記述はあるんですがICONはなにも記述されていないような・・
GDI Objectじゃねえから > ICON GetIconInfo、GetCursorInfo、GetBitmap(GetObject) のどれかでは エラーが出ないだろうって事で。
>>901 LoadImageに倣って種別も引数として受け取るようにしようとかいう考えは出てこんのか?
912 :
901 :2005/06/28(火) 22:24:53
>>911 いあ、引数に関しては私が変更する権限ないので・・としかいいようがない・・
GetObjectType(HGDIOBJ)というものも有るが、ビットマップは判別できるがアイコンとカーソルは無理だしの
914 :
901 :2005/06/28(火) 22:33:12
>>913 のようですね。
みなさんいろいろありがとうございました。
とりあえず仕様変更打診しますので・・w
915 :
デフォルトの名無しさん :2005/06/28(火) 22:36:10
c#でポストメッセージするときのwparamやlparamの値ってc++のときの値を入れてもだめなんだけど何で? どうすりゃいいの? 例えば、c++なら、「Q」のwm_keydownなら、wparam00000051 lparam00100001 なんだけど、 C#で、PostMessage(hWnd, WM_KEYDOWN, new IntPtr(0x00000051),new IntPtr(0x00100001))といれてもエラーになります。 ディルインポートはちゃんとやってます。 [DllImport("user32.dll", SetLastError = true)] static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
つInt32
917 :
915 :2005/06/28(火) 23:44:25
PostMessage(hWnd, WM_KEYDOWN, new IntPtr(0x0000 | 0x0051),new IntPtr(0x0010 | 0x0001)); これでできました。どうも基本が分かっていないようで、おさわがせしました。
918 :
デフォルトの名無しさん :2005/06/28(火) 23:48:01
こんばんは。 タスクトレイにプログラムを常駐させて 表示させてあるアイコンを右クリックすると ポップアップメニューを表示するプログラムを 作成しています。 ポップアップメニューを表示するところまではできたのですが、 選択されずにその他の領域(デスクトップ等)がクリックされた時 表示されたポップアップメニューが出たままになっています。 この時にポップアップメニューを消したいのですが どなたか方法を教えて下さい。 case WM_RBUTTONDOWN: u = TrackPopupMenu(hPopUp, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL); PostMessage(hWnd, WM_SYSCOMMAND, u, NULL); return 0; WinXPpro、VC6++ です。
タスクマネージャのようにプロセスごとのCPUの使用率を取得したいと思っています。 調べたところ、pdh.h関連でパフォーマンス測定ができることがわかりました。 PdhEnumObjectItemsで全プロセスのインスタンスのリストを取得し、カウンタに登録し、と いうところまではわかったのですが、取得したインスタンス名からプロセスIDを取得する 方法がわかりません。どうかよろしくおねがいします。
>>918 TrackPopupMenuのまえにSetForegroundWindowをすれ
一行のEDITコントロールで、 エンターキーが押されたときに、文字列を読んで消す。 ということをやりたいのですが。 (IRCクライアントとかメッセンジャークライアントなどチャットクライアントで、改行したときに発言するような感じで入力させたい) WM_KEYUPがVK_RETURNで飛んできたとき、ということにすると、 IME開いていて変換をエンターで確定したときも、文字列を読んでしまいます。 どうするのが一般的なんでしょうか?
>>921 ディフォルトボタンを用意しておいて、そっちのイベントで処理したら?
1行Editだと、Enterキーはスルーされてディフォルトボタンが反応すると思うけど。
#当方MFC屋なので見当違いだったら失礼。
924 :
921 :2005/06/29(水) 01:26:27
MFCはまったくわからないんですが、 「ディフォルトボタン」ってMFC固有の機能か何かでしょうか?
>>924 エディットにES_WANTRETURNがついてなければ
[Enter]キーはデフォルトボタンを押したことになる。
927 :
921 :2005/06/29(水) 01:40:58
ありがとうございます。 でもこれってダイアログじゃないとだめとか書いてあるような気がするんですが。
929 :
921 :2005/06/29(水) 02:02:53
これがいいやり方なのかどうかわかりませんが、 EDITをマルチラインにして、(見かけ上は一行) 親にWM_COMMANDがEN_VSCROLLで飛んできたときを捕まえるようにしました。
サブクラス化するのが一般的なんじゃないかという気も…
931 :
921 :2005/06/29(水) 03:25:42
最初はサブクラス化してVK_KEYUPを捕まえていたんですが、それだとうまくいかなかったので。
サブクラス化してWM_CHARで\rを捕まえる で行ける気がするのだが
933 :
921 :2005/06/29(水) 04:00:05
>>931 ×VK_KEYUP
○WM_KEYUPのVK_RETURN
寝ぼけているみたいだOrz
>>932 そういう方法もあるんですか。
どうも、その方法も試してみます。
あ、もちろんWM_CHARなのでTranslateMessage()は忘れずに
WinAPIむつかしですなー。 /* じっけん */ void jikken(void) { HDC hdc; HWND hwnd; int xLength, yPos; int i, decr; hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); hwnd = GetDesktopWindow(); xLength = GetDeviceCaps(hdc, HORZRES); yPos = (GetDeviceCaps(hdc, VERTRES)) >> 1; decr = xLength >> 6; for (i = xLength; i >= 0; i -= decr) { TextOut(hdc, i, yPos, TEXT("orz "), 5); UpdateWindow(hwnd); Sleep(100); TextOut(hdc, i, yPos, TEXT(" "), 5); } DeleteDC(hdc); } int WINAPI WinMain( 略 ) { jikken(); return FALSE }
>return FALSE 笑うところですか?
怒るところです
漏れは泣きそうになったが
939 :
純一郎 :2005/06/29(水) 09:42:59
人それぞれですから!
940 :
デフォルトの名無しさん :2005/06/29(水) 10:08:57
質問ですが、 CreateFileでハンドルを作り、ファイルをReadしようとしたんですが、 「読み込み専用ファイル」がなぜか読み込まれません。 CreateFileの引数に何かをセットすればいいと思うのですが、 何をセットすればいいのでしょうか? よろしくお願いいたします。
>>940 それ、CreateFileは成功してるのか?
>>940 >「読み込み専用ファイル」がなぜか読み込まれません。
どこで失敗してるのか調べる。
GetLastErrorの値が得られる場合はそれも調べる。
>>921 メッセージ処理で対応したいなら
WM_IME_STARTCOMPOSITION
WM_IME_ENDCOMPOSITION:
この二つのメッセージでIMEが変換中かわかる
944 :
940 :2005/06/29(水) 18:49:53
>>941 >>942 ご返答助かります。
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&pCh,
0,
NULL);
によると、「アクセスが拒否されました。」と出ます。
ただ、このファイルは読み取り専用となっております。
もう少し突き詰めてみたいと思います。
>>944 CreateFileはどんな引数を渡している?
946 :
940 :2005/06/29(水) 19:09:51
GENERIC_WRITEもorしていたため、おきた不具合でした。 くだらない質問ですいませんでした。 ありがとうございました。
やっぱりな
ウィンドウに直接描画していたのがちらつきが酷いです。 CreateCompatibleDC()で取得したメモリDCにいったん描画してBitBlt()で転送すればちらつきが少なく描画が出来るらしいですが、 それで大丈夫でしょうか。 よろしくお願いします。
950 :
948 :2005/06/29(水) 19:21:45
>949 ありがとうございます、試してみます
SetTextColor以外にテキスト色を設定するAPIはありますか?
MFC使う=ファミリアを運転する Win32APIを使う=フェラーリを運転する
>>951 何を知りたいんだ?SetTextColor使えばいいじゃん。
リッチエディットならEM_SETCHARFORMATが来たときのCHARFORMAT.crTextColor。 コンソールアプリならSetConsoleTextAttribute()とか。
すみません。 SetViewPortExtEx() on MM_ISOTROPIC が、むつかしいのですが、 以下であってるでしょうか? 1: ViewPort(0,0) 画面左上 ViewPort(そのときのクライアント領域サイズ in デバイスピクセル) 画面左下 これらはぴくりとも動かない 2: SetWindowExtExで指定された 論理ユニット数をおさめるのにつかう ViewPortのデバイスピクセル数を指定。 このときy軸の方向などが逆だと、引数が負数になる 以上で スケール率 = デバイスピクセル数 / 論理ユニット数 (on 同一物理サイズ内) が設定される。 3: 論理座標(x,y)からWindowのOrgの座標(x,y)をひいて 幅と高さの論理ユニット数を求め、 それにスケール率をかけて さらにViewPortのOrgを加算することで 指定された論理座標が適切なデバイス座標(固定) にマップされる。 4: 論理ユニットの一ユニットあたりの 物理的な幅と高さが同一になるように Windowsが調整してくれる。
958 :
902 :2005/06/30(木) 04:54:53
教えてください
Rectangle()で矩形を描いたときペンの太さを大きくすると InvalideteRect()で矩形の領域を再描写したとき矩形の範囲を ペン幅が超えているので、はみ出ている部分が描写されません。 ペンの幅をみこして領域を描写するしかないのでしょうか。
ペンのスタイルにPS_INSIDEFRAMEを指定するといいと思う。
でなければ、ペン幅を考慮して領域を作るしかない
こんにちは 質問があります。 1)リッチエディットの親をタブコントロールとして作ったのですが、右クリックのポップアップメニューで編集機能をするようにしたのですが、 WM_COMMANDがタブコントロールのほうにSendされているようで、イベント処理ができません。 通常コモンコントロールはウィンドウプロシージャを指定しないので、WM_COMMAND処理ができなくなってしまます。 また、ウィンドウプロシージャをSetWindowLongでタブコントロールに指定したら、今度はタブコントロールが描画されなくなってしまいます。 タブコントロールを親とし、またタブコントロールからWM_COMMANDを得られるようにするためにはどうすればいいのでしょうか? 2)今ウィンドウが表示されているかどうかが確認できるAPIはありますでしょうか。 よろしくお願いいたします。
963 :
962 :2005/06/30(木) 11:10:06
2)は解決しました IsWindowVisible
てきとうなことをいうと タブコントロールをつくるときに p = GetWindowLong(hWndtbctrl, GWL_WNDPROC); してから SetWindowLong(hWndtbctrl, GWL_WNDPROC, oreproc); などして oreproc内でWM_COMMANDのうち notification_codeとctrlIDの一致するものだけ処理して あとは CallWindowProc(p, ....) とか?
訂正 もとのwndprocのアドレスは p = SetWindowLong(hWndtbctrl, GWL_WNDPROC, oreproc); などでpにとれる、もよう
966 :
962 :2005/06/30(木) 12:32:08
>>964 ご返答いただき助かります。
COMBOBOXやLISTやTABなどに、SetWindowLong(hWndtbctrl, GWL_WNDPROC, oreproc);をしてウィンドウプロシージャを設定すると、
コントロールの描画がされなくなるのですが、
独自に用意したウィンドウプロシージャをコントロールにSetしても、
コントロールを描画してくれる方法・手段を教えていただきたいのですが。
コントロールを描画するための何か(API)をWindows内部で呼び出していると思われますが。
>>966 その方法が
>>964 氏が説明しているサブクラス化だよ。最後に CallWindowProc() を呼ぶところがミソ。
で、そもそも
>>962 の1)だけど、
@ リッチエディットを、WM_COMMAND を処理させたいウィンドウの子として作成
A SetParent() でリッチエディットの親をタブコントロールに変更
じゃだめかしら?(そういう意図じゃなかったんならスマソ)
いつもここ見て思うけどお前等の説明って超がつくほど下手糞だよなww なんつーか一連の手順って感じで説明してないし関数名とかポンポン あげてるだけだしwwwこの手の質問に対しては「サブクラス化」 ほとんどこれだけwwwwマジワロスwwwwwwたぶんわざとやってんだと思うけどwww
トーシロがやるアドレス書き換えの手法ワロスwwwww おまけに日本語の説明ド下手wwww書いてる本人ですら根本的にわかってないもようwwwwwまぁ糞スレだからどうでもいいけどww
あと964氏だってwwwwwワロス「氏」なんてつけるレベルのレスかよwwwwwwww激ワロスwwwwwwwどうせ自分で氏ってつけただけだと思うがwwwwww
>>956 プリンター出力でもやっているのかな?
私はこんな順番で呼んでいます。 X,Y は適当に(笑)
SetWindowOrgEx(hdc, 0,0, NULL);
SetMapMode(hdc , MM_ISOTROPIC);
SetWindowExtEx(hdc, , ,NULL);
// Viewport は、左上基点の座標系: Yを - で Window 座標を反転
SetViewportExtEx(hdc, , , NULL);
// ココを移動して 窓を移動する
SetViewportOrgEx(hdc, , , NULL);
974 :
959 :2005/06/30(木) 18:15:37
975 :
デフォルトの名無しさん :2005/06/30(木) 18:32:18
USBなどの取りはずし可能装置に対して 取りはずし要求が出たとき WM_DEVICECHANGE というメッセージを飛ぶのでこれをつかまえて イベントが DBT_DEVICEQUERYREMOVE かどうかを検査すれば,それだとわかります. ところがどのドライヴ文字をわりあてていた装置かを 取得する方法がわかりません. 何か方法はありますか?
単純にドライブを列挙すれば? 歯抜けがありゃそこだし、歯抜けがなけりゃ未使用の中の一番若いやつだ
977 :
デフォルトの名無しさん :2005/06/30(木) 19:49:23
Windows XPをスタンバイ状態にして、n秒後にスタンバイから復帰する プログラムを作りたいのですが、 どんな資料を集めればよいでしょうか? DDKとか知らないとダメでしょうか?
978 :
デフォルトの名無しさん :2005/06/30(木) 20:15:59
あ、やっぱいいです。
コラー!
せっかくだからSetWaitableTimerと書いておこう
>>977 がいかにして、自動でスタンバイさせ、また自動でスタンバイから復帰させる
プログラムを作りたくなったのか知りたいのですが、
どんなレスをすればよいでしょうか?
煽りとか知らないとダメでしょうか?
PC起動タイマーみたいなもんを作りたいんじゃないのか? ・3時間後に復帰するようセットしてスタンバイにしておく ・お出かけ(3時間くらい) ・帰ってきたら起動してて即作業に
983 :
デフォルトの名無しさん :2005/06/30(木) 21:41:28
じゃあ 適当なUSBデバイス(リモコンとか)でスタンバイ状態から 復帰させる方法を教えてください
984 :
デフォルトの名無しさん :2005/06/30(木) 21:51:48
物理ディスクの容量を取得したいのですがどうすればいいんでしょうか。 WMIのWin32_DiskDrive.size相当の情報をWMIを使わずにとりたいです。
985 :
デフォルトの名無しさん :2005/06/30(木) 22:41:30
XP上でVC++6.0で_beginthreadex を使えないんです。原因分かる方ヘルプゥゥ! もちろんprocess.hしてます。 ・・・・・コンパイラメッセージ・・・・・・ warning C4013: 関数 '_beginthread' は定義されていません。
XPで駄目ならWin2Kを使えばいいのに
>>985 どうせシングルスレッド用のライブラリリンクしてるとかじゃねぇの
いつのまにC4013がリンカで出るようになったのやら
>>985 Cランタイムライブラリに
マルチスレッド、またはマルチスレッドDLLを指定しる
>>988 リンクするCRTを指定するコマンドラインオプションはコンパイラオプションで、その指定でマクロ定義が変化するんだが。
素人は黙っとけ
つーか、beginthreadは微妙にAPIじゃないけどな
↓素人の反撃
残念、反撃はかわされてしまった
質問ですが、 MFCにDoModalというものがありますが、 これに変わるWin32APIはありますか?
995 :
918 :2005/07/01(金) 00:59:39
>>920 亀ですがありがとうございました。
おかげさまで解決いたしました
クスクスケジーラミ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。