スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
ただし、最新スレくらいは質問する前に検索してくれ。というかしろ。
過去スレなどのリンクはたぶん
>>2-5 くらい。
4 :
デフォルトの名無しさん :04/06/25 16:20
4なら海外旅行
行ってらっしゃい
8 :
4 ◆MwGQyQRf/o :04/06/25 17:02
今からチケット買ってくるよ(;´Д`)
9 :
pd32c6c.tokynt01.ap.so-net.ne.jp :04/06/25 17:03
とりあえず、まだ日本。
どうでもいいからきえろ
IShellFolderのインスタンスの指すフォルダかアイテムIDリストを取得する方法ってありませんか?
GetDislpayNameOfの第一引数にNULL MSDNに書いてないから、使っていいのかは知らん
SHGDN_FORPARSING以外を指定した場合にエラーになるからだめみたいでですね
皆さんはどうやってあんなに沢山のAPIを覚えたんですか? 一つ一つテストプログラムを作っては、コンパイル・テスト したんですか?
そうだよ。 だから藻前もがんがれ。
>>15 一つ一つのAPI(関数)専用テストプログラム?
そうだよ。 だから藻前もがんがれ。
18 :
デフォルトの名無しさん :04/06/25 20:50
>>13 >SHGDN_FORPARSING以外を指定した場合にエラーになるからだめみたいでですね
そいつを SHGetDesktopFolder で得た IShellFolder で ParseDisplayName してやれば
ITEMIDLIST が得られるような気がするけど。
>>14 覚えない。
基本的なところだけはもちろんおさえておくが、
必要になったときにググる。
MSDNを使うよりもググったほうがだいたいは楽。
fgets()の使い方を完全に忘れてて今日ぐぐったw
>>14 ヒマなときに help のキーワード一覧とかをだらーっと見てる。
Path ほにゃらら系みたいな、「自分でも書けるから必要ないんだけどあれば使う」APIとかは
「何かをするのにやり方が分からなくて Google で調べる」みたいな感じじゃ出会えないから。
>>14 たくさんあるけど普段使うのはかなり限られてくる。
それにCreateWindowとCreateWindowExみたいにほぼ同じ機能のものも相当あるし、
それとDestroyWindowみたいに対になるものもこれまた相当ある。
MSDNヘルプだと「〜Functions」とかが結構役に立つ。 WindowsのAPIってようするに単なるライブラリだから、ジャンル分けすればそう多くないんだよな。
>>23 つかAPIを直で叩かせずにオブジェクトライブラリにすりゃいいのに。
28 :
デフォルトの名無しさん :04/06/25 22:39
IE上で、ActiveXコントロールを使って submitイベントをフック(メッセージのフックか?)したいんですが どなたかやったことありますか?
29 :
デフォルトの名無しさん :04/06/25 22:46
あのVisualC++を買おうと思ってるんですがAPIとかちゃんとヘルプにありますか? ドットネットとかに変わって今までと何か変わりましたか?
>>18 レスどうもです、とりあえずはそれでできるのでしょうが、
MSDNにNULL指定についての記述が無いのと
他のフラグでエラーが出る事から見て
「たまたま」動いているという気がしなくも無いので・・・
マウスカーソルをShowCursorで非表示にしようと思って使ったのですが ウィンドウ内しかカーソル非表示にされません。 完全に非表示にするにはどのようにすればいいのでしょうか?
マウスのコードを抜く
良い反応だ
>>33 (´・ω・`)
>>34 もちろんマウスが動いたりしたら表示しますので教えてください
>>36 ソフ板の例のスレの人か?
マウスフックとウインドウフック入れて
WM_SETCURSORを乗っ取り。
>>37 ありがとうございます
> ソフ板の例のスレの人か?
多分違う人です
>>32 ウインドウ内からマウスカーソルがでられないようにする
うちも見れんな
43 :
デフォルトの名無しさん :04/06/26 19:35
マッピングモードをMM_LOMETRICにして、画面に2cm角の格子を書いています。 その格子に合わせてMoveWindowでコントロールを配置しようとしていますが巧くいきません。 MoveWindowの引数を論理単位(ウィンドウ)で配置できないからです。 座標を計算しようとして、 POINT pt; int x = GetDeviceCaps(hdc,LOGPIXELSX); pt.x = x / 254; int y = GetDeviceCaps(hdc,LOGPIXELSY); pt.y = y / 254; LPtoDP(hdc,(LPPOINT)&pt,2); とすると微妙にズレが出てしまいます。 ScrollWindowExなどの引数もそうですが、引数がビューポートで指定している関数を使う時、 結果が論理単位になるようにする巧い方法ってありますか? 宜しくお願いします。
WINAPIについての良い入門書があれば教えてください。
テンプレに必読書も入れといてくれ。 ・Advanced Windows
>>45 APIの入門書なら取り敢えずAPIバイブルの方がいんじゃないかなぁ?
PlatformSDKでもいいけど。
ペゾルドは入門を終えて更にステップアップしたい時に最適な気がする。
black.sakura〜の例のサイトが個人的には入門に一番よかった。 猫より2段ぐらい。ネットの文献である程度基礎を掴んでから本買った方が何かと便利な気がする
俺も猫よりWisdom派かな。 本は買わなくてもいけるけど、買ったほうがいいのかもしれない。
50 :
デフォルトの名無しさん :04/06/27 16:08
適当な背景に対してフォント文字列を描画するのにDrawText関数を使ってみたのですが 矩形ごと書き込まれますね(白く浮いてしまう) 文字形状だけを背景に対して上書きする方法を教えてください (関数名、キーワードだけでも結構です) よろしくおねがいします
SetBkMode
>>51 ありがとうございます
天才プログラマーですね、頼もしいです
猫でもわかるの161章にある LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) { char str[256]; if (nCode < 0) return CallNextHookEx(hMyHook, nCode, wp, lp); if (wp >= 0x30 && wp <= 0x39) { wsprintf(str, "hMyHook = %d", hMyHook); MessageBox(NULL, str, "MyHookProc", MB_OK); return CallNextHookEx(hMyHook, nCode, wp, lp); } wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook); MessageBox(NULL, str, "インターセプト", MB_OK); return TRUE; } これを実行すると 二重で動作するんですがどうしたらよいでしょうか。
よくわかんねーが、キーボードフックか? WM_KEYDOWNとKEYUP
WMは取得できないな。 繊維状態としてLPARAMのLSBで取得できる
質問です。 必要な時にLoadLibraryでモジュールをロードして、 用件が済んだらFreeLibraryでモジュールをアンロードすると、 タスクマネージャ等で見る所のメモリ使用量は、 モジュールをロードした直後に増えたまま、 アンロードしてもメモリ使用量は低下しません。 また、ダイアログボックス等を使用した場合でも、 EndDialogないしDestoryWindowしても、 メモリ使用量は低下しないようです。 キャッシュのような機構が働いている物と考えられますが、 不要になったメモリを明示的に開放する事は出来ないのでしょうか?
ダイアログ上のリストビューをサブクラス化しようとしています。 SetWindowLong 関数を呼ぶと、戻り値で判断する限り失敗していないのですが、 設定したプロシージャにメッセージがきません。 どこかで凡ミスしているのかもしれませんが、何か考えられる原因はありますでしょうか?
自プロセス内なのか外なのか
>>59 SetWindowLongは自プロセスのウィンドウしかサブクラス化出来ません。
>>60-61 即レス感謝です。
作っているのはDLLでして、ダイアログを生成して、
WM_INITDIALOGがきたところで、SetWindowLogを呼ぶようにしています。
この場合、自プロセス内ということにならないでしょうか?
>>62 ひょっとしてキー関連のメッセージをキャッチしようとしてる?
もしくはCallWindowProcをちゃんと呼んでる?
解決しました。 やはり凡ミスでしたOrz サブクラス化したいリストビューの元々のプロシージャを、 GetWindowLong 関数を使ってWNDPROC型のグローバル変数に保存してたのですが、 自分が設定したプロシージャのプロトタイプの方もWNDPROC型にしていて、 実際の関数本体では LRESULT CALLBACK MyListViewProc(HWND, UINT, WPARAM, LPARAM) になっていたので、SetWindowLongからは、 WNDPROC型のプロトタイプの方しか見えてなかったことが原因みたいです。 失礼致しました。
(・∀・)ノシ解決おめ〜
エクスプローラみたいなのを作ってるんですが、 shell namespaceを使ってエントリの列挙をすると、 IEも列挙できますよね、しかもコイツBindToObjectが可能なので、 普通に進入できやがります。当然中にはなにも無いのですが。 候補としては ・エクスプローラでやっているように、IEのコンテナになる ・エントリのリストアップをするとき、IEを上手く弾く の二通りが考えられるのですが、 どちらもIEのクラスIDを認識して特別扱いしないと出来ませんよね? IEだけならいいのですが、似たようなデスクトップオブジェクトがあると その都度手動で追加しないといけないのが気分が悪いです。 何か上手く扱う方法って無いでしょうか?
ついでにソースです。 なんでBindToObjectできるんだか、ホント頭にきてます。 #include <windows.h> #include <shlobj.h> #include <iostream> main() { CoInitialize(0); HRESULT hr; IShellFolder *psf, *pie; ITEMIDLIST *pidl; wchar_t *ie=L"::{871C5380-42A0-1069-A2EA-08002B30309D}"; SHGetDesktopFolder(&psf); psf->ParseDisplayName(0, 0, ie, 0, &pidl, 0); hr = psf->BindToObject(pidl, 0, IID_IShellFolder, (void**)&pie); if ( SUCCEEDED(hr) ) { std::cout << "BindToObject成功" << std::endl; pie->Release(); } psf->Release(); CoTaskMemFree(pidl); CoUninitialize(); }
スタティックリンクライブラリって勝手にOSからアンロードされることって ありえないよね? アンロードされたって騒いでいる奴がいたもんで。
ない
70 :
デフォルトの名無しさん :04/06/28 12:52
>>58 他所でメモリが必要になって初めて解放されるような、定期的に解放されたような
>>繊維状態としてLPARAMのLSBで取得できる これの意味がよく理解できないのですが 教えていただけませんか。
73 :
デフォルトの名無しさん :04/06/28 18:24
ウインドウをベッキーや2ch専用ブラウザのように分割したいのですが、 どのようにすれば分割できるのでしょうか? また、それぞれにスクロールをつけることは可能でしょうか?
>>73 A1 可能。二つウィンドウを並べる。
A2 当然可能。普通に付ければいい。
75 :
デフォルトの名無しさん :04/06/28 18:46
MFC相談室(
http://pc5.2ch.net/test/read.cgi/tech/1088084875/39 )
で質問したところ、こちら向きの話題だとアドバイスを受けました。
MFCのCComboBoxを使ってコンボボックスを表示させているのですが、
これのCBS_SORT属性を動的に変更することはできないのでしょうか?
具体的には、
1:コンボボックスの中身をクリア
2:SetWindowLongで変更
3:再度追加
という動作をさせたいのですが、どうも動かないようです。
うまい解決法はないでしょうか?
>>74 さん
2つウインドウを並べるとはどういうことでしょうか?
具体的に教えてください。お願いします。
ウィンドウを分割するって事は、ウィンドウが複数必要になるってこった。
>>72 lParamのbit31で、ハンドラが「押し」で呼ばれたか「離れ」で呼ばれたかが判別できるってことだろ。
MSDNのKeyboardProcのページに書いてある。
>>77 さん。
ウインドウを2つ用意すれば、左右に分割されたウインドウができるということですか?
それを、どのように記述すればいいのですか?
よろしくお願いします。
> 左右に分割されたウインドウができるということですか それが分割ウィンドウに見えるかどうかは藻前次第だ。 がんがれ。じゃあな。 面倒がいやならMFCとか使え。
APIで分割ウィンドウを作るような機能はない。自分で実装する必要がある。 それがイヤならMFCでCSplitterWndを使えばよい。まー普通はこっちを 選択するんだろうけど。
質問です 昔はテンプレ3の - Platform SDK Update からSDKをダウンロードし、ローカルのHDDに保存できましたが、今は出来なくなったのでしょうか? Win32APIなどについて調べられたのですが・・・・・
79に付けたしですが、 hWnd1 = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); hWnd2 = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); とかして、まずWindowを2つ作るということですか? Windowを2つできたら、その後はどうすればよいのでしょうか? よろしくお願いします。
>>84 悪いことは言わない。お前には無理だ。
あ き ら め ろ 。
>>73 MFCのCSplitterWndのソースをパクれば?
少なくとも、こんなところでいちいち説明できるような内容ではない。
まあ、お前には無理だろうし、あきらめたほうがいいんだが、それだけでは思考停止なので。 いわゆる分割ウィンドウは、単純にいえば、普通の子ウィンドウのサイズをユーザー操作で 変更できるだけのモノである。 まず、サイズ変更機能を持たない通常の子ウィンドウを配置したウィンドウを作成できるようになれ。 次に、(メニューとか)ユーザー操作を伴わず、子ウィンドウの大きさを計算し変更できるコードを書け。 その後、大きさを変更したいウィンドウ感にそれ用のウィンドウを配置するか、 親ウィンドウを表示するようにし、その部分がドラッグされたときに上記の計算を行え。
WTLにもついてるよ
>>75 コントロールのスタイルは、ものによってはCreateWindow時にしか効果が無いものがある。
多分CBS_SORTもその類じゃないかね。解決法としては、いったんコントロールを破棄して、
該当スタイルを有効にして作り直すのが一般的。
>>91 破棄⇒再構築で目的の動作をさせることができました。
大変助かりました。ありがとうございましたm(_ _)m
>>92 ありがとうございます。
参考にしてみます。
.NET Framework の Char.GetUnicodeCategory のような文字の種別を識別したいのですが、 Win32API で同等の事を行う方法を教えてください。
>>85 様
1 ローカルプロクシを通さない
2 ActiveXのダウンロードと実行をON
3 IEキャッシュ削除
そして
4 OS再起動
によってダウンロード出来ました。
スレ汚し すみませんでした。
他のアプリウィンドウのHWND取ってきて弄るプログラムを書いてるん抱けど HWNDからコントロールの種類を判別できないですか? ボタンとかツリービューとか。
出来るよ。少なくとも標準コントロールなら。
GetClassName
どうやるの? GetWindowLongを調べたけどスタイルとかUserDataとかはだめだった
出来たよー \ありがとう/ λ
>>71 レスthanks.
ソース等ありますか?
もうひとつ質問です。 他のアプリのテキストの内容を取得しようとしても取得できません。 TreeView_GetItemを使ってるんだけど、用意した文字バッファになにも 入ってきません。
>>103 試しに TVM_GETITEM 投げてみ。
>>105 ありがとう、いまそこ見ながら書いたんだけど動かないです;;
//...HWND hcur; //ターゲットのWindowHandle
HTREEITEM ht = 0;
TVITEMEX ti;
DWORD proid;
HANDLE hProcess;
char* pCommon;
memset(&ti, 0, sizeof(TVITEMEX));
//ターゲットのプロセスにメモリを確保
GetWindowThreadProcessId( hcur, &proid );
hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, proid );
pCommon = (char*)VirtualAllocEx( hProcess, NULL, 256, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
//
ht = TreeView_GetRoot( hcur );
ti.mask = TVIF_TEXT;
ti.hItem = ht;
ti.pszText = pCommon;
ti.cchTextMax = 255;
DWORD readb;
TreeView_GetItem( hcur, &ti );
if( !ReadProcessMemory(hProcess,pCommon,ffname,256,&readb) ){
printf( "mem error...\n" );
}
printf( "*** %s ***\n", ffname );
//開放
VirtualFreeEx(hProcess,pCommon,0,MEM_RELEASE);
CloseHandle(hProcess);
いきなりソースだされてもよぉ
ごめんなさい えっとhcurにはターゲットのTreeViewコントロールのHWNDが入ってるんだけど 其処のプロセスをゲットしてVirtualAllocExは成功しているもよう。 WriteProcessMemoryをやるとRead...できちんと読めた。 hcurがきちんとTreeViewをさしてないのかとも思ったけど TreeView_Expand( hcur, ht, ...)できちんとツリーは開閉した。 後僕に考えられる原因はTreeView_GetItemに渡すtiの初期化がまずいのかと 思ったが、しかしこれでいいよね… うわーn
おっ、virusでも作ってるの?イイネイイネー
>>108 TVITEMEX 自体を先方のメモリに取らないとダメじゃないの?
どうでもいいけどヴァイラスって作った時点で犯罪?
非アクティブウィンドウ時にも休止せず、処理を継続するアプリを作りたいの ですが、APIで制御出来るのでしょうか。可能ならAPI名を教えて下さい。
>>112 もともと非アクティブ時にもプロセスは休止しない。
ただCPUの割り当ては少し減るんだった気がする
エクスプローラでファイルコピーさせつつ他のアプリをアクティブにすると約3〜4割速度落ちるな。 なので俺はエクスプローラの優先度をhigherに設定してる。板違いだけど一応。
>>113-115 素早いレスありがとうございます。
アクティブ如何を気にする必要がなければ特別な記述は不要で、逆にRTSで非
アクティブ時には進行が止まる様なのは、その様な処理を敢えて組み込んでい
ると考えていいのでしょうか?
一定時間毎(?)にGetActiveWindowを発行し、返ったのが自分自身でなければ、
なんて事はやらないですよね(即時性がないですし)。アクティブかフォーカ
ス周りのWM辺りを利用するんでしょうか
その名もWM_ACTIVEメッセージ。アクティブ化・非アクティブ化等を教えてくれる。
>>58 SetProcessWorkingSetSizeでどう?
>>68 「勝手に」OSが削除することはないけど
明示的にFreeLibraryすれば解放できるから
おおかた騒いでる奴が参照カウントの管理を間違えたんだろ
>>119 Dynamic Link ならともかく Static Link では参照カウントなんてないんじゃない?
>>120 なくてもあまり困らないとは思うが、Win32ではスタティックDLLの
参照カウントも管理している。起動時は1だから一回FreeLibraryすると
メモリから消え去る(ただしexeは9xだったかNT系だったか忘れたが
どちらかは解放できない)。
意図的な使用例としては自己削除インストーラなんかがたまに使う。
あ、スタティックリンクって.libをリンクする場合の話か。 完全に読み間違えてたorz
DLLをインポートライブラリでリンクした場合の話だと思ってたんだが違うのか?
何か話が混乱してるなw インポートライブラリでDLLを使用する方法を ロード時動的リンク(Load-Time Dynamic Linking) 実行中に LoadLibrary でDLLを使用する方法を 実行時動的リンク(Run-Time Dynamic Linking) と言うそうだ。 正確に伝えるためにはきちんと使い分けた方が良いかもね。 C/C++ コンパイラレベルでは 明示的にコード中で LoadLibrary しない限り、呼んだ API はみんなロード時動的リンクになる。 Cライブラリ等は スタティックリンク (LIBC) とロード自動的リンク (MSVCRT) が選べるね。
linuxなんかではlibcが外にあるようなうにゃうにゃ(ry
あれも動的リンク
> 明示的にコード中で LoadLibrary しない限り、呼んだ API > はみんなロード時動的リンクになる。 /delayloadで実行時動的リンクを選べる まあ中身は LoadLibrary してるだけなんだが コード中に明示的に書く必要はなくなる
チェックボックスつきリストビューで 特定のチェックボックスを無効化or非表示 ってできるのでしょうか?
131 :
デフォルトの名無しさん :04/06/30 03:25
129じゃないですけど 129に絡んで、リストビューの中のチェックボックスをオン、オフしたときに 反応を得るにはどうすればよいのでしょうか? ずっと悩んでいます、教えてください
>>126 libcなんかは静的共有ライブラリといって、
アドレスのバインドはリンク時に、イメージのバインドはロード時にやるという代物だとか。
apacheモジュール(.so)あたりはDLLと同様の動的リンクらしいね。
ネットで検索するとMSDN丸写しな関数リファレンスを載せてるサイトが やたら多いんだけど彼らはいったい何を考えているんだろう。
多少見やすいとか、そういった自己満足
MSDNが最新にして最良のものだという考えに変わりはない。 以下でMSDNに対する愚見を述べさせてもらう。 MSDNには確かに誤りも存在するし、邦訳版は読みづらい(誤訳を避け、あまりに保守的な訳をしている)が、 英語版は素晴らしい。(ry
>>110 なるほど、其処まで考えが回りませんでした。ありがとう
…でもTVITEMをターゲットのプロセスに確保してもだめだった(つД;
ターゲットのプロセスをデバッガで見て確保されたエリアにWriteProcess、
ReadProcess... はできていた。だけどやっぱりTreeView_GetItemしても
変化が無い…
VirtualTreeView だったりして
> …でもTVITEMをターゲットのプロセスに確保してもだめだった 普通は自プロセスに確保して、適当にフィールドを設定してから相手プロセスの メモリにコピーする。そしてそのポインタを使って TreeView_GetItem を 呼び出す。文字列バッファのオフセット値が間違ってるとか?
まず、自分のプロセス内のTreeViewでうまくいくか試してみる
>ti.pszText = pCommon; 先頭に TVITEM をコピーしたとき、ti.pszText のオフセットも変えてる? 文字列専用のプロセスメモリを確保しておくと簡単。
組んでるものはCUIコマンドのものなんで、別にプロジェクト作って TreeViewのGetItemを試したら上手くいきました。 んでそのプロジェクトのTreeViewをコマンドでいじろうとして失敗しました。 以下CUIソース
//...HWND hcur; //ターゲットのWindowHandle HTREEITEM ht = 0; TVITEM ti, *pComTi; DWORD proid; HANDLE hProcess; char* pCommon; memset(&ti, 255, sizeof(TVITEM)); //ターゲットのプロセスにメモリを確保 GetWindowThreadProcessId( hcur, &proid ); hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, proid ); pCommon = (char*)VirtualAllocEx( hProcess, NULL, 256, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE ); pComTi = (TVITEM*)VirtualAllocEx( hProcess, NULL, sizeof(TVITEM), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE ); // ht = TreeView_GetRoot( hcur ); ti.mask = TVIF_TEXT; ti.hItem = ht; ti.pszText = pCommon; ti.cchTextMax = 255; DWORD readb = -1;//
if( !WriteProcessMemory(hProcess,pComTi,&ti,sizeof(TVITEM),&readb) ){ printf( "mem error write...\n" ); } memset(&ti, 0, sizeof(TVITEM)); TreeView_GetItem( hcur, &pComTi ); if( !ReadProcessMemory(hProcess,pComTi,&ti,sizeof(TVITEM),&readb) ){ printf( "mem error...ti\n" ); } if( !ReadProcessMemory(hProcess,pCommon,ffname,256,&readb) ){ printf( "mem error...\n" ); } printf( "*** %s ***\n", ffname ); //開放 VirtualFreeEx(hProcess,pComTi ,0,MEM_RELEASE); VirtualFreeEx(hProcess,pCommon,0,MEM_RELEASE); CloseHandle(hProcess);
>>144 #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL 0x020A
#endif
> if( !ReadProcessMemory(hProcess,pCommon,ffname,256,&readb) ){ ここの ffname はローカルバッファとして256バイト割り当て済み?
サブスレッドがデータをセットしたら 寝ているメインスレッドを起こしてデータを読み取らせたいのですが どういったやり方が一般的ですか? いまはメインスレッドでfor(;;) Sleep(100);しながらフラグを監視してます。
>>143 誤: TreeView_GetItem( hcur, &pComTi );
正: TreeView_GetItem( hcur, pComTi );
では?
>>147 イベント。
CreateEvent, SetEvent, WaitForSingleObject, MsgWaitForMultipleObjects あたりを調べて。
150 :
デフォルトの名無しさん :04/06/30 22:15
リストビューに関して質問です。 ソートの昇順・降順をあらわす三角印(カラムヘッダに表示されるやつ)はどうやったら表示されるのでしょうか? 自前で描画しないとダメ?
>>150 標準じゃついてないな、漏れのはWin2kだけど
>>150 Common Control V6(XP以降)なら可能。
2000以前に対応させようと思ったら、自前で描画する必要がある。
▼▲で誤魔化す手もあるが……。
>>152 thx
やっぱ自前描画が必要なのですね…
ExitThread について質問です。Thread の薄いラッパクラスを作成中なんですが、 SDK のドキュメントでは LPTHREAD_START_ROUTINE のリターン後、暗黙的に ExitThread が呼ばれるとありますが 何らかの処理中にメインスレッドから ExitThread を呼んだ場合、適切な後始末が行われないのでしょうか。
CreateThreadで作ったスレッドの場合は問題ない
>>156 なるほど問題ないのですか。サンクスです。
因みに CreateThread で作成したスレッドに対してでした。抜けてましたね。すいませんん。
ところで ExitThread て明示的に呼び出す必要があるときってどんな時なんでしょう?
何らかの処理中に ExitThread を呼んだところで直ちにスレッドが終了するわけでは無いし(当たり前ですが)
イマイチ使いどころがわからんのですが…。
C++の場合、デストラクタが呼ばれないような気がするけど 大丈夫ッスか?
>>158 ダメです。
なので、ExitThread()は(余程注意しないと)使えません。
スタティックDLL だってさ(プ
161 :
デフォルトの名無しさん :04/07/01 11:01
不特定多数のウィンドウを作る際、 各ウィンドウに対する処理はどのようにして行うものなんでしょうか。 以前は 1 for文をまわしウィンドウを作成する。 その際、外部で宣言したHWND型配列に各ハンドルを代入させる 2 プロシージャで引数として渡されるハンドルと、 ウィンドウ作成時に用意しておいた各HWND配列から内容の同じものを 探して見つける事で多数作られる中のどのウィンドウなのかを判別し それに応じて異なる処理をする。 この「どのウィンドウを現在扱っているか」をプロシージャ内で判別する方法が ややこしいし、なんだかきたないので、 スマートな方法があったら教えてください 根本的に間違っていたら正してやってください おねがいします
162 :
デフォルトの名無しさん :04/07/01 11:38
ぶらくらはいくない。
>>161 SetProp APIを使ってウィンドウハンドルに対して付加情報をむすびつけておくってのはどうよ?
164 :
デフォルトの名無しさん :04/07/01 12:08
ある文字の種別は GetStringTypeEx API をつかえば取れますが、 UNICODE で規定されているスクリプトタイプを調べる API はありますか?
>>161 for 分で Create しつつ登録する仕組みだと、WM_CREATE あたりのメッセージが
発生するときにはまだ登録されていなくて不便です。
なので、WM_NCCREATE を受けた段階で、CREATESTRUCT 経由で渡されたウィンドウを
識別する情報 (CreateWindow時に作っておく) と hWnd のマッピングを生成すると良いでしょう。
163 の言うように SetProp で登録しても良いし、std::map に入れたりしておいても良い。
「この「どのウィンドウを現在扱っているか」をプロシージャ内で判別する方法」は
GetProp とか std::map::operator [] 一発だから、別にややこしくはないと思う。
ふつー、ウィンドウ毎の情報はC++なりのクラスのメンバに格納して、そのオブジェクトへのポインタを SetPropなりSetWindowLongなりThunkなりでウィンドウに関連付けて終わり。
167 :
デフォルトの名無しさん :04/07/01 13:43
>>163 >>165 >>166 ありがとうございます
今さらで申し訳ないのですがC++は自分は使えなくて
C言語でやっています
SetProp関数など今まで調べていたのですが
基本的な用語すらちゃんと理解できていないみたいで
具体的にどうすればいいかわかりませんでした
hWndのマッピング という言葉もよくわからないのです
ずうずうしいとは思いますが
相当なアホでもわかるように教えてもらえないでしょうか
C++を使えないってのがオブジェクト指向を理解できない知らないって意味なら悪いことは言わんからオブジェクト指向について勉強しろ。そのほうが後々楽になる。
ウインドウハンドルと関連データと対応付けてメッセージループ上で使用するのは、C++使う使わないに限らず、 オブジェクト指向とは関係ない、ただのロジック。 何故C++を使うだけでオブジェクト指向と言いたがるのか、さっぱり理解できない。
>>167 マッピングっていうのは、「hWnd から必要な情報への対応表」を作成するということ。
そうして、
>>165 の前半でいっているのは、
for (int window_id = 0; window_id < 100; window_id++)
{
my_data_table[window_id].data = hogehoge();
my_data_table[window_id].hWnd = CreateWindow(...);
}
のようにしてしまうと、WM_CREATE の時にはまだ my_data_table[].hWnd が設定されていなくて
不便だから、CREATESTRUCT 経由で(この例だと) window_id を渡して、WM_NCCREATE で
my_data_table[window_id].hWnd = hWnd を実行すると良いよ、っていう話。
>>167 自分で調べてどうにかしようって気が無いんだったら、
グローバル変数に入れてって既存の方法使えば?
BMPを表示させる方法はテンプレサイトをみて分かったのですが、 JPGを表示させる方法が分かりません・・・ 簡単にJPGを扱う方法はありませんか?
gdiplus系をぐぐれ
レストンクス
>>148 を修正したら動きました
λ<アリガトー
>>173 あとはOleLoadPictureとかLoadImageとか。
ただしいずれもOSバージョンに制限あり。確認汁。
依存するのはOSのバージョンではなくIEのバージョン。
釣られませんよ( ̄ー ̄)ニヤリッ
OleLoadPictureは組み込まれているモジュールによって、出来ることが決まる。 JPEG用のモジュールが入っているのがIEなんだが、けっこう知らない人がいるのか。 その他、標準コントロールの拡張機能もIEのバージョンに依存する部分が多い。
Win32API質問箱 Build19
http://pc5.2ch.net/test/read.cgi/tech/1084697545/ >949 名前:デフォルトの名無しさん[sage] 投稿日:04/06/24 19:06
>今までDLLからウインドウを作ろうなんて考えもしなかったんだけど、
>DLLからCreateWindowをするとき、HINSTANCEにはDLLのインスタンスハンドルを指定するのですか?
>それともWinMainのHINSTANCEを指定すればいいのですか?
>NT系だと無視されるようなので、どちらが正しいかってのがちょっと分からないのですが。
催促ですみません、これわかる人いませんか?
>>170 わかりました!
ありがとうございます
これで外部変数は使わないで済みます。
SetPropの使い方については自分で勉強しながら確認していこうと思います。
>>168 オブジェクト指向ですか。
もうわからない事だらけでやらなきゃいけないこと
山のようにあるっぽいですが、色々調べて勉強してみます
>>171 一応結構長い時間調べたり、にらめっこしたりしてみたのですが
でもわかりませんでした。精進します
みなさんありがとうございました
助かりました。
(´∀`)ノシがんばってねー
>>181 試したわけじゃないけど、
作ろうとしてるウィンドウがどこにあるリソース(メニューとか)を使うかによるんじゃない?
普通はDLLに使うリソース入れるだろうから、DLLのHINSTANCEだと思うけど。
>>181 ウィンドウプロシージャの入っているモジュールの hInstance。
184 の方が正解っぽいぽ
>>184-186 レスありがとうございます。
ウインドクラスの場合は
>>184 で正しいと思うのですが、
CreateWindowの場合、メニューはリソースのIDではなく
メニューハンドルで指定しますよね?
リソースは影響しない気もするのですが、、、。
とりあえずやってみれば?
>>188 現状触れる範囲ではNT環境しかないもので、試せないのです。
そんなときこそVirtualPC(or VMware)ですよ
結局VirtualPCに9x系のOSインスコしないと動かんぞ。
>>181 プログラミングWindowsでは「どっちでも構わんが私はDLLを呼び出した側のインスタンスハンドルを使うことをすすめる」と書いてある。
194 :
デフォルトの名無しさん :04/07/01 22:33
ウィンアプリで長方形の範囲を塗りつぶすAPIはあるのでしょうか。 今はSetPixelVで点をいっぱい表示したり、 CreateFontで文字サイズを変えたのを1文字を表示する、 方法でやっているのですが、あるなら教えてください。
FillRect
ExtTextOutのほうが楽だけどな
>>197 ありがとうございます。こちらもやってみます。
デバイスコンテキストに描画領域を設定する方法ってありませんでしたっけ? 具体的にはWM_ERASEBKGNDである一部分だけ、再描画を停止したいのですが。
IntersectClipRect()みたいなやつか?
ListViewに数万アイテムを登録するとすごく時間がかかるのですが、 何とかこれを高速化する方法ないでしょうか? ファイラーとかだとSysListView32のコントロールでも一瞬で表示されてるので、 やりようはあると思うのですが。
仮想リストビュー
203 :
デフォルトの名無しさん :04/07/02 05:53
親をHWND_DESKTOPにしてボタン作ったらスタイルにBS_PUSHBUTTONが含まれなくなりました あとからSetWindowLongPtrとかやってもだめでした いまのところ描写とかはうまくいってるのですがボタンであるのにBS_PUSHBUTTONでないと 問題が起きるとこってありますか?
>203 C:\bcc55\Include>grep BS_PUSHBUTTON winuser.h File winuser.h: #define BS_PUSHBUTTON 0x00000000L
205 :
デフォルトの名無しさん :04/07/02 07:08
>>204 あ... どうりでふくまれないはずですね
でも電卓とかのボタンをspy++で調べるとBS_PUSHBUTTONがあるのですが
今回作ったプログラムのボタンは、みかけは電卓とかのと一緒なのにふくまれません
なんでだろう...
206 :
デフォルトの名無しさん :04/07/02 10:00
文書管理用のツールを作ってみたいんだけど、勉強がてらグリッドやツリービュー、 画像のサムネールや拡大・縮小、なども自作してみたいです。 でもグリッド一つとってもどう実装していいのかさっぱり分かりません。 参考になる本はないですか? または参考になるソースを入手するにはどうすればいいですか?
イベントとメッセージって何がどうちがうんですか?
208 :
4 ◆MwGQyQRf/o :04/07/02 10:12
とりあえず、海外着いた
209 :
203.208.86.147 :04/07/02 10:14
空港からだけど、アドレスはどうなんだろ?
>>207 イベントはキーを押したり、マウスを動かしたり、タイマーの時間が経ったり、
起こった事で、メッセージはそれをOSがプログラムに伝えてくるものかな。
>>212 Windowsについてまだ勉強始めたばかりなのですが、
イベント=スレッド間の同期通信
メッセージ=スレッド間の非同期通信
という理解でとりあえずはいいんでしょうか?
>>213 全く違う。
イベントってのは、英語の event そのもの。メッセージも message そのもの。
一般名詞であって、そんなに狭い意味を持って使われてるわけじゃない。
Windows の中では、イベントというと
・イベントドリブン型プログラム、という文脈でのイベント。
Windowメッセージのうち、ユーザやシステムから非同期的に発生するもの
WM_LBUTTONDOWN とか。WM_SETFONT などは普通「イベント」とは言わない。
・CreateEvent で作られた同期・排他・待ち合わせ用オブジェクト
・COM オブジェクトからの event sink インターフェイスへの呼び出し。
など諸々。
メッセージは、
・GetMessage や PeekMessage で得られる、ウィンドウメッセージ
・MAPI で転送されるメッセージ
など。
♪これっくらいのっ イベント箱にっ おにぎり おにぎり チョイと詰めて あがり コーヒー ゆず さくらっ
>>201 今MSDN開けない環境なんでうろおぼえだけど、
リストの更新(追加)時に更新描画をさせないようにするメッセージかなんかがあったはず。
それで描画をOFFにしておけばそこそこ速度が稼げた気がする。
>>216 SendMessage(hListView, WM_SETREDRAW, 0, 0);
ここで項目追加
SendMessage(hListView, WM_SETREDRAW, 1, 0);
218 :
デフォルトの名無しさん :04/07/02 16:41
すっげー初歩的な質問かもしれないけどさ WIN32APIって何?
>>218 32ビット版Windowsが用意している関数群。
Cのライブラリ関数には必要ないけど、Windows用プログラム製作には必要なものが揃っている。
MSVCRTの扱いは微妙なとこだが・・・
225 :
デフォルトの名無しさん :04/07/02 22:49
WinMain関数について質問なんですが、MSDNに 戻り値 関数が WM_QUIT メッセージを受け取って正常に終了する場合は、メッセージの wParam パラメータに格納されている終了コードを返してください。関数がメッセージループに入る前に終了する場合は、0 を返してください。 と書いてあります しかし、DirectX9のマイクロソフトのサンプルコードには、 // Initialize Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { // Show the window ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); // Enter the message loop MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } UnregisterClass( "D3D Tutorial", wc.hInstance ); return 0; } と0を返しています これでもいいのでしょうか?
WinInetで接続時のタイムアウトを設定する方法はありますか? INTERNET_OPTION_CONTROL_CONNECT_TIMEOUTとか 設定してみたけど反映されてないっぽいのですよ・・ ・・どなたかご存知ないでしょうか?
IE5.5だかあたりの時代のWinInetはタイムアウトがまともに動かないんで非同期API使って自力でタイムアウトしろとか言われてた気がするが。
>>225 WM_DESTROYでPostQuitMessage(0);なんて決め打ちしていたら別に同じ。
それにWinMain(main)の戻り値はWindowsが使うんじゃなくて、ユーザが使うものなんだけど、
ウィンドウズではまず間違いなく使われていない(それに使う手段がないに等しい)から別にいい。
>>228 そうなんですか
プログラム終了時に、0が返ってくるとなにかxpとかがカチンと来るのかなと思っていたのですが、
大丈夫なようですね
>>228 スタートアップルーチンが使ってるってことはない?
233 :
デフォルトの名無しさん :04/07/03 04:39
gdi+でjpg画像から、ビットマップのGetPixelのように 1ピクセルの画素値を抜き出すのってどのようにすれば可能でしょうか? よろしくお願いいたします。
>>214 レスありがとうございます。
Advanced Windows 3rdを古本屋で手に入れました。
カーネルオブジェクトという観点から綺麗に書かれていて
これ、とても解り易くて良い本です。
よく読んでから出なおしてきます。
235 :
デフォルトの名無しさん :04/07/03 10:07
ListCtrlに数値を表示する際にカンマ区切りで表示したいわけですが 何かオプションでも有りませんでしょうか。 そういうの良く見かけますけど全部自分で区切って登録してるのかな?
>>235 カンマ区切りって、桁区切り表示のこと?
なら自分で実装するしかない。
まあ、自分で実装しても難しくも何ともないから、おとなしく作っとけ。
無い様なのでそうすることにします。 桁区切りならGetNumberFormatで出来ますし。
>>238 ライブラリ化しとくと便利かも
ところで、9xでWNetAddConnection2使ってネットワークドライブに割り当てた
Server2003の共有フォルダ(NTFS)を、
9x側がFATって誤認識することがあったんだが、なんか情報持ってる香具師いないか?
9x系全般で再現、同一セグメントで発生した上クライアントPCの環境には特に縛られてない模様で、
再現手順もトリガもまったくわからん状態で困ってるんだが
ローカルディスクならブートレコード読み損なったときにFATと読み違えることも
あるらしい(見たこと無い)が…?
別に作ったテキストファイルを読み込ませて、 画面に表示する方法を教えて下さい。
1) CreateFile()でファイルを開きます 2) ファイルの中身を読み出します(バッファ確保注意) 3) テキストウィンドウを作って2)で読んだ中身を放り込みます
>>239 ネットワークドライブの実際のフォーマットを知ってどうしようっての?
何か意味があるとは思えないが
ファイル名の制約(8.3かどうか,大文字小文字を区別するか,長さ制限)を、 単にNTFSかFATかで区別しているとヤバいかもしれんね。 ちゃんとAPI叩いてればいいんだろうけど・・・
mmapfileにCの文字列処理関数使った場合ファイルの末尾で'\0'でちゃんと止まってくれるの?
意味が分からん mapした領域オーバーしたらメモリ保護エラーだろ
>>244 >単にNTFSかFATかで区別しているとヤバいかもしれんね。
そりゃ論外すぎる…
248 :
デフォルトの名無しさん :04/07/03 17:38
「ひまわり」とか「TTS」でWIN32APIって使えるのか?
>>244 >>247 FATと誤認識されたドライブを開いて[新規作成]→[テキストファイル]
…orz
まあ、9xが論外というならそれには激しく同意だが
>>249 なにか問題が?
まさか、書込みできないFATを想像してないわけじゃないよね?
>>249 再現できれば画面さらしてもいいんだが
「"・テキスト"が作成できません。指定されたファイルが見つかりません」とエラーになる。
要は、FATと認識しているにもかかわらず、8.3形式無視した名前付けようとして
勝手にエラーを吐くっぽい
ネットワークドライブ割り当てまでがお仕事で、後は好きに使ってねっつーアプリなんで
こっちとしてはFATだどうだは気にしたくもないわけですが
↑みたいに勘違いしたエラー吐きやがるので
このままではお話になりませんよ、と
すいません。分かる方、ご教授願います。 ●フォーカスがないダイアログ側で、現在のキーの状態が得られません 当方でやりたいことは、任意のキーが押されたらキャンセルしたい そこで、タイマーをセットしておいて、 ::GetKeyboardState(g_kbState); // キーの状態を取得する。 for(mm=0, bCancel=FALSE ; mm<256 && !bCancel ; mm++){ if( mm==243 ) continue; bCancel = (g_kbState[mm] & 0x80)!=0 ; } で、bCancelがTrueか否かをみていますが、常にFALSEです フォーカスがあれば、大丈夫なんですが・・・
>>253 MSDN嫁
>The key status returned from this function changes as a thread reads key messages from its message queue.
>The status does not reflect the interrupt-level state associated with the hardware.
>Use the GetAsyncKeyState function to retrieve that information.
>>252 「FATと誤認」してると判断した根拠って何?
なんか妙な勘違いしてるような予感がするんだけど・・・。
>>255 この状況のとき、該当ドライブを右クリックしてプロパティ出すと
ファイルシステム:FAT
になってる。
実際、Office系のファイルを新規作成すると、新規作成ファイルの命名規則が8.3になる
あたりから判断
実際、共有フォルダ内のファイルは開けるので、ドライブの接続が切れてるとかではないっぽいし
FATでもロングファイル名使えるだろ つかネットワーク経由でFATとか関係あんのかよ
>>256 つか、話がさっぱり要を得ないんで勝手にまとめなおすけど、
(1)2003Serverで共有フォルダを出している。ローカルディスクはNTFS。
(2)9x上でWNetAddConnection2()使ってその共有をネットワークドライブに割り当てた。
(3)そのネットワークドライブ上でファイルを作成すると
「"・テキスト"が作成できません。指定されたファイルが見つかりません」
なエラーが出てファイルが作成できない。
(4)既存のファイルは読める。
(5)Officeでファイル作成すると、名前が8.3形式になっている。
でいいのかな?
ちなみに、ドライブのプロパティに出るファイルシステムは当てにならんと思うよ。
2000からsambaサーバの共有をネットワークドライブに割り当ててるけどNTFSって出るし。
(ちなみにsambaサーバのローカルディスクはsoftupdate付きのFFS)
9xは(V)FATしか知らない(NTFSなんて知らない)から、表示上そう見てるだけでは。
勘だけど、2003Serverの共有か、ドメインorワークグループの設定ミスってる気がする。
>>257 関係ないと思ってたんだが…
動作見る限りFAT(それもFAT32とかじゃなくて素のFAT)ドライブでの動作まんまだし
>>258 要領悪くてすんません、そんな感じです
ただ、
>9xは(V)FATしか知らない(NTFSなんて知らない)から、表示上そう見て
の部分だけど、正しく拾えるときはNTFSとちゃんと出る
実際
クライアント再起動かけたりサーバ側セッション削除して再接続かましたりで
復帰した(後者はほぼ五分五分でうまく行くのと行かないのがあった)から
ネットワーク環境っぽいのはぽいんだが…
再現率が恐ろしく低いんで(つまり普段は正常に動作している)
設定周りよりも負荷とかタイミング依存な感じ?
プログラムを使ってなくて持つところが暗くなってるときに キーボードのボタンを押したことがわかるにはどうやればいいですか?
何を言っているのか分かりません
俺は分かったけど答えは知らん
俺もわからんので答えも知らん
俺もまじわからん。光学マウスじゃないよな。
俺の推理だと、SetWindowsHookEx(WH_KEYBOARD)
>>260 は、ウィンドウ(プログラム)非アクティブ時に押したキーを横取りしたいんだろう。
平たく言うとキーロガーを作って{好き|嫌い}な{アノ子|あの糞野郎}に仕込んでやりたいと。
持つ所ってタイトルバーか…orz 物理的に持って暗くなるのもを探したよ
エスパーが多いスレで質問してよかったな。
962って962の前に何かレスしてるの?
>>272 軽く検索したけど、当該スレ内にそれらしき書き込みは一切無し。
その奇妙さと日本語の不自由さを含めて962と260が同一人物との
推測に至りました。
とりあえず、質問の文面からしてプログラマの素養無しなので、さっさと あきらめることをお勧めするな、漏れは。 まあ他の職業も無理だろうけど。
アインシュタインなどの天才は260のような文章を書くと聞いた覚えがある
そうか。 じゃあプログラマじゃなくアインシュタインになれ。
池沼に見える天才が居るのは事実だが、全ての池沼が天才であるわけではない。
アインシュタインはボーナスでないよ
天才は、思考が飛躍するので凡人がついていけない。 >260のようなのは、思考が飛躍するのではなく支離滅裂なので凡人がついていけない。
天才へのねたみを恥ずかしげもなく表出するスレはここですか?
283 :
デフォルトの名無しさん :04/07/03 23:53
プ
ロ
市
警
287 :
デフォルトの名無しさん :04/07/04 00:00
が
超
法
政
大
学
逮
捕
乙
彼
ドゥアフォ
甲子園
※
つまり プ ロ市警が「超法政大学逮捕」乙彼。 ドゥアフォ甲子園 っていうわけだな。
よぉ〜わからんが、なんかわらける。
>なんかわらける。
なんかばけらった
スパイ(をつくろうとすること)がばれて切れてる感じだろ
凡人の発想はそんなものなんだね
真の天才は2chで情報収集などしないものです。
BOOL PathIsDirectory(LPCTSTR) のディレクトリだった場合の戻り値が 0x10 なのですが なんでしょうか?これは MSDNには Returns TRUE if the file exists, or FALSE otherwise.となっています。 if(PathIsDirectory(...)) でやっておけば問題なしですか? #define TRUE 0x16 じゃないですよね
↑ちなみにwin2000 IE最新です。
ヘッダ調べたところTRUEは1に、FALSEは0にdefineされてる。しかしBOOL型の関数であって
元々値をintで比較するように設計されてないだろうから!=FALSE(つまり
>>307 と同じ)でいいんじゃないかな。
サンプルコード書いて試したわけじゃないけど。
まぁ普通はTRUE==!0 FALSE==0だから。。。 確かに紛らわしいけどそこは柔軟に対応してあげて下さい。
MSDNの引用を間違っていました。正しくは
Returns TRUE if the path is a valid directory, or FALSE otherwise.
まあ同じですが。
>>309 ,310
なるほど。MSDNの言っているTRUEがVCで定義されているTRUEということではないということですか
気にせず前進といきます どうもです
まぁBOOLって云ってるのにTRUE/FALSE/-1の3つが返ってくるGetMessageに比べたら
313 :
デフォルトの名無しさん :04/07/04 21:46
CreateProcess関数は第1引数か第2引数に実行ファイル名を代入すればOKという認識でいいのでしょうか? でも、そうだとすると二つある必要がないですよね
コンソールから実行する感覚でやる時には第二引数に放り込んだほうが楽なんだわ。
GetCommandLineで取れるものが変わってくる。 POSIXサブシステムのためにそーゆー仕様になってるらしい
コントロールに、TTM_ADDTOOLでチップヘルプをつけているのですが、 コントールに、XPスタイルを適用(manifestファイル使用)すると、 チップヘルプがうまく表示されなくなってしまい困っています。 具体的な症状としては、 ・アプリケーション起動直後は、正常に表示されます ・コントロールをクリックすると、そのコントロールのチップヘルプが表示されなくなります ・XPスタイルを適用しない場合は、コントロールをクリックした後でも正常に表示されます 解決策・原因等をどなたかご存じないでしょうか。 ・開発環境 WindowsXP pro + SP1 Visual C++6.0 pro + SP6 + PlatformSDK
>>316 それだけでわかるかよ。
どうやってコントロール作っているのかも書いてないし、TTM_ADDTOOLを送るときの
LPTOOLINFOも書いてないし。manifestファイル中身だってわかんね。
聞くのはいいけど、何がどうなっているのかくらい書いてからにしてくれよ。
回答者にはエスパーの資格を有することが必須条件です。
幸い、ここにはエスパーが多いから。
ウィンドウプロシージャで新しいメッセージを作ろうと思うんですが、 メッセージ番号がWindowsが定義したものとかぶらないか心配です。 例えば自分で作るときは5000番台にするとか、そういう決まりごとは 無いんでしょうか。あったら教えてください。
>>321 msdnかどっかに書いてあったと思う
WM_USER+hoge
にすれば確かかぶらない
RegisterWindowMessageとか。
>>322 その範囲は、コントロールが使用することがある。
現在は、WM_APP+nが推奨される。
今までずっとWM_USER使ってたけど・・・
WM_USER through 0x7FFF Integer messages for use by private window classes. WM_APP through 0xBFFF Messages available for use by applications. なるほどね。WM_USERはウィンドウクラス用、WM_APPはアプリ用ってことか。
みなさまありがとうございます・・・。夜中だというのに スレの回転が速い・・・。
他のプロセスのウインドーのアクティブを変えるにはどうやればどうやればできますか?
333 :
デフォルトの名無しさん :04/07/05 03:24
ファイルオープンダイアログを自作する必要が出たのですが、 ファイルオープンダイアログの中で表示しているディレクトリの中身を リアルタイムに更新するにはどうすれば良いでしょうか。 標準のダイアログを見てると、何かメッセージを受け取っているようですが それを受け取れるようにするにはどうすれば良いのかわかりません…
FindFirstChangeNotification
Win2k以降でよければファイル名まで知らせてくれるAPIあったよな。名前忘れたけど。
ぐぐったら見つかった。 NT3.51 SP3 以降 ReadDirectoryChangesW() 2K 以降 SHChangeNotifyRegister()
>>333 むしろファイルオープンダイアログをいじるほうが楽だったりして…
hEdit = CreateWindow("EDIT",〜 で作成し画面に貼り付けたエディットウインドウを 一時的に非表示にしたいんですけど簡単にできますか?
ShowWindow()
たまにHideWindowで探して鬱になる漏れ・・orz
>>333 の欲しい答えはOPENFILENAMEのlpfnHookの事のような気がする。
344 :
デフォルトの名無しさん :04/07/05 22:49
VB6.0の質問です IntegerをByte配列に変換したいのですがAPIのCopyMemoryを使って Dim data(1) As Byte Dim a As Integer a=3000 CopyMemory(data(0),a,2) とやると明らかに化けた数値がdata()に入ってしまいます この状態を解消するやりかたをどなたか教えてください
VBのことは知らんが、Integerは4バイトとか言うオチではないよね?
CByte
>>344 意図がわからん。手元でやってみた限りではdata(0)は184、data(1)は11で、
(11*256)+184=3000。これは別段おかしな動作ではないと思うが?
>>345 VB6のIntegerは2バイトだね。
関係ないけど、VBだとDATAってステートメントじゃなくなってるんだな。
dataって変数名でドキドキしてしまった(笑
>>333 すでにいろいろヒントが出てますが、漏れも勝手な類推に基づき、キーワードを提供。
stc32
こんなことやってるの俺だけかな? namespace std { #ifdef UNICODE typedef wstring TSTRING; typedef wstringstream TSTRINGSTREAM; #else typedef string TSTRING; typedef stringstream TSTRINGSTREAM; #endif }
>>349 この方がシンプルじゃないかい?
namespace std {
typedef basic_string<TCHAR> TSTRING;
typedef basic_stringstream<TCHAR> TSTRINGSTREAM;
}
動けばどっちもおなじだろ
>>131 >129に絡んで、リストビューの中のチェックボックスをオン、オフしたときに
>反応を得るにはどうすればよいのでしょうか?
前に LVN_ITEMCHANGED と書いた者だが。
俺のプログラムでは必ず1つはチェックされている事が必要なので,
LVN_ITEMCHANGING で最後の1つのチェックが外されようとしているか判定していて,
うまく動作している。
お前は LVN_ITEMCHANGED 自体を受信できていないとか書いていたが,
LVN_KEYDOWN とかも受信できていないのか?
WM_NOTIFY 知らないとか。
>>347 解決できました
Single aをInt(a)でCopyMemoryに放り込んでいたため
おかしな数値になっていました。
ちゃんとinteger変数に代入してやればうまくいきました
変な質問ですいませんでした
すいません。おしえてください。 ウインドウプロシージャとデータの送受信をするにはどうすればいいのでしょうか? グローバル変数を使えば楽なんでしょうけど、プロの人はそんなことはしないのかなと 思って。
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { ::Sleep(5000); return 0; } と、コンパイルして実行するとカーソルが砂時計に変わりますが、 カーソルを変化させないようにするにはどうしたらいいのでしょうか?
>>358 たとえばウインドウから子ウインドウを作って、それぞれのプロシージャ間でやりとり
したいデータがある場合はどうすればよいのでしょうか?
普通は関数間でやりとりしたいのなら引数で渡すとか、関数の返り値を使うとか すると思うのですが、プロシージャは引数が決まっているからそういうことは できないですよね?
SendMessage(hwnd_dst, WM_APP+α, (WPARAM) length, (LPARAM) pointer) で大抵のデータは送れるわけだが。 俺なら同一スレッド内ならウィンドウプロシージャ無視して直接対象ウィンドウを管理してるオブジェクトのメンバ関数呼び出すが。
>>359 未確認ですが。。
呼び出し側のCreateProcessのSTARTUPINFOで
STARTF_FORCEOFFFEEDBACKを指定。
>>361 CreateWindow()/CreateWindowEx() の最後のパラメータも使ってあげてね♪
やり取りしたいデータのポインタか、その構造体のポインタを渡せば幸せになれるかも。
365 :
デフォルトの名無しさん :04/07/07 13:44
プリンタのプロパティから設定できる「印刷後ドキュメントを残す」を、プログラム側から設定したいのです。 GetPrinterを使って、PRINTER_ATTRIBUTE_KEEPPRINTEDJOBSの値を調べるところまではできたのですが、 値を設定するにはどうしたらよいでしょうか? お知恵をお貸しください。
>>361 基本的には
>>362 でいいと思うけど、
WndPrco間の通信はマルチスレッド処理になるから、処理順とか資源管理には気をつけてね。
デッドロックとか分かりにくいバグ引き起こしたりするから。
グローバル変数使えばいいじゃん そんなことこだわるほうが馬鹿のすること
>>362 >SendMessage(hwnd_dst, WM_APP+α, (WPARAM) length, (LPARAM) pointer)
>で大抵のデータは送れるわけだが。
なるほど。
ありがとうございます。
>俺なら同一スレッド内ならウィンドウプロシージャ無視して直接対象ウィンドウを管理してるオブジェクトのメンバ関数呼び出すが。
すいません。
素人なんでもう少し詳しく教えていただけないでしょうか?
>>368 >グローバル変数使えばいいじゃん
>そんなことこだわるほうが馬鹿のすること
そうなんですか?
自分は所詮素人なんでグローバル変数をがんがん使えばいいのかなという気もしますが・・
プロの人もそうなんでしょうか?
慣れてくるまで、簡単な方(理解しやすい方)を使った方がいいぞ そうして、動くものを完成させるのが、最も重要なことだよ そんなところで悩んでいたら、いつまで経っても完成しないよ そのうち、いろいろな方法を覚えてきて、改良を加えればいい話。
質問です。 CreateWindowでウィンドウつくってその親ハンドルをもとにコードでボタン等を配置するのではなくて、 VBみたいに、ウィンドウ(フォーム)にボタンなどはりつけたウィンドウを、はじめからよべませんか? リソースでつくってよぶのかと思ったんですが、リソースではダイアログしかつくれないし、 ダイアログだとアイコンが使えないので意図とちがうので。
>>369 グローバル変数はアクセスそれ自体は簡単だけど、
データ更新の通知とか内容の有効性とかアクセス排他とか、
外堀をきちんと埋めておかないと意外なところで逆襲食らいがちなので、
一番使い方の難しい手法だったりする。分かっててやる分には勝手だけどね。
専用の仕組みがあるのなら、一見難しいようでもそれを使うのが一番簡単ってのはよくある話。
というのは、必要性があるからこそそういう仕組みが作られてるからで。
単純に++してるだけだと安心してたら、マルチプロセッサにもってった途端に破綻したことあったな。ハハハ
>>371 無理。
どうしてもやりたかったらVBからCで作ったDLLを呼び出すとかそういうことを考えてみたら?
>>373 そうなんですか。
じゃあ地味にコードかいてコンパイルして表示しては配置を直さないといけないんですね。
>>371 アイコンって、CTRL+ALTしたときとかに出てくるアレのことなら、
WM_INITDIALOGあたりでWM_SETICON投げればダイアログにも付けられるけど?
>>375 ALT+TABだった。冷房入れてくる。
>374 ダイアログつったって結局表示さすときの制御の違いなんだから、ダイアログリソースをCreateWindowして ちょこっと設定してやれば普通のオーバーラップウィンドウとして使えると思うぞ。
>>374 お手軽にやるなら、VC++ で MFC 使って CFormView とかでも出来るけど、
見かけだけの問題なら、
>>375 のいうようにダイアログで処理するのが簡単。
>>377 >ダイアログリソースをCreateWindowして
まさにそれが知りたいのです。どうやるんですか?
WTL入れてダイアログベースでプロジェクトを開始すればOK
>369 社長、Windowのクラス化というのをご存じでしょうか? 詳しく話を聞かせるのは面倒なので、自分で調べて。
RegisterClass()で登録するウインドウのクラスのことでしょうか? それぐらいの知識しかありません。
C++で書いてるとはひとことも出てきていないのだが。
>382 ちゃうちゃう。そのウィンドウクラスじゃなくて、C++のclass。 ウインドウプロシージャをクラス内で定義することによって、 メンバを色々出来るようにすること。 >383 >〜メンバ関数呼び出すが。 に反応しているからC++だと決めつけていた。 もしCなら、staticとグローバル関数で妥協なんてのもいかが?
>>384 構造体だろがC++のクラスだろうがHWNDとの対応関係が必要というのがここまでのお話なんだが
>>379 CreateWindowのウィンドウクラス指定のとこにMAKEINTRESOURCE(IDD_DLG)してやりゃいいかと思ってたが、そう甘くなかった。
CreateDialogでできたウィンドウをSetClassLongをつかって背景色やスタイルとかプロシージャを書き換えるといい。
( っ・ω・)っ話
⊂(・ω・⊂ )
漏れもWinMain側で作ったデータをウィンドウプロシージャに使わせようと思って、
調べてるうちにSetProp/GetPropつーAPIを見つけたんだが、これってそういう用途に使っていいものなのか?
このAPIの用途知ってるやつ、教えてください。_|\●__
>>386 うほ、SetClassLongなんてAPIあったのか・・・。
Set/GetProp系はHWNDに対して、キーに対応する値を複数セット対応づけられるものらしい。
GWL_USERDATAみたいに単一の値である必要がないので、
VBのプロパティを独自に追加できるような感じで、便利っぽい。
>>387 WM_COPYDATAはプロセス間のメッセージ送信に使う奴だあkら、
プロセス内で使うにはちーとオーバー気味な気がする。
(確か内部的にファイルマッピングオブジェクト使うはず)
>>388 サンクスコ。*Propの使い方がわかったよ。英語版MSDNだとどうも感じがつかめなくて、
VBみたいなIDEのプロパティリストをつくるための、特殊なタイプのAPIかと思ってたよ。
>>384 C++じゃなくてCオンリーでやっています。
でも、
>>385 の話だとC++にすれば解決するって問題でもないってことですかね?
サブクラス化ってのはC++とはまた別なんだけど、 その辺と混乱してる人いない? そもそも質問者がどういうレベルなのかで 回答者達の間で解釈が幾つかに分かれてる気がする。
>>386 WinMainはウィンドウを生成するルーチンだけにしたほうがいい。
いろんな初期化とかはWM_CREATEをキャッチしたときにやるべき。
複数のウィンドウにまたがる処理ならデータを渡す方法になやむよりも、
グローバル変数にした方がスマートと思う。
>>393 >>392 の
「複数のウィンドウにまたがる処理ならデータを渡す方法になやむよりも、
グローバル変数にした方がスマートと思う。」
の「データ」というのは「WinMainで作ったデータ」の意です。
言葉足らずでスマソ。
つまり完全に
>>383 氏に同意ってことです。
それと誘導thx。
BMPを表示させる時に、リソーススクリプトを使えば表示出来るのですが、 LoadBitmap()で直接ファイル名を指定すると画像読み込みに失敗してしまいます。 リソーススクリプトを使わずにファイル名で表示させる方法はありませんか?
>>386 使ってもいいよ
そのAPIを使っているかはしらないけど、
OLE DnDのドロップターゲットになると
自動で付けられるね。
MSNMessengerの通知ウインドウみたいに タスクトレイの辺りで小さく表示されるウインドウを 簡単に作るライブラリとか無いですかね? CreateWindowとかで毎回小さなウインドウを作ればいいのかな?
毎回作らんでも不要なときはShowWindow(,SW_HIDE)しとけばいいんじゃないか?
>>392 ,399
またレスキターヽ( ´ー`)ノ
ほんとありがとうございます_|\○_
内田こねりで抜きまくり
こんな恥ずかしい誤爆初めて
403以前の君のレス番を書いていてくれたらもっと面白かったんだけどな:D
406 :
デフォルトの名無しさん :04/07/09 00:35
晒しage
普段はリファレンス検索も面倒がる俺が 内田こねりを無意識にgoogle (・∀・)ホホウ ナカナカ
408 :
デフォルトの名無しさん :04/07/09 07:15
どなたかインスタンスハンドルからメインウィンドウのウィンドウハンドルを取得する方法知っている方いらっしゃいますか? ShellExecute の戻り値を使いたいのです。
>>408 ShellExecuteの戻り値って、16bit Windowsじゃなきゃ意味ないよ。
って、16bit Windows使ってたらスマソ
410 :
デフォルトの名無しさん :04/07/09 10:12
>>409 レスありがとうございます。
本当ですね。MSDNをちゃんと読んだら書いてありました(汗
一応32ビットでやってるのでShellExecuteの戻り値はエラーチェックにしか使えないわけですね・・・。
戻り値の型だけ見て早合点してしまいました。
不注意ですみません。
初めはCreateProcessで同様のことをやってみようと思ったのですが、取得できるのがPROCESS_INFORMATION構造体でプロセスとスレッドのハンドルとIDってとこでしょうか。
ここからメインウィンドウのハンドルを取得する方法がやっぱりわかりません。
果たしてそんなことは可能なのでしょうか?
>>408 ShellExecuteEx()を使ってプロセスハンドルを取得。
後はGetProcessId()、EnumWindows()、GetWindowThreadProcessId()の組み合わせ。
412 :
デフォルトの名無しさん :04/07/09 10:17
スレとは関係なくて申し訳ないんですが アプリケーションエンジニア試験とネットワークのテクニカルエンジニア試験って どっちのほうを先にやるのが一般的なんですか? っていうかどっちのほうが簡単ですか? あほな質問でごめんなさい
スレと関係ないとわかってなぜこのスレに書く? お前は吉野家コピペか。
>>412 どっちでもいい。
君がとりたい方をとりたまえ。
>>413 まぁまぁ。
妥当なスレを見つけられなかったんだろ。
そういきりたつなよ。
>411 便乗質問なんだけど、 GetProcessId()って見つからないのだが、ハンドルからIDを求める方法ってあるの? >410 CreateProcess()もありなら >411に追加で、探索範囲が狭くなるけど、EnumThreadWindows()なんてのもある。
GetProcessId は XPSP1,Server2003 or later 汎用的な方法はHWNDに対してグローバルフックしてGetCurrentProcessIdかな
根本的に間違っていた 2000Pro以降ならNtQueryInformationProcessかな
Win32って、例えばウィンドウを分割した場合、 2つのViewにそれぞれメッセージループを実装することってできますか?
他のプロセスのウインドーをしらべるのに ウインドーに書いてある文字以外を使って プログラムがわかる方法おしえてください
>>420 なにから何を導き出したいのか曖昧だぞ。
>>419 チャイルドウィンドウが独自のメッセージポンプ(UIスレッド)を持つことは可能ですよ。
でも「Viewにそれぞれメッセージループを実装する」っていう感じではなくて、
別スレッドを作成してそちらでチャイルドウィンドウを作り、そのウィンドウのメッセージを
処理するって形になります。
>>422 ありがとうございます。
結構面倒そうですね。
通常、intはfprintf(fp,"%d",xxxx);と、charはfprintf(fp,"%s",xxx); というようにファイルに書き込んでいますが、COLORREFはどうやってやられてますか? あと、COLORREF=RGB(赤,緑,青);としますが、COLORREFから赤だけとか、青だけとかの値を 抽出することってできますか?
>charはfprintf(fp,"%s",xxx); そんなやつぁいねえ。 >ファイルに書き込んでいますが、COLORREF %08x つか、Win32APIじゃねえな、この質問は。 >COLORREFから赤だけ Get[RGB]Value
有難うございます。 >>charはfprintf(fp,"%s",xxx); >そんなやつぁいねえ。 では、どうしますか? cout << COLORREF << endl;とか?
COLORREFの定義がどうなってるかも知らなさそうな勢いだな・・
>>424 =
>>426 >>>charはfprintf(fp,"%s",xxx);
>>そんなやつぁいねえ。
>では、どうしますか?
アナタ C シッテマスカ?
fprintf(fp, "%c", xxx);
>>428 有難うございます。
つうかcharは
char xxx[10+1];
のつもりで書きました。
スレ汚しすみません。有難うございました。
lstrcpyやlstrlenの先頭にある 'l' って何かの略なんでしょうか? 知人は「L"text" の 'L' じゃね〜の?」って言ってました。 ご存知の方、教ぇてけろ。
DirectXでプログラミングをするときは、 やはりWin32を使ったほうがいいのでしょうか? 再生したり、フレームからビットマップを取り出してウィンドウに貼ったり、 そいつをポップアップメニューでいろいろ処理したり、といったことをしたいのですが。
いいです。
>>431 用途と、実装者の能力による。
今時DirectXくらいどの言語でも扱えるから、自分の得意なのでやってみればいい。
よくこんな質問に答えられるなあ
それがお前との差
>>430 LPTSTR lstrcpy(
LPTSTR lpString1, // address of buffer
LPCTSTR lpString2 // address of string to copy
);
Lは "long"
16ビットWindowsは、ポインタサイズを"near" "long"で区別していた。
32ビットWindowsは区別しない。
>>435 頓珍漢な質問にもっと頓珍漢な答えが出来るヤシとそうでないヤシとの差だな。
>>436 nearとの対比ならfarだと思う。
438 :
デフォルトの名無しさん :04/07/09 17:48
どこかで WINAPI の メッセージやマクロや関数を大量に載せてたHPを 見かけたんですが、改めて探すと発見できません。 どこかいいサイト知りませんか?
MSDN
>>436 ロングポインタの L だったんですね、サンクスです。
441 :
デフォルトの名無しさん :04/07/09 18:26
>>436 Large の L じゃないのか(笑)
>>439 dクス。
いいところを教えてもらいました。
far はー……DOSか。
LはLoveのL♪
>>441 でもさ、LP〜って型はこういう具合に山ほどあるよ
typedef int INT, NEAR *PINT, FAR *LPINT;
(NEAR/FARはWin32では#defineで消される)
Farは元々はDOS時代の用語で、8086のリアルモードでセグメント境界を越えるポインタのこと。 セグメント:オフセットで表記する、1Mバイト空間を指す物理アドレス。 Nearは16bitのポインタで、Win16(16bitプロテクトモード)の普通のポインタ。 なお物理アドレスは「セグメントセレクタ(16bit):オフセット(16bit)」の32bitで表現するので、 リアルモードとの連想でこれをFarポインタと呼んだ。 Longは32bitのポインタで、Win32(32bitプロテクトモード)の普通のポインタ。 Nearを16bit→32bitに拡張したもので、オフセットだけでWin16のFarポインタと同様の 32bit空間を表現できるようになった。「これがNearとFarの区別がなくなった」という言葉の意味。 Win32でも「セグメントセレクタ(16bit):オフセット(32bit)」をFarポインタと呼ぶかもしれないけど、 これは16bitプロテクトモードと違って物理アドレスを意味しないし、用語としても一般的ではない。かも。
lpszはlong pointer string terminated by zeroの略
long pointer to a string terminated by zeroだ
>>447 こう言う略語の元ネタが分かるサイトってどっかないかなぁ?
MSDNじゃ分からなかったよ(´・ω・`)
どうでもいいけど、lpszについてはASCII string terminated by zeroのASCIZなんかを知ってると理解しやすいのかな。
略語の元ネタをまとめたサイトは・・・知らないけど命名規則としてハンガリアン記法を使ってるからこの辺が多少参考になるかも。
http://masafumi-t.cool.ne.jp/ready3.htm # つーか俺の場合intのプリフィックスにはnを使ってるけどなぁ・・・
451 :
デフォルトの名無しさん :04/07/09 21:28
(・∀・)ウソツキー ASCIZハ ASCII with Zeroノリャクダヨー
orz
ところでMSは相当いい加減なハンガリアン記法なんとかしてほしい。
>>453 .NETでは止めたんだけどな。過去の資産には手が回らんらしい。
つか今更弄ったら混乱するだけだと思うぞ。
>>418 Microsoftはサポート対象にしてないが
NT系ならもっと前からNtQueryInformationProcessは使えるけどね
exeヘッダのMZは?
MZ80K?
Mark Zbikowsky
Mark Zbikowski
MS-DOZ
さいた まんぞう
祝一平
>>459 何の冗談かとおもったら、それほんとなのか・・・勉強になった。まとめてみる。
・MZ
DOS用EXEのヘッダ。DOS2.0開発責任者の一人、Mark Zbikowski氏のイニシャルに由来。
・NE
Win16用EXEのヘッダ。New Executableの略。
・LE
仮想デバイスドライバ(VxD)のヘッダ。Linear Executableの略。
・PE
Win32用EXEのヘッダ。Portable Executableの略。
・LX
OS/2用EXEのヘッダ。Linear eXecutableの略?
Win32API とは全く関係ない話題だが、 えらい勉強になったゾ
今のexeでもMZから始まってるんだよな。 WinFXでもMZだったりするのかな。
WinFXの雛形であろう.NETのコンパイラが吐くバイナリもMZ→PEだからな。一応後方互換性のためとなってるけど 実際のところは単にthis program can't be run in dos modeって出すだけだ罠
すでに、スタブを実行させるのすら面倒がいる罠。
補足トリビア。 昔のDOSではMZではなくZMでもOKだった。
タスクバーに表示されるWindow(Alt+Tab時に表示されるWindow)を列挙したいんだけど EnumWindowでやると余計な者まで一杯出てしまいます。 なんでGetWindowLongでStyleをとってWS_CAPTIONとかで選り抜いてみたんだけど それでも多いんですよ。これやってる人たくさんいると思うんだけど やり方を上手くググれませんでした。 たしかCreateWindowしたときにタスクバーに入るかどうかはStyleで 決まってたと思ったけど上のやり方では無いんでしょうか
>>469 (親がデスクトップ || NULL) && WS_EX_TOOLWINDOWでない && HIDEされてない
472 :
デフォルトの名無しさん :04/07/10 13:02
TVINSERTSTRUCT構造体のANSIバージョンからUNICODEバージョンへ 若しくはその逆の変換をしたいと思っています。 しかし、メンバの中にunionが存在するので 普通にコピーしていくだけじゃ駄目な気がします。 この場合はどのようにすればいいのでしょうか。
マウスカーソルの現在位置を知るときにGetCursorPosだと スクリーン全体のx,y座標になってしまいます・・ ウインドウでのx,y座標を知るにはどうすればいいですか?
XPのタスクバーでグループにまとめられるかどうかは
どういう基準で判断してるんでしょうか
>>473 ScreenToClient
同一プロセス、同一クラス
>>472 IE4未満を指定すればunionはでてこないし、あっても普通にコピーしていい。
当たり前だけどその後item(or itemex)のpszTextを変換しろよ。
Windowsプログラムで使われるデータ型(HWNDやHDCなど)を VC++6でデフォルト青文字にて表示させるためのファイルが あったと思うのですが、配布場所をご存じないでしょうか 確かUser.datとかそんな感じのファイル名だったと思うのですが
ツールバーでボタンを右詰にするにはどうすればいいのでしょうか?
480 :
教えてください :04/07/10 15:51
とあるサンプルコードのウィンドウプロシージャに case WM_LBUTTONUP: PlaySound(TEXT("laugh.wav"), NULL, SND_ASYNC | SND_FILENAME); return 0; こんなのをつけてみたのですが 外部参照1が未解決です、とエラーがでてしまいます。 laugh.wavをプロジェクトフォルダの中にいれてみたり、デバッグフォルダに いれてみたり試してみたのですが、うまくいきません。 ウィンドウプロシージャに上みたいなコードを付け加えてlaugh.wavをフォルダに いれるだけでは、だめなんでしょうか?? VC6.0PROを使っています
winmm.lib
>>480 少なくともlaugh.wavは無関係。
485 :
デフォルトの名無しさん :04/07/10 16:39
裏描画域を作るCreateCompatibleDCやCreateCompatibleBitmapは、 GetDC、BeginPaint、どちらのHDCから作っても同じのが出来るのでしょうか。
>>485 できるけどBeginPaintだとEndPaintまでしか使えないよ
WM_PAINTから抜けたら終わりだよ
>>486 ゲーム開始時に作って終了時に消す裏描画域を作りたいのです。
表示する内容を常に保持しておいて、
WM_PAINT、それ以外、兼用として使いたくて。
>>488 分かりました。ありがとうございました。
つーかGetDC(NULL)。
WinMainで使っていた変数をCreateThread関数で作ったスレッドに渡すにはどうすればいいですか?
>>477 サンクスです。
よく考えたら構造体のサイズはAもWも同じなので
memcpyしてpszTextだけ挿げ替えて使用するようにしました。
>491 第四引数LPVOID lpParameterを用いる。
>>493 変数が一つだとそれでいけるんですけど、3つくらい渡したい変数があってどうすればいいか悩んでるんです
>>476 IEを別プロセスにしていてタスクマネージャ上でも明らかに別プロセスなのに
タスクバー上では同じグループになっているから違うと思います。
マルチスレッドで作れるスレッド数に上限ってありますか?
スタックを使わないプログラムを書けばメモリーしようしないでいくらでもつくれるの?
今だ!500ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
>>499 だから利用可能な仮想メモリによって制限されます、って書いてるやん
じゃあ、シングルスレッドのスタックのサイズを減らすにはどうやるの?
503 :
名無しさん@そうだ選挙に行こう :04/07/11 12:18
strftimeの様にFILETIME構造体を日付に書式化するAPIって無いですか? SYSTEMTIMEからの変換でも構わないですが。 ロケール関係でwsprintfで書式化する方法以外を探してます。
FILETIME―FileTimeToSystemTime()→SYSTEMTIME―GetTimeFormat()→(゚д゚)ウマー
>>504 サンクスです。でもコレは時間だけしかフォーマット出来ないのか、、、
でも
GetDateFormat(lpsz)
GetTimeFormat(lpsz + lstrlen(lpsz))
で何とかなりそうなので使わせていただきます。
贅沢言えば一発で出来るのが有ると良いんですけど。
506 :
名無しさん@そうだ選挙に行こう :04/07/11 12:45
DWORD型変数dwの値を、デバッグ用にfprintfで出力したいのですが、 フォーマットはどのように指定すればいいのでしょう? DWORDはunsined long のtypedefのようなのですが、 fprintf(stream,"%lu\n",dw); としてしまって良いのでしょうか? でもこうするとtypedefしている意味が無いような気がしますし…
気持ちはわかるが、そうするしかない
>>506 #define DWF "%lu"
とか定義しておいて、
fprintf(stream,DWF"\n",dw);
ってのはどうよ?
古いコンパイラでは使えないけどナ。
fprintf(stream,"%lu\n",(unsined long)dw); ってやればいい
時が止まった
continue;
MessageBox(NULL , TEXT("選挙行ったか?") ,TEXT("質問") , MB_YESNO | MB_ICONQUESTION );
PCに接続されているHDDのリストを取得するには、 どういうAPIを使えばいいんでしょうか? CドライブとかDドライブとかいう単位ではなく、 「ディスクの管理」で見られる、ディスク0とかディスク1 とかいう物理的な単位でです。
純粋に初心者の質問なんですが、 TEXT("選挙行ったか?") のTEST("")って使わなくてもいいのにみんな使ってるのはなんでですか?
>>515 本に書いてあったから。
コードの流用性が上がるから。
めんどい以外の損がないから。
習慣。
なんとなく。
今日はいい電波ですね。
ぬるぽ。
はらへった。
早く帰りてーなあ。
TEST("")って、アサーションでもしてるの?
>>517 ちょっと前の過去ログを読めば、TESTがTypoだと気付くと思うんだが。
TESTって何をするものですか? 関数ですか?
テストする関数
521 :
名無しさん@そうだ選挙に行こう :04/07/11 19:58
拡張子の説明(エクスプローラの詳細で表示される「種類」の項目の文字列)を 取得する為以下の様にしました。 SHFILEINFO shfi; ::SHGetFileInfo("hoge.txt", 0, &shfi, sizeof(SHFILEINFO), SHGFI_TYPENAME); しかし、この場合実際に存在するファイルを指定しなければ取得出来無いようです。 その為、一々tempファイルを作成していますがかなり効率悪そうです。 これを何とかして取得出来る様にならないものでしょうか。
#ifdef UNICODE #define TEXT(s) L##s #else #define TEXT(s) s #endif だっけ?
名無しの「そうだ選挙に行こう」はそろそろやめた方がいいよな
>521 当たり前です。 たとえば、hoge.txtという名前のフォルダが存在できる以上、 実物を見ないと種類は決定できないのは明白でしょう。
>>522 ってことは、TEXT(lpszHoge)とかやっちゃいけないはずだよね
char *pszHoge = TEXT("HOGE"); こんなぼけもいる。
527 :
デフォルトの名無しさん :04/07/11 20:30
>>524 なるほど。しかし拡張子の種類の文字列を取得したいだけなので
実物のファイルがフォルダか否かは関係無いんですよ。
フォルダオプションのファイルの種類なんかどう取得してるんでしょうね。
もっと全然違う取得法が有るんでしょうか?
なに言ってんの?
ださくない方法教えれ
>>521 SHGFI_USEFILEATTRIBUTESを追加で存在しなくても取得できる
つーか、HKCR検索するのが一番早いと思うけどな。
ずっと調べてるんですがまだわからないです。 物理的な単位はデバイスIDってよぶんですかね。
>>534 取得出来ました。
SHGFI_USEFILEATTRIBUTESにそんな効果が有るとは盲点でした。
WEBとかMSDNとか見るとファイルの属性を取得するフラグと書かれてるだけですからね。
MSDNは完全に翻訳して理解してたわけじゃないのでアレですが。
>>536 =514
WinNT系ならCreateFile()で指定できなかったっけ? APIのマニュアルよく読んでみ。
>>538 \\,\PHYSICALDRIVExってやつですね。できそうです。
ありがとうございました。
>>208 マジで行ってるのか?
デスマの休憩ぐらいはいいか
>>539 ,541
もう帰ってきたよ。2週間位行ってた。
向こうは冬だったけど、日本は暑いね。
1週間の間違いだろ
>>543 いや、約2週間。6/28に日本を出発して
次の日にシドニー到着。2chに書き込むの
忘れてて、7/2にメルボルンで書き込み。
んで、7/10に帰ってきた。
>>208 の書き込みが
ちょっと、まぎらわしかったね。ゴメソ。
なるほど。つーか決めてから三日で行ったんですが。身軽でいいっすね
間違いメルボルンじゃなくてミルデューラだった。
548 :
4 ◆MwGQyQRf/o :04/07/12 00:37
これ以上、語るとスレ違いとか言われそうなんで、
これで最後にします。スレ汚しスマソ。
>>547 向こうは北半球なので、日本と完全に逆。
場所にもよりますが、(日本の月+6)%12って
感じで…。1月位の気候かな?
>>545 フリーのPGで、しかもあまり仕事しないので(w
3ヶ月位仕事して9ヶ月遊ぶというような生活を
しているので、身軽です。遊ぶ分しか仕事
しないので、貯金は全然無いです…(;´Д`)
549 :
デフォルトの名無しさん :04/07/12 02:44
CreateWindowのクラス名をBUTTONとして作ったボタンに SetWindowLongPtrを使ってWS_THICKFRAMEを追加してサイズ変更できる ボタンを作ったのですがWS_EX_WINDOWEDGEもいっしょにくっついてきてしまいます SetWindowLongPtr等をつかってWS_EX_WINDOWEDGEを取り除こうとしたのですがだめでした WS_THICKFRAMEを自前でエミュレートするのは避けたいのですが方法はありますか?
プロシージャーのサブクラス化ぐらいしか思いつかないなぁ
>>548 一年中仕事してるのに貯金が無い人へのあてつけですか?
>>551 一年中仕事しているし貯金もないけど、そこそこの生活を維持できた親も養えているから不満はありません。
>>551 でも、フリーで貯金無いと、「仕事無し→即あぼーん」だからね…。
かなり、綱渡り状態。会社で働いてて貯金無いのとは、
比べ物にならないと思うよ。
554 :
教えてください :04/07/12 17:22
ドゥオオオ PlaySound()を使うにせよmciコマンドを使うにせよ、 wavファイルを再生しようとすると外部参照が解決できません というエラーがいつもでてしまうのですが、 wavファイルを再生するときは何か事前に設定したりしないと だめなんでしょうか??? VC++6.0PRO使ってるんですが。 なんなんだ一体???ホゲゲ???
#pragma comment(lib, "winmm.lib")
とりあえずエラーメッセージを嫁。
つい最近全く同じ質問を見たきがするんだが。
ドゥオオオ
定番質問は誰かまとめればいいのにと思ったりしないでもない
まとめたってどうせ読まずに質問する奴は後を絶たないと思ったりしないでもない
561 :
教えてください :04/07/12 20:12
こんなエラーなんですけど mci2.obj : error LNK2001: 外部シンボル "__imp__mciGetErrorStringA@12" は未解決です mci2.obj : error LNK2001: 外部シンボル "__imp__mciSendCommandA@16" は未解決です Debug/mci2.exe : fatal error LNK1120: 外部参照 2 が未解決です。 つい最近の同じ質問も私のやつです。 っていうかPlaySound()で解決しないならmciコマンドでやろうと 思ったんだけどやっぱり同じエラーでてまたしても立ち往生です。 外部参照が未解決ってエラーは何をミスってると出るエラーなのかだけでも教えてください
リンクすべきライブラリをリンクしてない。
カブッタ orz
565 :
教えてください :04/07/12 20:18
あ、なるほど winmm.libというのがその必要なライブラリってことですな??
566 :
教えてください :04/07/12 20:19
ちゅーか手元の本にはそういう肝心なことが書いてない・・・ ドゥオオオなんだこの本は!
書名を更科
>>567 Programming Windows
使ってる環境が何か知らんが、 ライブラリのリンク法くらい調べたほうがいい。
おまえは某ランドのコンパイラ使っとけ
555==571
575 :
デフォルトの名無しさん :04/07/12 21:38
メニューバーの文字のフォントサイズを変えられるAPIは何ですか?
RegSetValueEx
StretchBlt
CreateWindowExの第一引数にWS_EX_TOPMOSTを入れると 常に最前面に表示されるようになるのは解ったのですが。 常に一番後ろに表示されるようにするにはどうしたらいいでしょうか?
WS_EX_USHIROMOST
SetWindowPos(hWnd, HWND_BOTTOM, …
"常に"
スレッド作って for(;;) { SetWindowPos(hWnd, HWND_BOTTOM, … Sleep(1); }
デスクトップ貼り付けってのなかったっけ
>>580 >>582 有難うございます
SetWindowPosまでもたどりついたのですが
スレッドを使うとは知りませんでした。
>>584 最前面の反対は最背面なんですね
URLまで張ってくれて有難うございます
一番後ろって事はデスクトップウインドウより後ろって事だから、 単に非表示にしても変わらないんじゃね?
一番後ろにすると見えなくなっちゃうけどいいのか?
>>587-588 デスクトップを使わない時に表示できればいいので大丈夫です。
>>584 さんのリンクを参考(というかそのまま)に
case WM_WINDOWPOSCHANGING:
((LPWINDOWPOS)lp)->hwndInsertAfter=HWND_BOTTOM;
break;
をウィンドウプロシージャに挿入したら上手くできました。
有難うございました
>>561 つか、コンパイルエラーはAPIの問題じゃなくて環境設定の問題だから、
このスレの前提を満たしていない。背伸びしないでVC初心者スレあたりで聞きなさいな。
592 :
デフォルトの名無しさん :04/07/13 07:36
以下の様にしてファイルのアイコンを取得していますが どうもHTMLファイルのアイコンだけが取得出来ません。 SHFILEINFO sfi SHGetFileInfo("hoge.html", 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON ); SetIcon(hWnd, sfi.hIcon); 何か足りない処理でも有るのでしょうか。
>>591 コンパイルとリンクの区別がついてない人
>>591 もこのスレの前提を満たしていないってオチですか
# Build16の368からコピペ >質問なのですが、 > >かなりいろんなサイズのフォント作成して、 >TextOutするアプリを作ってて、Win2kまではフツーに動く。 > >が、 >XPで動かすとTextOut終わってフォントDeleteしても >仮想メモリが増え続けて、アプリを終わらせないと >戻らない。(リソースの明示的リークはないと思う) > >こんな現象に出くわした人いますか? 激遅れすですが、 これってアジア版XPの仕様みたいです。 回避法はあんまり無いので、バグとしか 思えませんけど。
>596 開示できるソースは無いです。
タイーホ
脳内ソースじゃ開示できんわな
>599 そのとおりです。
ダサい発言禁止
×でそ ○ウホ
605 :
デフォルトの名無しさん :04/07/13 20:00
質問させてください。 HDCからHBITMAPを作成する事は可能ですか? 方法があれば教えて頂きたいのですが。
CreateCompatibleBitmap
608 :
THE 初心者 :04/07/13 20:04
プログラミングの本を購入して、その中にプログラムらしき物が書いてあって、これを打ち込んでビルドしてくださいっていうところがあるんですが、どこに打ち込んだらいいんでしょうか? メモ帳でしょうか?また、打ち込んだプログラムをどうやって起動させるのでしょうか? 教えてくださいおねがいします。 えっと、なんかCプログラミングってかいてあります。だからCなのかな? すっごく初歩の質問ですみません
610 :
THE 初心者 :04/07/13 20:12
ごめんなさい。かくとこ間違えました
>>607 例えば、ウィンドウのHDCに転送した画像を
HBITMAPとして確保したいのですが、どうやればいいのでうしょうか?
1.CreateCompatibleDC 2.CreateCompatibleBitmap 3.SelectObject 4.BitBlt
>>612 この場合、CreateCompatibleBitmap()で作成したHBITMAPから
生のBit配列は取得可能ですか?
CreateDIBSection
GetBitmapBits まあ、こんなもの使っても嬉しくはないわけだが、 HBITMAPから生のって言ったらこれだろ。
中じゃダメって言ったのにー!
分かりました。あとは自分で調べてみます。 ありがとうございました。
つーか、ビットマップに直接アクセスしたきゃ最初からDIBSection使えば。
ビットマップ操作はAPI関係の質問としては定番中の定番だから、 google先生に聞いたほうがまとまったいい答えが見つかるよ。
目的を明確にせずに手段ばかり聞こうとするから、役にも立たないDDB関数なんぞ 教えなきゃいけなくなっちゃうんだ罠。
まぁgoogleに聞く前にプログラミングWindows読めばビットマップ関連の基本はばっちりなんだが
どうせ読むなら「Programming Windows」にしようぜ。
大 改 定
bccのリソースコンパイラを使ったらできました。 なんでだろ〜。
そういや旧版のプログラミングWindows95で、2章にGDIの解説まとめてやってて、 最初に読んだ時なかなかわからなくてかなりへこんだもんだ。 普通ならこれで一冊の本になるぞ、って
Win95で256色主流だった頃は、DDB/DIBに加えてパレットも必須だったからねえ。 もーあの時代には戻りたくねえ・・・。
256色以下だとパレット保持してるからね。
256色でパレットのないドライバってのもあったけどね
629 :
デフォルトの名無しさん :04/07/14 15:22
MSのCryptoAPIメーリングリスト、最近メールが配信されてこないなあ、
と思っていたのですが、調べ物をしようとしたところ、以下のURLで
アーカイブの閲覧も検索もできなくなっていることにことに気づきました。
http://discuss.microsoft.com/archives/cryptoapi.html どこかに引越ししたのでしょうか? それとも廃止?
アーカイブはどこかで公開していないのでしょうか?
ちょう有用な情報満載だったので、何とかアーカイブをゲットしたいのですが、
もうだめぽげでしょうか...?
だめぽげです。
>>630 スタートページと検索フォームは見れるのですが、
各アーカイブをクリックすると"The archive files could not be accessed..."と表示され、
検索実行すると0件になってしまいます...
>>633 今年の2月第1週以降はリンクすらない事から鑑みるに、
その辺りで終わったんじゃないか?
直接MicrosoftのWebMasterに問い合わせてみては?
まったく気づいていなかったのですが、最後のほうに配信されていたメールで 以下のようなアナウンスがあったのに気づきました。俺って間抜け。 Microsoft will discontinue the CryptoAPI, CAPICOM, Smartcard SDK and Smartcard DDK mailing lists on Feburary 1, 2004. Support for these areas will contine on the microsoft.public.platformsdk.security newsgroup. 上記newsgroupでは見慣れたGulu達があまり現れていないみたい。このメールの後に 別メーリングリストを作ろうという動きもあって、今はそっちで活躍しているのかも。 ただ、今までのCryptoAPIメーリングリストはMSの技術者の人が出入りしている点も 魅力だったんだよなあ。 そんなわけで、お騒がせしました。m(_ _)m
DVDドライブに入っているメディアがCDかDVDかを調べるAPIわかりませんか?
>>636 WebPageに対する問い合わせでもインシデント取られるのけ?
とマジレスしてみる:-)
タスクバー(notタスクトレイ)に並んでる順にウィンドウハンドル列挙ってできるんでしょうか? 再配置ならShowWindowで一旦全部消して好きな順にSW_SHOWするってサンプルは見つかったんですが……。 現在の並びを取得するってのが見つからなくて。
639です。 ITaskbarListってのを調べてみましたが、 これもAdd/Delete/Activateしかない模様……。
強いて言うならウィンドウが最後に表示された順だろうが、Explorer落としたりするとかなり好き勝手な順番に変わるからあんま意味ないと思うが。
AllocConsole()で作ったコンソールウィンドウをシステムメニューから閉じると、 GUIのメインウィンドウまで閉じて、プロセスが終了してしまうのを防止したいのですが。 どなたか、方法を御存知ないでしょうか。
>>642 勘だけど、SetConsoleCtrlHandlerかSetConsoleModeでどうだろう?
>>643 BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
if(dwCtrlType == CTRL_CLOSE_EVENT)
{
FreeConsole();
}
return 0;
}
SetConsoleCtrlHandler(HandlerRoutine, true);
てな具合にやってみたのですが、やはりプロセスが終了してしまいます。
SetConsoleMode は Ctrl+C の無効化には使えましたが、この用途にも使えるなら、
具体的にどう使うのでしょう?
サンプルコードは無いでしょうか。
CとAPIでオセロを作っています。棋譜みたいなのをlogというファイルに 書き込んでいくのですが、これを保存したいんです。 普通のアプリで保存とかを選ぶと保存の画面がでてきますよね?ファイル名とか ディレクトリとか選べる画面。あれを表示してオセロのlogを保存するには どうしたらいいのでしょうか?
GetSaveFileName()でぐぐりましょう
>>644 FreeConsoleしてもいいんなら最初からさっさとFreeConsoleしちゃえば?
>>644 ヘルプくらい読めよ。
HandlerRoutine
各コンソールプロセスは、HandlerRoutine 関数の独自のリストを持っています。
最初、このリストには ExitProcess 関数を呼び出す既定のハンドラ関数だけが含まれています。
・・・
コンソール信号を処理するときは、TRUE を返してください。
FALSE を返すと、このプロセスのハンドラのリストに登録されている次のハンドラ関数が使われます。
TRUEの値は何だよ?FALSEの値は何だよ?
644じゃないけど、CにBOOL型は要らないとよく思う。紛らわしいだけで利益がない。
Cにあるのは_Bool型だが?
>>646 ファイルを保存ダイアログボックスの表示は分かったんですけど、
どのファイル(この場合オセロのlogの事です)を保存するってのは
どこで指定してるんですか?
>>648 失礼、ミスりました。
でも結果は同じ。
やはり終了します。
ちなみに、FreeConsole をコメントアウトすると、
ダイアログが現れ、当然「このプログラムを終了できません」となり、コンソールウィンドウのみ閉じること
はできません。
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
if(dwCtrlType == CTRL_CLOSE_EVENT)
{
FreeConsole();
}
return 1;
}
SetConsoleCtrlHandler(HandlerRoutine, true);
>>647 システムメニューから閉じたいのです。
あるいは、タイトルバーの×印のボタンから。
>>641 > 強いて言うならウィンドウが最後に表示された順だろうが、
やっぱりないですかね……。
Win+Tabでタスクバーの並び順にタスクバーボタンのフォーカスが移動するから
なんかあるんじゃないかと思ったんですが。
> Explorer落としたりするとかなり好き勝手な順番に変わるからあんま意味ないと思うが。
だからこそ並び順で取得したい訳なんですけど……。
クラス名順でソートとかして使いやすく再配置が実際的な解なのかな。
日本語リファレンスには、 SetConsoleCtrlHandlerで各パラメータにNULLおよびTRUEを指定して呼び出すと、 呼び出し側プロセスがCtrl+Cシグナルを無視するようになる。 と書いてあるけど。
あ、Ctrl+Cじゃないのね、失礼。
>>653 Win+Tabはタスクバーを管理してるエクスプローラ自体が反応するから、
内部的には持ってるんだろうけどね。
ということで、タブコントロールから取得するというのはどうでしょう。
>>645 何がしたいの? ファイルへの出力はGetSaveFileName()じゃできませんが。
>>639 某スレでそこらへんの話題が出たのでちょうど調べてた.
w2kでしか確認してないけど,TCITEMのlParamにウィンドウハンドルが入ってる.
xpはどうなのかな?
下のようなリソースがあるんですが、バージョン情報を取得する定石で VerQueryValueを使って文字コードを\VarFileInfo\Translationから取得 すると、800004B0になってしまって、\StringFileInfo\040904E4に アクセスすることができません。どうすればよいのでしょうか・・・ 1 VERSIONINFO FILEVERSION 5,0,128,0 PRODUCTVERSION 5,2,6,0 FILEOS 0x4 FILETYPE 0x1 { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "CompanyName", "Adobe Systems, Incorporated" VALUE "FileDescription", "Adobe Photoshop" VALUE "FileVersion", "5.0.2" (省略) } } BLOCK "VarFileInfo" { VALUE "Translation", 0x8000 0x04B0 } }
643だけどごめん、無理かも。 素直に別コンソールプロセス立ち上げて名前なしパイプでつなぐとか。
>>659 XPですが、タスクバーのが
Shell_TrayWnd : ReBarWindow32 : MSTaskSwWClass : ToolbarWindow32
とToolbarに変更されているため、TBBUTTON.dwDataまたはIBBUTTONINFO.lParamがそれっぽいです。
……が、なぜか言うことを聞いてくれません(涙
まずボタン総数を取得すると倍の数値が返ってくるし。
正直Cそのものにあまり慣れてないので、下のに何か胡乱なところがあるんでしょうか?
void Hoge(HWND toolbar) {
int c, i;
TBBUTTON b;
c = SendMessage(toolbar, TB_BUTTONCOUNT, 0, 0);
for (i = 0; i < c; i++) {
if (SendMessage(toolbar, TB_GETBUTTON, i, (LPARAM)&b)) {
printf("%2d : %x\n", i, b.dwData);
}
}
}
>>662 タスクバー(エクスプローラ)は別プロセスなのでTB_GETBUTTONで使う
TBBUTONは共有メモリーを使わないとダメ.
664 :
教えてください :04/07/15 14:46
mciで動画を再生したいんだけど、 動画のためにわざわざ別のウィンドウを用意したりしたくなくて、 ウィンドウの隅っこのほうで動画が動くようにしたい。 んで、動画をウィンドウのどこらへんの位置で再生するかを指定 したりする方法ってないですか?
ない
666 :
教えてください :04/07/15 15:20
ええっマジですか???????? 一つのウィンドウの中で動画を再生する領域とボタンとかコントロールが ならんでる領域がわかれているようなウィンドウって なにか別の方法でないと作れませんか???
667 :
教えてください :04/07/15 15:26
もしやひとつのウィンドウにみえるけど実は中に子ウィンドウを 埋め込んでつくるってことなのかな???
>>664 WINDOWで再生するウィンドウハンドルを指定
PUTで位置・サイズ指定
…だったっけ?
>>667 そう。その「ボタンとかコントロール」も子ウィンドウなわけだし。
>>668 それでもいいけど、リドローその他の問題考えると MCIWndCreate で親ウィンドウを
指定して、スタイルに WS_CHILD 付けとくほうが良くない?
>>658 オセロを作っているんですがゲーム中に打った手をlogに書き込んでいくのですが、
そのlogを保存したいんです。
保存ダイアログボックスを表示させてその棋譜を保存したいんです。
>>671 OPENFILENAME構造体のメンバ調べた?
ファイル名やフルパス取得できるでしょ。
そのlogの出力処理は自分で書かなきゃダメだよ。
>>672 開くの場合開きたいファイル名やフルパスを取得できるからその後の処理はできるなぁ
となんとなく分かったのですが、保存の場合がいまいち分かりません・・・。
例えばオセロというフォルダにオセロ本体とlogというファイルがあった場合、
どの関数でlogを見つけてその中身を別名保存できるのでしょうか・・・。
>>673 うーん、もう少し頭の中を整理したほうが良いと思うよ。
取り敢えずオセロの棋譜から離れろ。 データをファイルに保存する処理で必要な条件をきちんと挙げてみな。 取り敢えず、 (1)メモリ上にあるデータをファイルに出力したい。 (2)フォルダとファイル名は保存ダイアログを表示して選択&入力したい。 (3)フォルダに同名のファイルが既にある場合は別名保存したい。 と言う事か?なんか微妙に違ってそうな気もするんだが…
コンソールアプリケーションの出力をウインドーズのウインドーにする方法教えてください 16ビットと32ビットの両方のcomファイルとかも表示したいです 出来ないと思うけどコンソールアプリケーションを起動したときにコンソールを出さないでできたら またそのやり方もおしえてください
まともなオセロが作れるんならファイル保存くらい簡単だろうに・・ まあオセロの方がまともじゃ(
単に保存ダイアログの出し方がわからんのじゃないか?
>>678 いや、それは
>>646 が書いてる。
>>673 もしかして、オセロのexeのパスを知りたい?
なら、GetModuleFileName()。
Win32スレっぽくまとめると、 ・オセロのプログラムのコード内で、実行ファイル(たぶん EXE?) のパスを知りたいときには GetModuleFileName(NULL) を使う。 ・実行ファイルと同じ場所にあるファイルのパスを得るには、 PathRemoveFileSpec で最後の「ファイル名」を取り除いてディレクトリのパスを得て、 PathAppend でそのファイルの名前をくっつける。 例えば既に実行ファイルと同じディレクトリに "log" という名前のファイルがあったとき、 それを lpszDstPath にコピーする関数は、 void CopyLogFile(LPCTSTR lpszDstPath) { TCHAR rgszLogFile[MAX_PATH]; GetModuleFileName(NULL, rgszLogFile MAX_PATH); PathRemoveFileSpec(rgszLogFile); PathAppend(rgszLogFile, "log"); CopyFile(rgszLogFile, lpszDstPath, FALSE); }
でもlogって名前で決め打ちなんだよね。 ダイアログ開く必要ないじゃん。
マルチバイトとUNICODEを切り替えるのに使うマクロは 標準ライブラリは _UNICODE WindowsSDKでは UNICODE であっていますか?
標準ライブラリってのがC/C++のことなら、一般的にいって知るかヴォケ
>>676 >コンソールアプリケーションの出力をウインドーズのウインドーにする方法教えてください
GUIアプリケーションとして作り直せ。
>16ビットと32ビットの両方のcomファイルとかも表示したいです
意味がわからん。既存のプログラムの表示方法を変更するという意味なら、
そのプログラムをそのように作り直せ。
>出来ないと思うけどコンソールアプリケーションを起動したときにコンソールを出さないでできたら
>またそのやり方もおしえてください
起動後にFreeConsoleでコンソールを切り離せ。
>>676 パイプを作ってそこへ標準出力(必要なら標準エラーも)をリダイレクトさせ、
CreateProcessで対象のコンソールプログラムを起動させる。
(この時に標準出力を継承させる。コンソールを表示させない指定もここでできる)
あとは随時パイプから読み出した文字をウィンドウへ書き出す。
>>683 含みを持たせすぎる問いには答えにくい。
UNICODEマクロは、WinAPIのA(ANSI)系とW(WideChar)系を切り替えるマクロ。
_UNICODEマクロは、汎用テキストマッピングで使用する文字の種類を切り替えるマクロ。
これはVC付属のCライブラリの他、MFC等でも使用される。
>>687 ああなるほど。
TCHAR等とAPIのA系W系の切り替えは
UNICODEマクロで同時に切り替わるものだと思ってました。
>688 TCHARとA/Wは同時切り替えしないとコンパイルエラーになるだろう。 ぶっちゃけ、古いコンパイラとの互換性維持のためにあるんじゃねーの?
>>690 互換性維持のくだりは意味不明だけど、両方セットして切り替えるのが普通だろうね。
実際に切り替えるには、そのマクロ以外にもあれこれ変更する必要があるから、
けっこう面倒くさかった記憶がある(スタートアップ関数も変更したな、確か)。
>692 _inlineと__inlineとか、_asmと__asmとか、 その辺を想像して書いたんだが…。
>>688 winnt.hのTCHARとかはUNICODEで切り替わる。
_UNICODEで切り替わるのはtchar.hの_TCHAR類。
>>691 おお!きっとその辺です。
ありがとうございます。
696 :
デフォルトの名無しさん :04/07/15 22:23
>>685 方法を知らないなら、くだらん回答しなければいいのに
>>696 なんとまあパターンどおりの厨房レスなのか。
自分の質問が質問の体を為してないことぐらい気づけよ。
コンソールベースのテストプログラムから脱却してウィンドウを作ってみたいのか、
古いDOSベースのプログラムをWindowsに移植でもしたいのか、意図がはっきりしてないんだよ。サトリ募集中ですか?
字面どおりに解釈するならパイプでも使ってそのプログラムを起動し、出力をとってからDrawStringでウィンドウに出力結果を描画とか。
これで後で「釣れた」とか抜かしやがったらふざけるのも大概にしろって感じだな。
最初から意味が分からんとだけ書けばいいものを。
699 :
デフォルトの名無しさん :04/07/15 22:46
ツレタ!!
見事に釣られたところで次の質問者ドゾー↓
>>697 ( ´,_ゝ`)プッ・・
上級者ぶって偉そうにしたかっただけなのね。
素直にパイプを使うと答えればいいものを。
CreateCompatibleDCでつくったDCについてる ビットマップはストックオブジェクトです。
えっと分かりにくくてすみません・・。 オセロの盤面はboard[8][8]の配列を作ってそこに黒、白を書き込んでいく。 それと同時に1手目はd5黒、2手目、・・・・という具合にlogファイルに書き込む。 このlogがなぜあるかというと戻りや棋譜を読むことによってあとで感想戦みたいな 物を実装するためにあります。このlogは常に1個しかなく、上書きされていきます。 保存しておきたい対戦の場合はこのlogをダイアログを表示させ、別名にて保存します。 今分からないのはダイアログを表示させ、保存を押した場合何が保存されるのかが 分からないって事です。 680さんの方法のPathRemoveFileSpecとPathAppendでできるのかな・・・
>>704 > 今分からないのはダイアログを表示させ、保存を押した場合何が保存されるのかが
> 分からないって事です。
だからね、保存を押した時に何が保存されるのかは、君が書くコード次第なの。
>>646 を実行して、
>>672 を調べたら、ファイル名とフルパスが取得できるから、
logってファイルをリネームすればいいんじゃねぇの?
と、君以外のみんなが思っている筈なんだが。
開くダイアログも保存ダイアログもファイル名を得るだけだろ なんで前者は分かるくせに後者は分からんのよ?
>だからね、保存を押した時に何が保存されるのかは、君が書くコード次第なの そのコードが知りたかったんです・・・。 ファイルを開くの場合はファイル選択→開く→ファイル名、フルパス取得。 ファイル保存の場合はPathRemoveFileSpecとPathAppend→ファイル名、場所→保存 でいいんですか?
久々にすごいのが現れたな・・・ そもそもファイル入出力はやったことがあるのだろうか。
>>707 1.GetSaveFileName()を実行する。
2.保存ファイルを指定するダイアログが出る。
3.ユーザーがファイル名を入力する。
4.1で引数として渡したOPENFILENAME構造体からファイル名を取得する。
5.そのファイルに保存する処理は君が書く。
オセロのログを出力するAPIなんてないから、
出力したいフォーマットに合わせて自分でコード書くんだよ。
と言うか、”Log”ってファイルを出力するコードは自分で書いたんだろ? なんで別名保存する事に躓くんだよ(´・ω・`) まさかとは思うが、”Log”ってファイルを出力するコードを他人が書いてる ってオチじゃねぇだろうな?
今までAPIをやった事がないんですよ。演習で初めてAPIを使う事になり、 猫でもわかるを買ってよんだんですがいまいち・・・。 いろいろ教えてもらいありがとうございました。 教えてもらったので一度プログラムに組み込んでみます。
つか、API以前の問題だと思うなぁ。
そうは思わないか?
>>713
>>710 えーっとLogってのはオセロを起動すると勝手に作られます。
別名で保存するってのは将棋とかと同じく棋譜を集めるためと、
保存した場所からスタートできるようにするためです。
>>713 そのLogってのには一手打つ毎に保存されてんの?
もしそうなら、ユーザーに保存ファイル名入力させて
Logファイルをコピーすればいいのでは?
「猫でも・・・」ならネットのSDK編の第329章でも参考にしてみ
>>713 で思考の呪いに掛かってしまった…
ムネン アトヲ タノム
orz
>>714 そうです1手目から60手目まで保存されます。
これを使って感想試合や戻りなどできるようになります。
>もしそうなら、ユーザーに保存ファイル名入力させて
>Logファイルをコピーすればいいのでは?
これができればいいんです。 保存ウィンドウの表示→ファイル名、場所記入→
保存をしてLog1みたいな感じで元のLogがコピーできれば作れればOKです。
情報隠しすぎだねぇ。他人が書いたものと自分が書かなきゃいけないものを きちんと提示しないから話がややこしくなると言うのに。
オセロってのはあれか、既にオセロのソフトが存在しているのか? で、そのソフトがLogってファイルを作るんだけど、そのファイルを 別名保存するアプリを作りたいって話なのか? 単に別フォルダにでもコピーすればいいやん、って気がしてきた…
俺は答える気なくした。他のひとよろ。
俺はもう寝るぽ(´・ω・`)
>>721 一昨日のVB6スレと言い今日といい、最近は疲れる奴が多いな…
夏だからか?
いろいろすみませんでした・・・。 これで最後にします。 C書いたオセロではDOSでしか動きません。それをAPIを使って普通に windowsのアプリに変換というか作るというか。 Cならif文でも使ってLogのコピーをリネームしてすぐ作れますが、 APIを使った時には保存ボタンをクリックしたらどうなるとかそういうのが 分からず困っていたという話でした。 714さんが教えてくれた所は結構参考になりそうなので助かりました。 不愉快になられた方々すみませんでした。またこんな自分に付き合って くださった方々ありがとうございました。
mallocの変わりにGlobalAllocを使うメリットってなんかありますか? (クリップボードとかとは全然関係ない単純なメモリ確保です。) 担当者になんで?って聞いたらmallocより効率がいいと えらい人にいわれたらしい。GlobalReAllocとかも使ってる。 MSDNには低速だから使うなって書いてあるし。
強いていうならC/C++で確保したメモリをDelphiで開放するようなことができる。
727 :
デフォルトの名無しさん :04/07/16 02:17
そこでHeapAlloc()ですよ
729 :
デフォルトの名無しさん :04/07/16 04:17
WM_MOVINGとWM_SIZINGが発生する要因はSendMessage系で呼び出さない限り ユーザーのマウス操作によるものだけと断定して問題ないでしょうか?
ALT+SPACE+S→カーソルキーの存在は無視か?
731 :
デフォルトの名無しさん :04/07/16 04:44
MFCフレームワークで、CWinApp, CMainFrm, CChildView という派生クラスを使う事を強要されますけど、どこにどういう機能を置けばいいのかいまいちピントきません。 リアルタイムでレンダリングするスクリーン、キー入力、パラメータ入力用のダイアログがあるので, CWinApp -> OnIdle() レンダラーアップデート, CChildViewへの描画。 CChildView -> キー、マウス入力 CDialog -> CMainFrm::hoge->SendMessage(...) で入力パラメータを送る。 CMainFrm -> SendMessage(...)でクラス間のデータ受け渡し。 っていう感じでやっているんですが、クラスが保持している別クラスインスタンスへのポインタがprotectedになっていたりするので、SendMessage()のバケツリレーみたいになったりして、2度手間3度手間が多くて疲れます。 「プロはこうやる」っていうのがあったら教えてください。
その前に良い事を教えてやる。 ス レ 違 い だ
>>730 そんな機能あったですか、、、
やりたいことはサイズ変更中であれ位置変更中であれマウスが動いてたら
WM_MOUSEMOVEが発生して欲しいのですが発生してくれません
正確にいうとspy++上では発生してることになっているのですがWndProc内のswitch文で捕捉されません
spy++のメッセージ コードはPとなっていて、ヘルプによると
PostMessage 関数によってキューにポストされました。
とあるのですがPostMessageで発行されたメッセージはWndProc内では捕捉されないのでしょうか?
>>732 ほんとだ、Win32じゃん。誤爆しました。MFCスレに落としてきます。
>>723 おまいさんの最大のミスは
>C書いたオセロではDOSでしか動きません。それをAPIを使って普通に
を最初に言わなかった事だ。お陰で大勢の膨大な時間が
無駄に失われてしまった…
DLLから全体をフックするのはフックプロシジャーもDLLに無いとできませんか?
737 :
デフォルトの名無しさん :04/07/16 11:43
USBメモリのシリアル番号を取得するAPIを教えて
738 :
デフォルトの名無しさん :04/07/16 11:55
複数台繋がったキーボードからキー入力を受け、どのキーボードから入力されたのかを 判定したいのですが、どのようなAPIを利用すれば実現出来るのでしょうか? USBキーボード二台(もしくはPS2キーボード1台+USBキーボード1台)を使っての入力を想定しています。
出来ない
おみゃ〜らよ、おみゃ〜らさーん♪
おりはよ、「Slim de Can」を使ってあるボタンをクリックしたらある処理を行わせ、別のボタンをクリッしたら別の処理をおこなわせるプログラムの作成についに成功したよ。
つまり「Slim de Can」はすでにイブントドリブンプログラムがつくれる環境になっているということを自ら証明したという次第よ。
おい、「Slim de Can」はすでに簡単なゲームくらいはころっとつくれるぞ。誰かつくらんか?
「Slim de Can」ってすげ〜な〜。
おりはもう神だね♪どうよ?
http://hp.vector.co.jp/authors/VA015412/
新たなキチガイの登場か
無理ですか・・・。DDKまで降りていけばなんとかなりそうなので色々調べてみます。
降りるとかいうな馬鹿
>>745 同僚とうまくいってます?ある程度イメージ化した話が通じる人でないとこの業界ではうまくやれないと思うんですが・・・。
通じてはいるだろ
人の心配をする前に自分の(ry
クライアント領域をマウスが移動して発生したWM_MOUSEMOVEも spy++のメッセージ コードはPとなっていてこちらはWndProcで捕捉できていました WM_SIZNG,WM_MOVING直後にspy++上で観測されているWM_MOUSEMOVEだけがWndProcで捕捉できません spy++が嘘をいってるとしか思えないのですが、WndProcでも補足できる方法はありますか?
>>749 GetMessage で取ってきて
・DefWindowProc を呼ばない(メッセージを取り除いちゃうかもしれないから)
・TranslateMessage も呼ばない(同様)
・DispatchMessage もしない(同様)
で試してみた?
サイズ変更/移動中って、システム内部のローカルなメッセージループに いるんじゃないのか?
>>750 GetMessageで取ってきてCallWindowProcで直接呼び、WM_SIZNGとWM_MOVINGはretun TRUEとし
DefWindowProcを呼ばないようにしたのですがだめでした
>>751 しかしながらspy++はサイズ変更中や移動中であってもWM_MOUSEMOVEを検出できているのですが
ローカルなメッセージループにフックのようなものを仕掛けているのでしょうか?
DLLはparagma dataを使わないで変数をプロセスと共有するにはプロはどうやるのですか?
別プロセス? それならファイルマッピング
同プロセスです
JoyAdapterのような、キーボード入力等を他の入力にするプログラムを作っているのですが、 非アクティブ状態のプログラムでどうやってキーの入力を受け取れるのでしょうか?
DLLフックに決まってるだろ
>>758 例えばDLLの中の変数をDLLメインで宣言定義して、その変数のポインターを
DLLメインの戻り値でWINメインに渡して使うということですか?
それともそれ以外に便利な方法ありますか?
//dll.cpp int var; int* getvar() { return &var; } //exe.cpp int* pvar = getvar();
よくわからんけど、__declspec(dllexport)、__declspec(dllimport)は 使っちゃいけない話になっているのか?
素直に __declspec(dllexport) でいいじゃん。
//dll struct vars { /* 色々 */ }; vars* init() { return (vars*)malloc(sizeof(vars)); } void func(vars* p) { /*色々*/ } void term(vars* p) { free(p); } //exe vars* p = init(); func(p); term(p); とか。
>>760 761 762 763 やっぱDLLの中の変数はグローバル変数じゃないと駄目にきまってますよね?
オート変数はどうやっても無理だが。
staticでもっておく。うげぇっ。
__declspec(dllexport)、__declspec(dllimport)でどうやってデーターを共有するんですか? これはDLLの関数がDLLにあることをコンパイラに知らせる命令ですよね?
関数だけじゃねーよ ちょっとは調べてみないんですかそうですか。
>>767 それが気に入らないんなら、DEFファイルに書いて
変数のエクスポートでも出来ると思うが。
変数もエクスポートできるんですか? dll __declspec(dllexport)int a=3; exe __declspec(dllinport)int a; のように使えるとはしりませんでした しらべてみて分からなかったらまた聞くと思います いろいろ質問ありがとうございました
771 :
教えてください :04/07/16 19:04
MCICreateWnd()で作ったウィンドウの親ウィンドウ内での表示座標を 変える方法はないでしょうか?? どーしても動画と同じウィンドウ内にアレコレ表示したいので 動画を再生する領域をちょっとずらすか親ウィンドウ内に他のものを表示 する空間を空けたりしたいのですが どうすりゃいいのか途方にくれとりまする助けてえ
HBITMAPをファイルに保存する場合は、どのようにしたらよいのでしょうか?
そろそろ埋めるよ
HDCをファイルに保存したのですが、読みこもうとしてもうまくいきません。 どうしてくれますか。
>>775 ( ´,_ゝ`)プッと嘲笑って差し上げます。
windows.h とiostreamなどの標準ライブラリーは一緒に使うのは普通ですか?
>>771 MoveWindow ではダメですかそうですか。
windows.h とiostreamなどの標準ライブラリーは、どちらを先にインクルードしたらいいんですか?
windows.hは最初に
どっちでもいい。 順番が問題になるのはwindows特有のヘッダのみ。 例えば × #include <hidsdi.h> #include <windows.h> ○ #include <windows.h> #include <hidsdi.h> のように。
stringは便利そうですよね
724です。
>>725 やっぱ、Cでは普通のメモリ確保はmallocで決まりですよね。
メモリ確保の他にも、WIN32とランタイムルーチンで対応する関数がある場合に、
好んでWIN32を使う人がいますが、理由を聞くとAPI直接呼んだほうが
効率がいいからということをいいます。これってどこまでほんとうなんでしょうか。
fopenの代わりにCreateFileとか使ってると私は、なんで?と思ってしまうのですが。
現実に有意な差があるかといわれれば無いが、fopenにしたところで最終的にはCreateFileなんかを呼んでいる訳で、かすかであれ効率がいいのは事実ではあるな。
メモリはランタイムがブロックのプールをしている可能性もあるから ネイティブ呼び出しが早いとは限らない。
ファイル読込もfopenがバッファリングしてますな。
プールも結局失敗するならやらないほうが効率よかったりもするが。
>740 DirectInput
>>784 コンソールプログラムのことを言ってんのか?
おまいは、Windowsプログラマーじゃないだろ。
COMとか、書いたことないのか。C runtime使いたくないんだよ。
Windowsプログラムなら、Win32APIを使うのが普通だろ。
Cライブラリ=コンソール環境ではない。 Cライブラリを使わないスタイルを否定はしないが、無根拠にそれが普通とかいうと蹴飛ばすぞ。 そういえば、CライブラリのMS固有関数って、このスレの範疇?
793 :
デフォルトの名無しさん :04/07/17 10:58
794 :
デフォルトの名無しさん :04/07/17 11:05
C++ライブラリーのほうがいいのにCライブラリーをあえて使うわけはなぜですか?
釣れた!
>>795 C++のも、Cランタイムライブラリに含まれているわけですが・・・
最近、面白いのが多いね
>>797 Cはprintf() c++はcoutを使う
グローバルフックのプロシジャーはグローバルフックをしておけば 本体で別のことしてる間も勝手に実行されるマルチスレッドみたいなものですよね?
ポップアップメニューの文字の高さを変更するにはどうしたらいいの?
>>800 というか>795に意味が含まれてないから誰もコメントできないかと
グローバルフックは結局DLLのインスタンスハンドルだけを取得すれば winmainの中でもグローバルフックできるんですか?
>>801 グローバルフックの場合は本体とフックプロシージャのスレッドは異なるが、
そもそも各スレッドの存在するプロセス空間自体が違うので、
マルチスレッドというよりはマルチプロセスというほうが近い。
>>804 必要な情報さえ集まるのであれば、フックを仕掛けるの自体はどこででも。
コントロールキー押したまま文字キーを押したことをウインドプロシジャーで処理するにはどうやりますか?
GetKeyStateか、よくわかった
808 :
デフォルトの名無しさん :04/07/17 15:53
おい、まだ腐ったJavaScript破棄してないのかよ。ダサダサで無駄に敵を増やすだけだってのが分からないのか?
効率を削減。効率を削減。効率を削減。効率を削減。
>>809 うむ。自分としては、
猫プロ、創プロみたいな、ただソースのページに飛ぶシンプルなのがいい。
812 :
デフォルトの名無しさん :04/07/17 23:24
GetAsyncKeyStateもちゃんと乗ってまうs!!!
のってマウス
814 :
デフォルトの名無しさん :04/07/18 00:06
作業時間を増幅すんのか。おじちゃん嬉しくて差し戻しちゃうよ!
あまりにもしつこいので見てみたよ。 結論:使い物にならないクズ。
>>814 あぼーんし辛いからコテ使ってくれないかな?
URIであぼーんしろよ
819 :
デフォルトの名無しさん :04/07/18 08:34
どうしてもWM_LBUTTONDOWNがきた時点でヒットテストとかをしてキャプションをドラッグしてるように みせかけたいのですがどうしたらよいでしょうか WM_LBUTTONDOWNがきたらSendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,screenpos)としてるのですが うまくいきません
>>820 WM_NCHITTESTでは適当にHTOBJECTとかでも返して
WM_NCMOUSEMOVE,WM_NCLBUTTONDOWN,WM_MOUSEMOVE,WM_LBUTTONDOWNなどで対応したいのです
WM_NCHITTESTでHTOBJECTを返すと、とりあえずノンクライアント領域と判断されるらしく
WM_NCMOUSEMOVE,WM_NCLBUTTONDOWNなどのノンクライアント領域用メッセージが送られてきてそこで独自の
ヒットテストをおこなっているのですが、それだとボタンコントロールが押された、離されたなどの
処理がされなくなってしまいました.そこでWM_NCHITTESTでHTCLIENT以外だったらHTOBJECTを返し
HTCLIENTだったら素直にHTCLIENTを返すようにしました.そうすると今度はHTCLIENTだった場合に
WM_MOUSEMOVE,WM_LBUTTONDOWNなどのクライアント領域用メッセージが送られてきた時点ヒットテストなどをしなければ
HTCAPTIONだのHTTOPだのと偽れなくなってしまい、このような質問をさせていただきました
非常に文章がわかりずらくなってしまってすいません
>>819 >キャプションをドラッグしてるように
と書かれているので、別にキャプションを右クリックして出てくるメニューは必要ない?
もしそうであるなら
WM_LBUTTONDOWNの時にGetCapture(hwnd)でマウスをキャプチャーして
WM_LBUTTONUPされた時にReleaseCaptureしてMoveWindowなどで移動するといいんじゃないかな
823 :
デフォルトの名無しさん :04/07/18 10:21
質問です。 少し大きめのアイコン(24×24ぐらい)が表示されるツールバーを作りたいのですがよく分かりません。 IDB_STD_SMALL_COLORをつかって標準ビットマップを使う方法は分かったのですが、 自分で用意した画像を使ったその方法が分かりません。 どなたか教えてください。 (ちなみにツールバーを作る時はCreateWindowExを使っています)
824 :
デフォルトの名無しさん :04/07/18 10:33
CryptAPIで証明書ストアに関する説明が載っている 日本語サイトってないでしょうか?
>>823 >自分で用意した画像を使ったその方法が分かりません、というのは、
ビットマップの大きさを指定する方法がわからないのか、
ビットマップを読み込む方法がわからないのか、
何がわからないのかわからないのか、
そもそも何がわからないんだ。
いや画像の表示は出来てます。 問題はボタンが自分が指定したいサイズより小さいことです。 だからその指定方法を教えて欲しいです。
あ・・・TB_SETBITMAPSIZEを送ったら出来ました。 お騒がせしてすいませんでした(汗
>>822 すみません
今後HTSYSMENU,HTMINBUTTON,HTMAXBUTTON,HTCLOSEなどのヒットテストにも対応したいと
考えているので、SendMessageなどでメッセージを送るなどして具体的な処理はシステムにお任せみたい
な感じでお願いします.
832 :
デフォルトの名無しさん :04/07/18 13:12
APIの質問とはちょっと違うかもしれませんが MSDNでPSDKをDownloadした後 フォルダ削除したら UnInstallは出来たのですが ReInstall出来なくなってしまいました どうすればいいでしょうか?
>>819 >>831 なんでそうする必要があるのかかいた方がいいよ。
もっと簡単な実現方法があるかも試練から。
>>831 元々普通にウィンドウを作成すれば
HTSYSMENU,HTMINBUTTON,HTMAXBUTTON,HTCLOSEなどのヒットテストには対応してるので
具体的な処理はシステムにまかされてます
837 :
デフォルトの名無しさん :04/07/18 13:28
>>836 メニューとかエッジとか付いてない窓作って自前でその辺を描画するとかそんな用途なんでは無かろうか。
まぁ、834への解答次第か。
>>834 GUIライブラリみたいな物を作ろうとしていて将来的にはクロスプラットフォームなものにしたいと
思っています.既存のクロスプラットフォームGUIライブラリ代表としてfox toolkitをすこし調べたのですが
HitTestに対応するものがないように思えます.ここから勝手な想像なのですが、XウィンドウシステムでHitTestなど
の処理をするのはかなり面倒だからHitTestがないと推測しました.
そのような処理のむずかしいものをひとつのイベントとして定義するより引数として渡すほうが
いいと判断しました.
具体的には
struct mouse_eventargs:base_eventargs
{ unsigned int button,hittest; long x,y; };
こんな感じのものを参照渡しでユーザー定義のコールバック関数に渡しその中で
ユーザーがhittestにキャプションや最大化ボタンやサイズ変更境界などを表す定数を
代入して偽るみたいな感じなのですがWM_NCMOUSEMOVEなどのノンクライアント領域用と
WM_MOUSEMOVEなどのクライアント領域用のメッセージは同じコールバック関数onMousemoveを
呼び出す形になっています.そこでクライアント領域用のメッセージでもヒットテストなどを
してやることが必要になってしまいました
>>836 そのはずなのですが819のようにデフォルトのHitTestがHTCLIENTと判定しWM_LBUTTONDOWNが送られ
てきたところでSendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,screenpos)としてもキャプションを
操作してることにはなってくれませんでした
841 :
デフォルトの名無しさん :04/07/18 14:23
CreateWindow関数の第一引数ってシステムクラスを使うときのためにあるって認識でいいですか?
あ、RegisterClassで登録したWNDCLASSEX 構造体のlpszClassNameを読み出すためにもあるんですよね?
SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,screenpos) を SendMessage(hwnd, WM_NCHITTEST, HTCAPTION, screenpos)じゃだめ?
>>841-842 RegisterClassで登録したウィンドウクラスを使うためには第一引数で同じ文字列を入れなくてはいけないってこと
>>841 間違ってはいないが限定しすぎ。
本来的には、似た機能のウィンドウを複数作る時に手間を省くためにある。
WindowClassはウィンドウの型紙で、CreateWindowは型紙を元にウィンドウを作る。
BUTTONあたりはシステムで型紙用意してくれているのでそれ使ってCreateWindowすればいいし、
1から自分でウィンドウ作るなら自作のWindowClassをRegisterClassで登録してCreateWindowする。
システム製でも自作でも、型紙部分は一度登録しておけば何度も使いまわせる。
C++知ってるなら、WindowClassは文字通りウィンドウのクラスで、
CreateWindowはそのクラスのインスタンスを作るもの、と思えば分かりやすいかも。
(この場合のインスタンスはHINSTANCEとは別の概念だから間違うなよ)
できたーーーwwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─ !!
>>840 ちがいますよ(w
>>843 WM_LBUTTONDOWNがきたら
CallWindowProc(c->defwndproc, c->handle, WM_MOUSEACTIVATE, 0, MAKELPARAM(HTCAPTION,WM_LBUTTONDOWN));
としたらできました.
レスしてくださった皆さんありがとうございました
っとおもったら case WM_NCHITEST: return HTCAPTION; を消し忘れてただけでした.............
ダイアログベースのアプリケーションで、 仮想キーコードを文字として表示したいのですが、 どうやって変換すれば良いのでしょうか?
>>851 sprintfで文字列に変換して表示すれば?
0-9、A-Zなら仮想キーコード=ASCIIコード、そのまま じゃなきゃMapVirtualKey それ以外のキーを文字で表示したくて LPARAMが使えるならGetKeyNameText 駄目なら自分でマップ
lParam の何ビット目が1か0なのかを調べないといけない場合どうやるんですか?
>>855 もうちょっとヒントください
お願いします
>>856 &で解らないならC言語を一からやり直すべき
やってないならCをやるべき
>>857 Cもアセンブラもやったけど分かりません
教えてください
そんなエサで(ry
>>854 bool isNbitOn(unsigned lParam, unsigned n)
{
return (lParam >> n) & 1;
}
>>860 Nビット右にシフトして一番下のビット以外を0にするということですね
僕の考えでは0000100000みたいな2進数が使えないから出来ないと思ってましたが
そういう頭のいいやり方があったんですね
オーナードローをサポートしてないコントロールの描画をカスタマイズしたくて サブクラス化してWM_PAINTを乗っ取りたいのですが、 このときコントロールを描かせるためCallWindowProcで元のwndprocを呼び出した後 BeginPaint等をしても、当然更新領域が空なので描画可能なHDCが取得できません。 このばあい、GetDCして独自の絵を上書きするのが正しいのでしょうか?
>>861 いや、0000100000(何ちゅービット数だ)を作りたいだけなら 1 << 5 でいいんだけどね。
ビットチェックの場合は0/1にした方がboolとして扱えるから。
>861 お前の頭が悪いだけだ。
>>863 それも頭のいい考え方ですね
あとすこしで電卓もって10進数に変換するところでした
・タスクマネージャなど、プロセスのメモリ使用量が見られるものを用意。 ・VC++を使ってテンプレートよりWindowsの標準的なアプリケーションを作成 ・そのままビルドして実行 実行直後のメモリ使用量は4MB程度で、最小化すると300KB程度まで減少、 再度表示させると1.2MB程度になってるわけで、こいつはなぜでつか?
最小化されたアプリはページアウトされるから
>>867 「仮想メモリサイズ」を表示させてみれ。
コールバックが沢山あるのですが、 LRESULT CALLBACK Age( HWND ... LRESULT CALLBACK Sage( HWND ... LRESULT CALLBACK Hoge( HWND ... typedef LRESULT CALLBACK ( *HogePtr )( HWND, UINT, WPARAM, LPARAM ); const HogePtr HogeHagePtr[ ] = { Age, Sage, Hoge, } のように関数ポインタにしようとするとエラーが出てしまいます。 どうすればいいんでしょうか?
>>870 typedef LRESULT (CALLBACK *HogePtr )( HWND, UINT, WPARAM, LPARAM );
の間違いじゃね?
>>871 CALLBACKは括弧の中でしたか・・・勉強になりました。サンクス。
873 :
デフォルトの名無しさん :04/07/19 02:14
SHGetFileInfoで取得したアイコンのハンドルはDestroyIconで破棄するべきでしょうか? いろいろなサイトを見てみると破棄しろという記述を見ますが個人的にはしてはいけないような気がします。 理由は、MSDNに書いて有るSHGetFileInfoのSHGFI_ICONの説明で > Retrieve the handle to the icon that represents the file and the index of the icon within the system image list. とある為です。 システムイメージリストのアイコンなら削除してはいけないと思うのですが。
>>873 すべき。つーかしろ。
こうも書いてあるが。
>The handle is copied to the hIcon member ・・・
このコピーは単なるコピーじゃなくてCopyIcon/CopyImageのコピー。
それにDestroyIconしろって下の方にあるし。
>>875 あー、MSのサイトには確かにそう書いて有りますね。
もってるMSDNは古いのか書いてませんでした。
Thx.
しっかし、 > The handle is copied to the hIcon member of the structure specified by psfi, > and the index is copied to the iIcon member. 前者のcopiedと後者のcopiedの意味が違うなんて罠だ。普通、わからんぞ。
>>862 wParam == NULL なら BeginPaint で HDC を取得
SaveDC
CallWindowProc で元の WndProc を呼ぶ (wParam に HDC を入れる)
RestoreDC
追加の描画をする
EndPaint (BeginPaint を呼んだ場合)
return
879 :
デフォルトの名無しさん :04/07/19 11:58
ネットワークを経由して他のパソコンの共有フォルダに ファイルの作成とライトをしようとしています。 APIを使って実現するにはどうしたらいいですか?。
"作成と書き込み","クリエイトとライト"のどちらかに統一しる
881 :
デフォルトの名無しさん :04/07/19 12:13
クリエイトでおねがいします。
それならCreateとWriteのほがいいと思う ライトって見たら電気を思い出す低級魔術師でした
通信網を経由して他の端末の共有・・・ フォルダって何だ?
>>879 WNetAddConnection()
WNetAddConnection2()
WNetAddConnection3()
とか?そういう話じゃない?
>>879 CreateFile("\\\\コンピュータ名\\共有フォルダ名\\残りのパス"ってできない?
通常、フォントの幅(lfHeight)は0を指定すると思いますが 選択用のDCを作らずに幅を取得、または計算する方法ないでしょうか?
無い
ttfでも読んで解析すりゃええやん。
その解析方法を聞いてるんだろ
質問者がその態度じゃ誰も解答してもらえませんよ 穏やかにいきませう
質問がダサイ以上回答がダサくなるのは必定。
文字列の幅のサイズを測るAPIってなかったっけ? あれはHDC必要なんか
BOOL GetTextExtentPoint32( HDC hdc, // handle to DC LPCTSTR lpString, // text string int cbString, // characters in string LPSIZE lpSize // string size );
解決?
>>895 > HDC hdc, // handle to DC
だから、解決してないでしょ
Win32APIスレに質問してるんだし HDCは使える環境であると仮定されてるんだし HDC使えばいいんじゃね? 何か使えない理由でも?
>>893 文字幅じゃなくて、lfWidthに指定する幅を取得したいんですよ。
TEXTMETRICのtmAveCharWidthだと思うのですが。
lfWidth=0で作成したときとの比がWidth:Height=2:1のフォントを作成したいから、どうしても幅を取得したいわけです。
使いもしないオブジェクト(選択用DC、基準フォント)を作るのはどうも気が進まないので。
ぼくわホントクラスをつくて各インスタスごとにホントのハンドルと 互換ヂーシーのハンドルをもつようにしてす、
886=898で、他の人は関係ありません。 って言っても、この流れは止まらないか。
チャーリィ(あるじゃーn(ry)登場
>>898 くりえいとのときに固定ぴっちを指定するのはだめなんですか
このすれわなぜとまているのですか。
>>898 何がやりたいのかさっぱりわからん。
lfWidthが0だとフォントの都合のいい幅にしかならんから、
フォント次第では永遠にW:H=2:1になることなどありえんし、
第一可変幅フォントはどうするんだ? 固定ピッチしか考えてないのか?
説明不足すぎ。
>>906 全角:半角が2対1ではないです。
基準フォントと比較して幅が2倍になるってことなんですが、うまく説明できてませんでしたか。
基準フォント MS UI Gothic lfHeight=-n, lfWidth=0 で作ったフォントのサイズを Width=w, Height=h とすると、
作成したいフォントのサイズは Width=2w, Height=1hとしたいわけです。
固定ピッチでもプロポーショナルでも単純に横幅2倍のフォントを得たいのです。
もっとシンプルに >lfWidthが0だとフォントの都合のいい幅にしかならんから この都合のいい幅の2倍の幅が欲しいのです。
何?横倍角文字でも表示したいの?
>>909 ちょっと違いますが、そんな感じです。
基準の絵を横2倍に伸張したのでは解像度が低くなるので、
フォント作成の時点で横2倍のフォントが欲しいのです。
>>910 基準フォントって何?
アプリ起動時からDCに割り当ててあるフォントの話なら、普通にGetDCして幅取ればいい。
これに関しては他に方法はないだろ、DC以外情報持ってないんだから。
(それとも、GetDCしたくないがために、システム設定からフォント情報拾ってくる手間をかけるつもり?)
ただこの仮説だと、
> 使いもしないオブジェクト(選択用DC、基準フォント)を作るのはどうも気が進まないので
の部分が意味不明になる。幅取るだけならSelectFontの必要がないから。
自分で「基準として」設定したフォントなら、って、このケースはありえないよな。
自分で知ってるはずなんだから。
ますますわけがわからん。最初っから、省略なしで、説明しなおしてくれ。
>>911 lfWidth=0でCreateFontをした結果得られる最適な幅を持つフォントを基準フォントとします。
この基準フォントは、任意に選択可能であるものと思ってください。
>>911 で言う、自分で
「基準として」設定したフォントです。
で今回の質問ですが、この基準フォントの横倍角のフォントを作成したいのですが、
lfWidthに指定する値をどうやって求めればいいのですか?
その際、基準フォント自身は一切使われる事が無いので実体はありません。
>自分で知ってるはずなんだから。
知らないから、それを得る手段を探しているのです。
SetWindowsHookEXの引数のWH_KEYBOARD_LLがwindows.hはincludeしてあるのに使えません なぜ使えないのですか? 教えてください
ターゲットバージョン未指定じゃないのか、と脊髄反射
(
>>912 の続き)
LOGFONT lf;
CHOOSEFONT cf = { sizeof(CHOOSEFONT), 0, GetDC(0), &lf, 0, CF_SCREENFONTS };
::ChooseFont(&cf);
lf.lfWidth = ???;
::CreateFontIndirect(&lf);
倍角フォントを作成するために、
???でするべき事を教えてください。
そーいえば2000とかじゃないと使えないとマイクロソフトにかいてありました どうやってターゲットバージョンをしていしますか、おしえてください
#define WINVER 0x500←2000 #define WINVER 0x501←XP #define WINVER 0x502←2003Sv(?)
#define WINVER 0x500 をwindows.hの前に定義するでいいんですよね ありがとうございました
>>915 実際にフォントを作ってDCに選択しない限り、
何のフォントがマップされるかわからないし
平均幅だって知りようがないと思うよ。
ダメ元でEnumFontFamiliesでもしてみれば?
実際はNTシリーズなら全部対応してるんで、 #define WINNT でいいのかもしれない(未確認)
>>919 作成した時点だけではなく、デバイスコンテキストに選択した時点で
使用されるフォントの本当の実体が決定されるって言う事ですか?
>>921 そう。
SelectFontしてDCに選択させるまで、フォントの「本当の」幅を得る方法はない。
なぜなら、CreateFontで作成するのはデバイスに独立した論理フォント、仮のフォントだから。
論理フォントをDCで選択することではじめてDCと物理フォントが結びつき、
その時点ではじめて物理フォントの幅が得られる。
物理フォントがどういうものになるかは、選択するデバイスの特性に依存する。
今のビデオカードのようなラスタデバイスなら論理フォントに近い属性のものになりうるが、
(これは極端だが)昔のキャラクタ端末のようなものなら論理フォントでどう指定しようと
物理フォントは特定の特性しか持ち得ない。
逆に、ベクトルプロッタなら「本当に」論理デバイスに忠実な描画ができる(かもしれない)。
こういうさまざまなデバイスを統一的に扱うことを前提としてGDIは設計されているので、
論理オブジェクトでできることはいろいろ制限がある。
GetDeviceCapsでも眺めれば、そんな歴史の遺物の一端がみられるよ。
Borland C/C++、WindowsXPです。 ISHELLFOLDER型のポインタのLPSHELLFOLDERで EnumObjectを使いたいのですが LPSHELLFOLDER *lpShellFolder; SHGetDesktopFolder(&lpShellFolder); lpShellFolder->lpVtbl->EnumObject (lpShellFolder,hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDER | SHCONTF_INCLUDEHIDDEN, &lpEnumIdList); となってますが エラー E2316 ex.cpp 129: 'lpVtbl' は 'IShellFolder' のメンバーではない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) と返されてしまいます。 始めにshlobj.hをインクルードしてるので、shlobj.hの中身を読んで見ましたが 思わしき関数を見つける事が出来ませんでした。 Borland C/C++の場合はなんと言う名前なのでしょうか?
>>924 C++なら直接lpShellFolder->EnumObjectで行けるんじゃないの?
>>925 エラー E2316 ex.cpp 129: 'EnumObject' は 'IShellFolder' のメンバーではない(関数__stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
と返されてしまいました
どうやら違うみたいです
>>924 EnumObjectじゃなくてEnumObjectsだが。
>>927 >エラー E2227 ex.cpp 132: __stdcall IShellFolder::EnumObjects(HWND__ *,unsigned long,IEnumIDList * *)
>の呼び出しに余分なパラメータがある(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
というエラーに進展しました
あとは自力で何とかしてみようと思います
お礼言うの忘れましてすみません。 有難うございました。
ついでにエラーも出ないようなったので報告 lpShellFolder->EnumObjects (hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &lpEnum); としました
Eventがシグナルか非シグナルかを調べるにはどうやればいいですか?
>>931 WaitForSingleObject(event, 0);
SetEvent()をグローバルフックプロシジャーの中でやっても プログラムの中のWaitForSingleObject(event,INFINITE)が止まったままです event handleをDLLに渡して使ってます わかりません教えてください
>>934 Handle は作成したプロセスでのみ有効なので、作成したプロセスの PID を共有しておいて、
フックされたそれぞれのプロセスで DuplicateHandle して、当該プロセスで有効なハンドルを
得る必要があります。
>>935 はい、やってみます
ありがとうございました
>>934 =931?
ようするに同期とりたい訳でしょ?
だったらウィンドウメッセージを使うと吉。
windows2000以降ならウインドウの透明化が簡単にできるらしいのですが、 98でも透明化することはできますか?
HBITMAPを使って、ビットマップのあるピクセルの RGBを得るにはどうすればよいのでしょうか?
940 :
デフォルトの名無しさん :04/07/20 17:50
FindFirstChangeNotificationでは、 監視するファイルの拡張子を指定できませんか?
>>938 Windows 2000 でできるようになった方法は、Windows 98 では使えない。
みーたんは知らん。
>>939 できる。
>>940 API を見ればわかる通り、できない。
>>938 APIの機能としては存在しない。自分でガリガリコード書く必要あり。
>>939 適当なDCにSelectBitmapしてGetPixelとか。
>>940 できない。NT系のみだがReadDirectoryChangesWでごそごそやる手はある。
943 :
デフォルトの名無しさん :04/07/20 18:41
FindFirstChangeNotificationで拡張子指定は難しいですか。 では、ある程度の時間間隔でマージされたイベントを受信したいのですが、可能ですか?
可能だよ。自分で適当にイベント無視すりゃいい。
お答えありがとうございました
mouse_event以外の方法で強制的にマウスをクリックさせたりする方法は無いでしょうか?
いま、ちょっとしたいたずらをするプログラムを書いています。 やりたい事は、 いきなりメモ帳が起動される。←これはできた。 ↓ 自動的に"むだむだむだむだ"と入力され、変換される。うまくいけば"無駄無駄無駄無駄"になる。←これができない。 メモ帳のEDITコントロールにWM_KEYDOWNとWM_KEYUPを送ってみました。 たしかにメッセージが送られていることを、spy++を使って確認したのですが、なぜか文字が入力されません。 WM_SETTEXTという手もあるんですが、一文字一文字入力されていったほうがインパクトがあると思うのです。 一文字づつ文字を増やしてコピーというのも、変換の動作が出来ませんし keybd_event()だと、アクティブでないといけないし、 どなたか方法を知りませんか?
>>948 WM_TIMER
「むだむだ」の上に「無駄無駄」を上書き
そーゆーいたずらプログラムは、自分で考えないと意味がない。 出来ないなら、いますぐやめろ。
>>949 それ以前に、半角英数字すら入力できないのですが。
↓こんな感じです。aと入力したいのですが……
#define CHAR_A 0x41
SendMessage(notepadHwnd, WM_KEYDOWN, (WPARAM)CHAR_A, NULL);
SendMessage(notepadHwnd, WM_UP, (WPARAM)CHAR_A, NULL);
>>951 遊びみたいだからズバリは言わないでおくけど、Spy++でメモ帳をよーく見てみよう。
× WM_UP ○ WM_KEYUP
>>951 面倒くさいことしなくても(WPARAM)'A'でいいだろ
>>952 もっと、ズバリと手取り足取り教えてください。
頭が悪いのでspy++見てもわかりません。
SendInputとか使わないの?
誰か頭悪い漏れに教えて下され。 16bitカラーのスクリーンをキャプチャした時、BITMAPINFO::bmiColors にセットすべき、 3つのDWORD値はどうやって取得すれば良いのですか。
>>935 名前付きイベント作ったほうが簡単じゃね?
>>958 キャプチャって何? スクリーンのDCからBitBltしてきた物? キャプチャライブラリの出力?
bmiColorsは3つのDWORD値などではないが、いったい何をセットする気だ?
そもそもそのHBITMAPは何なのだ? キャプチャの結果? それともそのコピー先?
俺も頭悪いから、おまえさんが何をしたいのかさっぱりわからん。
bmiColorsに三つっていったら、BI_BITFIELDSの事だろうと想像は付くが。 そんなマンドくせーフォーマット使うよか、24bitで受けた方が話は早いと思う。
>>958 試してないけど、ドキュメントには、
BYTE bmiBuffer[ sizeof(BITMAPINFO) + sizeof(RGBQUAD)*3];
BITMAPINFO* pBMI = (BITMAPINFO*) bmiBuffer;
ZeroMemory(pBMI, sizeof(bmiBuffer));
HDC hdc = GetDC(NULL);
GetDIBits(hdc, (HBITMAP) GetCurrentObject(hdc, OBJ_BITMAP),
0, 100, NULL, pBMI, DIB_RGB_COLORS); // 0と100は適当
とかすれば BITMAPINFO を得られるようなことが書いてある。
963 :
デフォルトの名無しさん :04/07/21 12:43
VirtualAllocができない。 VirtualAlloc(NULL,512000000,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE); メモリー3G、XP−SP1でできない NT−SP6ならOKだ。誰か助けてくれ!
>>963 512MB近くの連続領域は運が良くないと取れないと思うぞ。
32bit Windows ではユーザプロセスは標準では 2GB の仮想空間しか持
てない。その中に不連続に exe や DLL がマップされる。
Windows 2000 以降だったら、3GB モードを使えば確保できる確率は上
がるかも。
ウインドウの外枠を透明にすることってできますか? 子ウインドウの枠を消していろいろやりたいんですが・・・
WS_POPUP
EnumWindowsで取ったウインドーハンドルから そのウインドーがどのプロセスのものか調べるにはどうやればできますか? 教えてください
タイトルバーに付いてるシステムボタン(クローズとか)を、 完全に無反応にすることって可能でしょうか? (ボタンが機能する状態と、無反応の状態を切り替えたい) 押しても閉じない状態まではできるんですが、それでも ボタンを押したままの状態だと制御がWINMAINに戻ってこなくて・・・ メイン部分を別スレッドにするとかしないとダメ?
GetSystemMenuして、SC_CLOSEを無効化
>>963 脇道にそれるけど512MB=512*1024*1024だからそれだとちょっと足りない。
>>970 >>971 ボタンをdisableやgrayedにして機能しなくすることはできたんですが、
これだとボタンの上でクリック(ドラッグ)すると、放すまで制御が
WINMAINに戻ってこないんですよね。
ボタン押されてもMAINのコードが止まらないようにしたいんですよ。
WM_NCHITTESTかな?
できた……。
>>968 GetWindowThreadProcessId()
>>975 ウインドーハンドルからプログラムのEXEファイルの名前が知りたいのです
それをやるにはどうやりますか?
GetModuleFileNameのような気がしたのでやってみます 違ってたらおしえてください
>976 MSのKBにまんまその回答があったなぁ。 GetModuleFileNameはローカルプロセス専用だった気がする。
>>977 それはモジュールハンドルやインスタンスハンドルを引数に取るんでウィンドウハンドルは無理です。
?
やっぱりGetWindowThreadProcessId()してOpenProcessしてEnumProcessModulesしてGetModuleFileNameExのような気がしてきた
キーボードの左キー(VK_LEFT)を押しながら、 'Z'キーを押した時っていうのはどう表現すればいいですか? 可能なのでしょうか
983 :
デフォルトの名無しさん :04/07/21 21:43
SendMessageとPostMessageってどう違うの? 呼び出し側に制御をすぐに返すのとそうでないのはわかりますけど それだけの違いではないですよね?
大雑把に言うと、 Sendはその内部で直にウインドウプロシージャを呼び出し、 Postはメッセージをキューに入れるだけで、そのうちGetMessageなどで処理されるのを期待する。 と、俺はこんな感じに捉えているのだが。
>>982 表現はできているじゃないか。
状態を取得したいなら GetKeyboardStatusとかそんなAPIがあった気がする。
>>985 WM_KEYDOWN内でGetAsyncKeyState()関数の組合せで出来ました。
ありがとう。
987 :
デフォルトの名無しさん :04/07/21 22:59
>>986 惜しい、その場合はGetKeyStateだ。
>>987 その違いが理解できないなら使い分ける必要は無い。
非同期と動機の違いで、
同期のSendMessageは戻り値を受け取る事が出来、
非同期のPostMessageは、優先順位に応じて最適なタイミングでの処理が期待できる。
いくつか質問させて下さい。 1.ウィンドウを移動できないようにするにはどうすればいいか? WM_MOVING等のイベント拾って無視しても無駄でした。 2.ウィンドウシェードをやりたいのですが、その方法は? ウィンドウサイズを0にしたりボーダー+キャプションの高さに しても無理でした。 よろしくお願いします。
次スレ立ててきてくれたら教える
>>991 1.WM_WINDOWPOSCHANGING
2.WM_WINDOWPOSCHANGING/WM_GETMINMAXINFOで妙なことしてなければ普通にサイズ変更するだけ。
埋め
生め
生き
998
今だ!999ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
やたー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。