1 :
デフォルトの名無しさん :
2006/03/03(金) 22:23:36 スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
最近気になっていたんだけど、Platform SDK UpdateのURLへ行くと「This page has moved.」と出て、
Webインストーラのページへリダイレクトされるようになっている。
この状態で果たして
>>4 にPlatform SDK UpdateのURLを載せる必要があるのか?
それともまさかそうなるのは俺だけ?
質問です。 ディスプレイの出力先で内蔵グラフや外部CRTやS-VIDEOといった 出力先を選択することが出来ますがこれってAPI的に切り替え可能ですか? ニッチな問題なので適当なページが見つからなくて…。
それはそのデバイス特有の問題なので、Win32APIでは如何ともしがたい。
質問があります。 Wordのための、検索ダイアログのようなものを作りたいのです。 Wordの上に検索ダイアログを表示して、 検索ダイアログのエディットコントロールに文字列を入力すると、 Wordのメインウインドウの文書が検索され(Officeオートメーションを使うつもりです)、 該当文字列が、反転表示される、といったものです。 こういう検索ダイアログを、Wordとは別のアプリ(プロセス)で作りたいのです。 Wordのウインドウを親ウインドウに指定してポップアップウインドウでダイアログを表示させるまでは簡単ですが、 文字列入力のために、ダイアログのエディットにフォーカスを設定すると、 Wordの方はフォーカスが失われるので、反転表示が消えてしまいます。 当たり前ですが、なにか他のウインドウにフォーカスがあたったら、 いままでアクティブだったウインドウにはWM_KILLFOCUSメッセージが行くでしょうから、それを受けてWordが 反転表示を消してしまうのだと思います。しかし、それを消さないようにしたいのです。 Wordのオリジナルの検索ダイアログでは、ダイアログウインドウにフォーカスが当たっているのに、 メインウインドウは非アクティブ表示にならず、反転表示されたままです。 こんなことを、別アプリが作った検索ダイアログでも、できないものでしょうか? 以上、ご存知でしたら、ぜひ、ヒントなりとも、お教えいただければ幸いです。よろしくお願いします。
9 :
デフォルトの名無しさん :2006/03/04(土) 06:34:34
C:\WINNT\SYSTEM32などのシステムフォルダ内のファイルには書き換えたり名前変更したりできないものがありますよね? これを書き換えたり名前変更したりするのは、どの関数を使えばいいのでしょうか?
前スレの続きだけど、MultiByteToWideCharのコードページって 何を指定するのがいいの?CP_ACP, CP_OEMCPの違いって何?
>>9 ウィルスの作者さん、こんなところで質問しないで。
>>9 対象のファイルを使用してるプログラムをすべて終了してから
MoveFile OpenFile WriteFile等
>>10 迷ったらCP_ACP、将来的に国際化対応を考慮する気があるならCP_THREAD_ACPも悪くない。
OEMコードページというのはDOSが使っていたコードページ。だからCP_OEMCPはあまり出番がないと思う。
>>14 ということは、コマンドプロンプトに出力する場合とかは
CP_OEMCP を使う、という理解でOK?
コマンドプロンプト≠DOS
常駐ソフトを作っています。
システムトレイ上のアイコンが右クリックされると
TrackPopupMenuでポップアップメニューを表示しているのですが、
このときキーボードによるメニューの選択がうまくいきません。
(いくときもあるし、いかないときもある)
具体的には、Exit(&E)というポップアップメニューを表示しているのですが、
このときキーボードでEを入力しても終了したりしなかったりでうまくいきません。
いろいろ検索したり過去ログを読んだりしましたが、どうしても解決できなかったので
ここで質問させていただきました。どうすれば解決できるかどうかよろしくお願いします。
ちなみにソースコードは
http://homepage3.nifty.com/catfood/up/src/up2656.zip です。
たぶんキーボードフォーカスが自ウィンドウにないんだろう。
それがTrackPopupMenuの直前にSetForegroundWindowや SetFocusを入れてもうまくいかないんです・・
AttachThreadInput + SetForegroundWindowで強制的にフォアグラウンドにしたらどう?
void forceForegrounded(HWND window) { const HWND fw = GetForegroundWindow(); const DWORD idfw = GetWindowThreadProcessId(fw, 0); const DWORD id = GetCurrentThreadId(); AttachThreadInput(id, idfw, TRUE); SetForegroundWindow(window); SetFocus(window); AttachThreadInput(id, idfw, FALSE); } として、SetForegroundWindowをforceForegroundedに置き換えてもうまくいきませんでした
\ __ / _ (m) _ピコーン |ミ| / .`´ \ ('A`) そうだ諦めよう! ノヽノヽ くく
少し進歩しました。 アイコンが左クリックされた時にメニューを表示するようにしたらうまくいくようです。 右クリックしたときにこちらが表示するポップアップメニューに少し遅れて、 タスクバーを右クリックしたときにでるポップアップメニューがたまに表示されるので、 なんだかこいつが原因のような気がします。
explorerに先に余計なポップアップメニューしてもらうように forceWindowedの直前にSleep(100)を入れると だいぶキーボードによる選択がききやすくなりました。 しかしこの方法は逃げてるようで納得いかないです。。
s/forceWindowed/forceForegrounded
背景色とツールバーとの関係について質問です。 CreateToolbarExでTBSTYLE_FLATを指定してフラットツールバーを作ろうとすると、 ボタン背景がWNDCLASSで指定した背景色と同じになってしまいます。 フラット指定をはずすと、グレイ?っぽいシステムカラーになるのですが、 フラットのときでもシステムカラーを背景色にするのは無理なんでしょうか。
ヴァカはファイルハンドルをクローズしない
>>23 右クリックでもちゃんとできますがね
キミの作り方が悪いだけかと
リージョンをCreateRectRgn()関数とSetWindowRgn()関数を使って作って、非長方形のウィンドウをつくったのですが 全画面表示するとDOSプロンプトと同じような灰色のバーのものが出来上がりました。 下記のように、灰色の部分を省いた訳なんですが、これだとデスクトップの上端にピッタリと張り付きません。 ウィンドウをつまんで動かせるスペースを考慮してずれるのですが、助けてください。。 case WM_CREATE: hRgn = CreateRectRgn( 0, 25, 400, 800); SetWindowRgn(hWnd, hRgn, TRUE); break;
30 :
29 :2006/03/04(土) 19:02:47
何かいい方法ってないでしょうか?
>>28 その通りです。
ほかの常駐アプリではちゃんと出来ているみみです。
それで、私の作りのどこが悪いのかが分からないんです(´・ω・`)
>>31 それはもう自分で調べろよ。
作り方が悪いってわかっただけでも収穫だ。
はい、次の人。
解決策が分からなければ詰まった意味が・・・ まあもう少しがんがってみます
>>26 作成後に SetWindowLong() で TBSTYLE_FLAT を指定すればいい、
…と、どこかで見たような気が。
もし自分で作るアプリケーションをナチュラルインプットに対応させるとしたら 一体どんなことをすることになるんだろう?と気になって調べてみたら、 Text Services Frameworkというのが一番怪しかった。 しかしそれ以上はよく分からなかった。
36 :
デフォルトの名無しさん :2006/03/05(日) 01:47:58
>>4 Advanced Windows 入れないほうがいいよ絶対
>>38 Advancedって、SDKの本じゃない気がするんだよ。。
40 :
デフォルトの名無しさん :2006/03/05(日) 01:59:29
本当に読んでその台詞ならテメエはもう何も書くな有害だから
42 :
デフォルトの名無しさん :2006/03/05(日) 04:39:45
おまえには言ってない
43 :
デフォルトの名無しさん :2006/03/05(日) 04:42:23
>>41 本当に読んでその台詞なら、はやく上の質問に答えてやれよw
44 :
デフォルトの名無しさん :2006/03/05(日) 04:43:10
45 :
デフォルトの名無しさん :2006/03/05(日) 04:45:13
↓ 基地外
俺かよ!!!
47 :
デフォルトの名無しさん :2006/03/05(日) 04:51:22
人と折り合いを付けながらの会話ができない、Windowsプログラマのスレはここですか?
>>34 ありがとうございます。
CreateToolbarExでWS_CHILD | WS_VISIBLEを指定して、
できたハンドルにSetWindowLongでWS_VISIBLE | TBSTYLE_FLATを指定するとうまくできました。
ただ、WS_CHILDまで含めて指定するとツールバーが下につくようです。
なんかの本でWS_CHILDは必ず指定しろとかなんとか。
もう少し試してみます。
っ[MoveWindow]
>>29 WS_BORDERとかWS_CAPTIONとかWS_EX_THICKFRAMEとかを使わないで
CreateRectRgnのtopを0のまま
WM_NCHITTESTに応じて下のようにしてウインドウをつまむ領域を指定する
 if(GET_Y_LPARAM(lParam)<25) return HTCAPTION;
WM_NCCALCSIZEに応じてクライアント領域の位置を指定
ぐらいかな?
>>29 ぶっちゃけRectの意味が分かってないと思う
52 :
デフォルトの名無しさん :2006/03/05(日) 20:35:08
自分で作ったGUIアプリケーションにビジュアルスタイルを適用できると聞いたのですが 本当でしょうか?
テーマ使いたいんならリソースエディタでやるんじゃないの?ソースコードに書くなよ
54 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 20:50:49 BE:552841496-
プログラム名.manifestだろ
それとも自作のコントロールをビジュアルスタイルに対応させたいということか?
57 :
52 :2006/03/05(日) 21:42:09
>>53-56 ありがとうございます。
難しそうですが、ちょっくらやってみます。
>>26 >>48 IE3に初めてフラットツールバーが導入されたときには背景に画像ファイルを充てることが出来たからその名残だと思うが,
英語版MSDNのToolbar Control and Button Styles に対策が書いてあると思う.
マニュアルどおり素直にやるならTBSTYLE_CUSTOMERASEを指定してParentWindowがNM_CUSTOMDRAWに応じて背景を消去する.
>>15 そもそも日本語はどっちもCP932なんであまり関係ない。
関係あるのはOEM CPとANSI CPが違ってた欧米。
もちろん国際化対応のプログラムを書くなら考慮する必要もあり得るが。
ちなみにコマンドプロンプト≠DOSだがコマンドプロンプトでもOEM CPを使う。
60 :
デフォルトの名無しさん :2006/03/06(月) 13:20:14
APIでウインドウの可視状態を求める関数って何でしょうか? フォームのウインドウハンドルを指定すると表示・非表示を 返してくるものとか。
(´-`)/ IsWindowVisible()
SAFEARRAYとかVARIANTとかなんであんなに使いにくいんですか?
ここはおまいが愚痴を言うスレッドじゃないんだよ チラシの裏にでも書いてろ
>>63 VBからなら普通に使える。
それはともかく、VARIANTならATL::CComVariantとか_variant_tを使えばだいぶ楽だと思うが。
>>63 VBの内部データ構造そのままだから。
そのまま使うようにはできていない。
COMには3つの大きな欠点がある
・引数違いのオーバーロードを認めない
・VARIANT
・IDispatch
すべてこいつらはVBが癌なのだよ。
>66 COMの本質がわかってないなぁ。 スクリプトの透過性をたもったまま バイナリレベルの実行時インターフェィス互換のためには必要だろ? オーバーロードはコンパイル時のバインド解決だし・・・
ぶっちゃけ、VARIANTやIDispatchは、COMの上に構築されたものであって、狭義のCOMには含まれない。 VARIANTに関してはVBの問題だし、 IDispatchに関してはVBScriptの問題。 本来はコンポーネント側がケアする問題ではないのだけど、 安直に、コンポーネント側がなんとかしてね、というのはマイクロソフトらしい解決法だと言える。 IDispatchに至ってはインタフェースという概念を台無しにしているよな。 あるコンポーネントがIFooとIBarを持つとき、 IFoo->Kick() IBar->Kick() は当然違う意味を持つのだけど、 このコンポーネントにIDispatchを付けた時、困ったことになる。
69 :
デフォルトの名無しさん :2006/03/07(火) 15:10:05
SendMessageのLPARAMで文字列を送ろうとしてるんだけど、受信側ではポインターのアドレスは同じだけどメモリーダンプを見るとあったはずの文字列が存在していない。 プロセスの保護による問題のような気がするけど、回避するにはどうしたらいいですか?
VBScriptからIDispatchを使わずに、 任意のインタフェースのメソッドを呼ぶためのラッパーを見かけたよ。 どうしてマイクロソフトはそれを、VBScriptに標準搭載しなかったのかと、小一時間。
>>69 LPARAMで送ることができるのは、void*な値だけです。
文字列を送ることはできません。
>>69 どーしてもSendMessageで別プロセスに文字列を渡したいなら、
VirtualAllocExで相手のプロセス空間にメモリを確保し、
そこにWriteProcessMemoryで文字列を書き込み、
そのアドレスをSendMessageで渡し、
SendMessageが戻ってきたら、VirtualFreeExでメモリを解放する。
素直にプロセス間通信のための道具を使ったほうがいいと思うけどね。
アドレスは物理アドレスを示している訳じゃないんだから、 別のプロセスで読めなくて当然。
74 :
69 :2006/03/07(火) 15:20:05
>71 レスどうもです。 >LPARAMで送ることができるのは、void*な値だけです。 >文字列を送ることはできません。 って事は、1文字ずつ小分けにして送らなくてはダメって事?
75 :
69 :2006/03/07(火) 15:25:02
>72 >73 レスありがとうございます。 簡単にはいかないんですね。 プロセス間通信ついてですが、検索キーワードになりそうなヒント教えてくれませんでしょうか よろしくお願いします。
SetWindowTextでダミーウィンドウに送ってやれば?
77 :
69 :2006/03/07(火) 15:27:46
プロセス間通信って「WM_COPYDATA」の事になるんですかね?
>>74 そもそも、何をやりたいの?
それによって、何を選ぶか、変ってくると思うよ。
>>75 セキュリティ的な問題がなければ、難しくはないよ。
mallocの代わりにVirtualAllocEx
memcpyの代わりにWriteProcessMemory
freeの代わりにVirtualFreeEx
を使うだけなんだから。
検索キーワードは「プロセス間通信」
VirtualAllocExとか言ってる人って WM_COPYDATAを知らないの?
80 :
69 :2006/03/07(火) 16:40:21
「WM_COPYDATA」でできました。 ありがとうございます。
検索キーワードは「WM_COPYDATA」であってるよ。
>>79 何をやりたいのか書いてないから、
メッセージを受け取る側をいじって良いかどうかすら書いてないから、
もっとも汎用的な方法を書いたのよ。
WM_COPYDATAすげー
ていうか、
>>69 とに対しては
>>72 が妥当でしょ。
受け取り側プロセスで有効なポインタの取得のしかた
という質問なんだからさ。
>82 >SendMessageのLPARAMで文字列を送ろうとしてるんだけど、受信側ではポインターのアドレスは同じだけどメモリーダンプを見るとあったはずの文字列が存在していない。 >プロセスの保護による問題のような気がするけど、回避するにはどうしたらいいですか? 文字列を送りたいって書いてあるがな。
受け取り側の仕様を変更していいかどうか、書いてないし。
VirtualAllocExはWin98で使えないから注意だ
たとえば送る相手も今自分で作っているのならWM_COPYDATAも使えるが、 もし相手は変更できないのならVirtualAllocExを使う必要がある。 さらに9xでも動かしたければメモリマップドファイルを併用する必要もある。
面白そうだったから調べてみたんだが、WM_COPYDATAって COPYDATASTRUCT構造体を介して、ダブルワードのデータと データへのポインタの2つを同時に受け渡しできるって認識でOK?
ok
ULONG_PTR 1つ と 任意の長さのバイナリ 1かたまり sizeof(ULONG_PTR)は、32ビットプロセスでは4だが、64ビットプロセスでは8になることに注意。 相手に渡すのはポインタの値ではなく、ポインタのさす先のメモリの内容。
>>90 お前もかよ、ポインタを渡すと、ポインタのさす先の中身まで一緒に渡ると思ってるのは。
あー古いSDKやドキュメントだと、COPYDATASTRUCT構造体は DWORD dwData DWORD cbData PVOID lpData と定義されているかも。 だいぶ前に64ビット対応のために、 ULONG_PTR dwData DWORD cbData PVOID lpData に変更されました。
>>93 型定義見忘れてた
ってことはポインタ2つを渡せるって事か
つーか型と変数名・説明が食い違ってないか?>MSDN-en
ハンガリアン記法の欠点だな
メンバ名まで変えるわけにはいかんだろう。
あと、たぶんポインタ二つは無理だぞ。
dwDataにポインタ入れても
>>69 と同じことになるかと。
ULONG_PTRはポインタを格納できるサイズの符号なし整数であってポインタじゃないぞ
COPYDATASTRUCTの使い方、わかってない人いるのかな。 渡したいデータへのポインタをPVOID lpDataにセット。 そのデータの長さをバイト数でDWORD cbDataにセット。 ULONG_PTR dwDataは、何に使ってもいいのだけど、たとえば、 WM_COPYDATAで渡すデータを振り分けるためのIDに使う。
んな情報はlpDataの内容に入れとけばいいじゃんと思ったり思わなかったり。
>>98 そうなんですよ、川崎さん。
でもね、そんなこといったら、
関数の引数は1つで十分ですよ、わかってくださいよ
になってしまうんですよ。
アドレス違反が発生するリスクを軽減させるためのものでしょ。 lpDataがヌルなどの不正なアドレス値だった場合、 必要な情報があるはずのオフセット位置へ飛ぶことさえできないわけで。 dwDataのようなユーザ定義値がない場合、信頼できないプロセスからWM_COPYDATAが送信されてきた時に(ry
lpDataからcbDataバイトが有効なのはOSが保証してくれるんじゃないの?
ていうか、 送信側のプロセスがlpDataにセットした値が、 そのまま受信側のプロセスに渡されるわけじゃないよ。
盛り上がってますね
アニメーションカーソルについて教えてください。 いまマウスカーソルをDirect3D8のサーフェスに対してソフトウェア描画する 必要性があり、GetCursor()→GetIconInfo()→GetObject()でカーソルの マスクとビットマップを取得しています。 普通のカーソルに対してはこれでうまくいっていますが、これではアニメーション カーソルが動いてくれません。 GetCursor()で取得したカーソルのハンドルが、アニメーションカーソルかどうか 判定する方法や、そこからビットマップ情報を取得する方法をご存知の方 いませんか?
>>104 VC++6.0 のサンプルに aniEdit, imageEdit というのがある。
これ以外に説明書はないみたい。(.NET, VC++200X では未確認)
時計の針が廻る cursor を .ani ファイルで作って、WINDOWS の Cursor dir に
入れ、砂時計の代わりにこのファイルを指定すると動くのは確認した。
上記のサンプルに timer で動かす手順はある。
Windows標準コントロール(Buttonクラスとか)からテキストを 抽出するのはWM_GETTEXTを送ればできますが、標準じゃないクラス から文字列を得るにはどうすればいいのでしょうか?
それぞれのクラスに応じて。
ウィンドウであるならGetWindowTextでもしとけ
>>108 WM_GETTEXTで取れないテキストはGetWindowTextで
取れないぞぇ。
>>107 >>108 >>109 WM_GETTEXTをメモ帳に送れば編集中のテキストが抽出されますが、
同じことを秀丸でやろうとするとできないんですよね。。。
なんかいい方法ないでしょうか?
標準コントロールじゃないって言うと、コモンコントロールとかか? だったらそれぞれにメッセージやマクロが用意されとるよ
112 :
106 :2006/03/08(水) 21:05:57
書き忘れました。110は私です。 110はウィンドウメッセージの実験上やったことなので、 こぴぺすればいいとかそういうことじゃないです。 いちお念のため
>>110 それぞれの相手に応じてやるしかない。
「それぞれのやり方」は自分で調べろ。少なくともAPIレベルでは決まっていない。
だって秀丸はエディットコントロールでもリッチテキストでもないからな 諦めろ
Delphiスレから誘導されました Windows Media Playerで再生してる曲の曲名を取得する方法ありませんか?
Delphiスレに行ってください^^
再生している曲名を広報するプラグインでも作れば? メッセンジャーはそうしていたような。
WMP SDKってのがあるから、とりあえずそれ見てみれば?
NtSetInformationFileを直接使えばFILE_FLAG_DELETE_ON_CLOSEを取り消せることが 分かりましたが、これを公開APIだけで行う方法はありませんか?
121 :
120 :2006/03/09(木) 12:37:39
自己レス VistaだとSetFileInformationByHandleでできるようです。
122 :
デフォルトの名無しさん :2006/03/09(木) 16:17:02
>>122 どこにWin32APIが関わっているのかと(ry
C♯じゃね?
その関数を実行すると即時に、あらゆる終了コードの実行をさせずに プロセスを終了させる関数はありますか? TerminateProcessはその後まだコードが動いているようなんですが。
ダイアログリソースでダイアログと、そのコントロールを作って、 コントロールに"〜のコントロールにマウスが乗った・外れた""フォーカスが入った" などを調べたいとき、どうしたらいいですか? 最初、素直にダイアログプロシージャのWM_NCHITTESTやWM_MOUSEMOVEメッセージから来るマウスの位置から調べようと思ったのですが、 Static Text以外のEdit Control上とか、Radio Button上とかではWM_MOUSEMOVEメッセージが来ないので…
おいおい、わざわざあっちで解答書いてやったのに、そのままコピペかよ・・・
>>128 ありがとう。
何とかなりそうです。
>>129 マジすまんです。
WM_NCHITTESTの方に目が行っていて。
サブクラス化のところが盲点に入ってた…orz
> TerminateProcessはその後まだコードが動いているようなんですが。 なんでそう思ったの?
132 :
106 :2006/03/09(木) 21:03:13
133 :
127 :2006/03/09(木) 21:03:39
追加で質問なんですけど Static TextやEdit Control、Radio Buttonなどがそれぞれいくつもあって、 どれにも共通の(マウスを右クリックすると、そのコントロールに応じてテキストを表示)動作をさせる場合、 すべてのウインドウに対してそれぞれサブクラス化させるのではなくて、 まとめて処理させる上手い方法はありませんか? ちょっとWin32APIと話がずれてしまいそうですけど…
サブクラス化したらいいと思うが。プロシージャは1つで済むわけだし。
まさかサブクラス化するのに、ひとつずつプロシージャが要るとか思ってるわけじゃ・・・さすがにないよな・・・
>>135 ごめんなさい…
そのまさかですorz
そこら辺学べる手頃なサイトあります…?
説明して頂ければなおうれしいですけど…
(うわぁC超初心者丸出しですわ)
138 :
137 :2006/03/09(木) 21:49:57
ちゃんと分かってない時点でナンですけど、 例えば、 OldProc1 = (WNDPROC)SetWindowLong(hCtrl1, GWL_WNDPROC, (LONG)NewProc); OldProc2 = (WNDPROC)SetWindowLong(hCtrl2, GWL_WNDPROC, (LONG)NewProc); OldProc3 = (WNDPROC)SetWindowLong(hCtrl3, GWL_WNDPROC, (LONG)NewProc); OldProc4 = (WNDPROC)SetWindowLong(hCtrl4, GWL_WNDPROC, (LONG)NewProc); …… LRESULT CALLBACK NewProc(HWND hEdit, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case NM_RCRICK: switch (hEdit) { case hCtrl1: //どーたらこーたら break; case hCtrl2: //どーたらこーたら break; 〜中略〜 } break; } return CallWindowProc((WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC), hEdit, msg, wp, lp); } みたいにすればいい、てな考え方で大丈夫ですか?
140 :
デフォルトの名無しさん :2006/03/09(木) 22:04:27
質問です。 タスクマネージャのように起動中のアプリケーションの 「応答なし」、「実行中」という状態を知るには どうすればいいのでしょうか? 何か参考になる情報など頂ければと思います。 よろしくお願いします。
>>140 半公開APIだがIsHungAppWindowというそのまんまの関数がある
ウィンドウのあるプロセスならSendMessageTimeoutで適当なメッセージ投げて反応をみる
おおお!素早いご回答ありがとうございます。
>>141 そんな関数があったのですね。
試してみます。
>>142 なるほど、そんなやり方もあるわけですね。
基本的にタスクマネージャと同じように起動時に、
ウィンドウを列挙して応答の有無を表示したいので、
時間がかからなそう?な IsHungAppWindow() を試してみたいと思います。
まだまだ猫でも分かる〜で勉強中の初心者なもんで、とても勉強になります。
ありがとうございます。
>>138 その状態ではGetWindowLong(hEdit, GWL_WNDPROC)は当然NewProcを返す。
SetProp/GetPropなどを使って独自に元のウィンドウプロシージャを管理すべき。
あとGet/SetWindowLongよりもWin64対応のためにGet/SetWindowLongPtrを使うべき。
>>143 ハングアップしていたら、ウィンドウは列挙できない。
ごめん
>>139 の突っ込みの意味がわからない。誰か教えて。
>>145 じゃあタスクマネージャはどうやってるの?
>>145 マジすか・・・
ウィンドウクラス名とかタイトル名とかも取れないのかな。
単純にタスクマネージャと同じ様なウィンドウのリストを作りたいのですが
何か特別なやり方が要るのでしょうか。
> ウィンドウクラス名とかタイトル名とかも取れないのかな。 クラス名は取れるけどタイトルは(WM_GETTEXTから帰ってこないので) 取れない場合がある。
少なくともウィンドウタイトルを取得するには該当ウィンドウがWM_GETTEXTに反応する必要があると思うが。
>>144 ありがとうございます。
確かにSetWindowLongで変更したら当然GetWindowLongは変わりますね…orz
>>138 で言えば、予めhCtrlxとOldProcxを対応させて管理しておけばいいんですね?
153 :
138 :2006/03/09(木) 23:57:47
今更だが、switchのcaseに変数使ってる事に気付いた。 不便だなぁ…
>150 WM_GETTEXTは帰ってこないけど、GetWindowTextは帰ってくる。 詳細はThe Old New Thingを読んで熟知すべし。
UNICODE_STRINGのLengthが文字数ではなくバイト長なのはなんで?
そういう名前の構造体の話だぞ。
>>156 UNICODE_STRINGが低レベルな世界のものだからだと思う。
Win32APIでやってんなら2で割ってやりゃいいだけじゃん
解決法は聞いていない。
162 :
デフォルトの名無しさん :2006/03/11(土) 03:33:40
ウィンドウハンドル渡してスクリーン上?のZオーダーとる関数教えてください。
みんな、サブクラス化とかいってるけど、Editなどの登録済みクラスはWindows的には サブクラス化は推奨されていないんだな。で、スーパークラス化を使うべきなんだな。
ウィンドウのドラッグの開始と終了を検知するために、 WM_ENTERSIZEMOVE と WM_EXITSIZEMOVE を追っているんだけど、 システムメニューから [移動] を選択して、 そのままウィンドウをドラッグせずに他のウィンドウをクリックすると、 WM_EXITSIZEMOVE が発行されないままサイジングが終了してしまうらしい。 何かいい対処法はない?
WM_CANCELMODEは?
「スーパークラス化」でぐぐれば即出てくる
Google開いて2分で答え
玄関開けたら2分でご飯
スーパークラス化とサブクラス化は目的で使い分けるもんで、どちらかを推奨っておかしくない?
やってはいけないのは、システムグローバルなクラスに対する グローバルなサブクラス化じゃないの? SetClassLong()でサブクラス化するやつ。 SetWindowLong()でサブクラス化するのはインスタンス単位だから 何も問題無いはずだが。
ユーザーからの入力をいち早く処理するには どうしたらいいんでしょうか? 具体的には、マウス動作をキーボードで実現したいんですが。 例:カーソル移動を上下左右キーでで、クリックをエンターキーとか。
>>172 UserAssistanceだっけ? OSの標準機能にありますが。
32-1
>>174 DIBの1行のサイズは常に4バイト=32bit単位でなければいけないから。
x + (y - 1) / yってのは端数切り上げのx/y。
>>174 DIBは必ず1ラインが4の倍数のバイト数になっている。(DWORDアライメント)
そのための端数を繰り上げる計算をしている。
>>177 そのリンク先に効果が無いって書いてあるじゃないか。
そこまで来たなら、今度はWM_CTLCOLORBTNでググれ。
180 :
174 :2006/03/11(土) 17:04:38
>>175 >>176 >>178 ありがとうございます。
ちょっとだけ分かってきました。
しかし、その場合、横4pixelの24biフルカラー画像の場合、1行が15Byteになってしまいませんか?
横3pixelの場合は12Byteで4の倍数ですけど・・・
>>179 あれ?見つかった。一応検索したんだけど
WM_CTLCOLORSTATICとかでも検索してたから、ごっちゃになってたかな…
オナドローが一般的らしいです。
>>180 ヒント: 整数同士の演算は小数点以下が切り捨てられる。
式見てわからないなら、実際にいくつかの値で試してみればいいのに。
はじめまして、UpdateLayeredWindowを使って描写しているんですが、 部分的に再描写したいとき、どこかでBitBlt等を使って描写することは出来ないのでしょうか。 やってみましたがうまくいきませんでした。 再度UpdateLayeredWindowを呼び、全画面を書き換えるしかないのでしょうか。
そんな貧乏くさいことを考えてはいかん 富豪になれ
186 :
174 :2006/03/11(土) 21:14:04
>>182 それは分かっています。
>>183 実際計算して
>>180 のような疑問がおきました。
例えば、横4pixelの24bitフルカラー画像の場合、
4 * (( 4 * 24 + 31 ) / 32 ) = 15.875 [ Byte ]
これをint型の変数に代入しているので、
その変数には小数点以下が切り捨てられた15バイトが入ることになります。
これは4バイトの整数倍ではありません。
187 :
174 :2006/03/11(土) 21:15:07
あ、すみません、12になりますね。 間違えました。
188 :
174 :2006/03/11(土) 21:29:02
たしかに 4 * 整数 であれば4の倍数になるのですが、 どのような考え方でこの式が導かれるのか教えてください m(_ _)m
189 :
174 :2006/03/11(土) 21:39:51
分かってきたのですが、どうも
>>176 の部分の理屈が解せません。
ですが、これは数学の問題になってくるので、別スレで聞いてみることにします。
ありがとうございました m(_ _)m
190 :
174 :2006/03/11(土) 21:48:30
理解できました! 感動です! ありがとうございました!
>>188 そこの説明で式の過程が飛ばされているから ややこしくなってるだけなんじゃ
n byte アラインするだけなら
(A + n-1) / n * n
こういうことになる
bit数→ byte数換算 と 4byte アラインとを複合して 4*8 bit でアラインしたいってことになるから
(bpp*w + 31) / 32 * 32 // bit数
(bpp*w + 31) / 32 * 32 / 8 // byte数
→ (bpp*w + 31) / 32 * 4
192 :
174 :2006/03/11(土) 23:47:17
>>191 なるほど。
ありがとうございます!
別の質問なんですが、
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win116.html char * chPixelBit;
というchar型のポインタに
ReadFile(hFile , chPixelBit , bmpFileHeader.bfSize - bmpFileHeader.bfOffBits , &dwBytes , NULL);
というカタチでピクセルビットを格納しているのですが、
なぜ*chPixelBitはchar型なんでしょうか??
また、ピクセルビットが記述されるところまで、ファイルポインタを移動させるなどの所作が
見られませんが、なぜキレイに格納されるのでしょうか??
193 :
デフォルトの名無しさん :2006/03/12(日) 00:02:22
誰か暇なひと、一緒にデバッグしましょう。して下さい(__) ↓
194 :
1 :2006/03/12(日) 00:05:05
// 自由曲線を描くプログラム #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); void DrawCurve(int sx, int sy ,int x1,int y1, int x2, int y2, int ex, int ey, int len); int CmpLine(int xs, int ys, int xe, int ye, int len); char szClassName[] = "graphics02";//ウィンドウクラス HDC hdc;
>>192 ReadFileはファイルポインタを進める。
196 :
2 :2006/03/12(日) 00:06:08
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; }
//ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc;//プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = NULL; wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; // メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = NULL; return (RegisterClassEx(&wc)); }
198 :
4 :2006/03/12(日) 00:07:24
//ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "自由曲線を描くプログラム", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,//X座標 CW_USEDEFAULT,//Y座標 CW_USEDEFAULT,//幅 CW_USEDEFAULT,//高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
199 :
5 :2006/03/12(日) 00:09:06
/*再帰的処理*/ /*DrawCurve関数*/ void DrawCurve(int sx, int sy ,int x1,int y1, int x2, int y2, int ex, int ey, int len) { int p1x,p1y,p2x,p2y,p3x,p3y; int p4x,p4y,p5x,p5y,p6x,p6y; if (CmpLine(sx, sy ,x1, y1, len) && CmpLine(x1,y1,x2,y2,len) && CmpLine(x2,y2,ex,ey,len)){ MoveToEx(hdc,sx,sy,NULL); LineTo(hdc,x1,y1); LineTo(hdc,x2,y2); LineTo(hdc,ex,ey); return ; } p1x = (sx+x1)/2; p1y = (sy+y1)/2; p2x = (x1+x2)/2; p2y = (y1+y2)/2; p3x = (x2+ex)/2; p3y = (y2+ey)/2; p4x = (p1x+p2x)/2; p4y = (p1y+p2y)/2; p5x = (p2x+p3y)/2; p5y = (p2y+p3y)/2; p6x = (p4x+p5x)/2; p6y = (p4y+p5y)/2; DrawCurve(sx,sy,p1x,p1y,p4x,p4y,p6x,p6y,len); DrawCurve(p6x,p6y,p5x,p5y,p3x,p3y,ex,ey,len); return ; }
200 :
6 :2006/03/12(日) 00:12:07
//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { PAINTSTRUCT ps; HPEN hPen1; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hPen1 = CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); SelectObject(hdc, hPen1); /*再帰的な関数DrawCurveの呼び出し*/ DrawCurve(2, 2, 3, 6, 10, 10, 25, 3, 4); DeleteObject(hPen1); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
201 :
7 :2006/03/12(日) 00:12:49
int CmpLine(int xs, int ys, int xe, int ye, int len) { int len1 = xe - xs; int len2 = ye - ys; if (len1<0) len1 = -len1; if (len2<0) len2 = -len2; if((len1<len)&&(len2<len)) return 1; return 0; }
↑ ここまでです(__)
どういう動作を期待していて、実際にはどうなるのかが書かれてないと話にならない。
猫のソースに、 DrawCurve関数と CmpLine関数を付け加えただけです。 眠いので寝まつ
俺も暇だけど寝まつ。
長いソースはアプロダにうpしろと言いたい。
やる気なしにも程がある
210 :
192 :2006/03/12(日) 01:15:38
>>195 ということは、ReadFile関数はchPixelBitがchar型であることを頼りにファイルポインタを
進めるということでよろしいでしょうか?
この場合、ビットマップファイルのピクセルビット部はchar型で認識されることが前提ですが。
chPixelBitが何型だろうと、 bmpFileHeader.bfSize - bmpFileHeader.bfOffBitsバイト進めるだけだろ…
212 :
192 :2006/03/12(日) 01:24:53
>>211 ピクセルビットの位置に進めるならば、
bmpFileHeader.bfSize - bmpFileHeader.bfOffBits
ではなくて
bmpFileHeader.bfOffBits
ではないのでしょうか?
前者はピクセルビット部のバイトサイズですよね?
>>210 型情報なんぞは渡してない。
単純にその次の引数で読み込みBYTE数を渡してるだけ。
そしてそのBYTE数分を読みこみ、渡されたアドレスへセットしつつファイルポインタも進める。
ReadFile() ≒ fread()
>>203-
>>208 こんばんわ。気になったので覗いてみました^^;
コールバック関数のWM_PAINTメッセージからの処理がおかしいです。
Drawcurveは
座標を4つ指定してA(sx,sy) B(x1,x2) C(x2,y2) D(ex,ey)で
A→B→C→Dの経路で通っていきます。
曲線になるように、それぞれの中間地点を決めてそちらをなぞる曲線に変わります。
そこから、、、
216 :
192 :2006/03/12(日) 01:39:53
>>213 >そしてそのBYTE数分を読みこみ
これは、どこからスタートするのでしょうか?
ファイルの先頭から読んでしまうと、ファイルヘッダ、情報ヘッダが含まれてしまい、
しかも、ピクセルビット分しか容量を指定していないので、肝心のピクセルビットが
すべて格納できなくなってしまうことになると思うのですが。
そんなことはなく、ちゃんとピクセルビット部の先頭から読み込んでいるようですが、
どの情報をもとにピクセルビット部の先頭を得ているのか分かりません。
218 :
デフォルトの名無しさん :2006/03/12(日) 01:42:50
デバッグをステップ実行していくと、途中まで線が描かれてゆくと思います。 動作がおかしいのはWM_PAITメッセージ内のみです。 難しいので一筋縄でいきません。なので助けてちょ^^ノ
>>216 >ReadFile(hFile , &bmpFileHeader , sizeof (BITMAPFILEHEADER) , &dwBytes , NULL);
ここでファイルの先頭からへっだを読み、
>ReadFile(hFile , &bmpCoreHeader , sizeof (BITMAPCOREHEADER) , &dwBytes , NULL);
ここでその続きからピクセルビットを読んでる
220 :
192 :2006/03/12(日) 01:45:36
明日写真撮るから、熊を取っておきたいからもう寝なきゃいけない。。
>>222 >p5x = (p2x+p3y)/2; p5y = (p2y+p3y)/2;
→p5x = (p2x+p3x)/2; p5y = (p2y+p3y)/2;
224 :
デフォルトの名無しさん :2006/03/12(日) 02:00:12
アクティブなウインドウが自分以外のアプリの場合、 フォーカスのあるコントロールのウインドウハンドルを取得したいのですが、 どうしたらいいのでしょうか。 具体的には、ホットキーが入力されたときに、 例えばメモ帳などで反転表示された文字列を拾いたいのです。 その場合、メモ帳のエディットコントロールのウインドウハンドルが 分かれば、SendMessageで選択文字列の場所を知ることができる と思うのですが、ウインドウハンドルの取得方法が分かりません。 GetForegroundWindow()で、親ウインドウのハンドルを取得した後、 フォーカスのある子ウインドウを知るにはどうしたらいいのでしょうか。
VisualStudioで、ソリューションエクスプローラなどをウインドウに結合 したり、取り外したりできますよね。 あれはどうやってるんですか?
普通にくっつけたり剥がしたりしてるんジャマイカ?
>>227 思いつく方法の中で最も面倒な方法を使っている。
ドッキング、位置の判定、移動など、全て逐次実装する気の長いコードを書かなければならない。
いっぱいいっぱいです。教えてください。 お題は「プログラムからIPアドレス変更、DHCP有効/無効など制御」 で、PlatformSDKをインストールしてAddIPAdress()とか試しました。 確かにIPアドレス追加とかできます。 でも手動でTCP/IPのプロパティに設定した内容と置き換えるにはどうすればいいんでしょうか?
削除して追加?
>>231 RegOpenKeyEx
RegQueryValueEx
RegSetValueEx
とかで設定。
234 :
231 :2006/03/12(日) 13:11:30
>>232 追加したものしか削除できない罠が・・・
>>233 調べてみます。
レスありがとうございます。
235 :
224 :2006/03/12(日) 13:12:10
あーりがとぉーーーーぉぅぉぅぉぅ!(堀内孝雄ふうに)。
>>235 その歌手の歌が終わった後の挨拶とか歌詞とか喋りが大嫌いな漏れからすれば、なんて嫌がらせ? と思う。
#普通に感謝しろよ、普通に。
237 :
デフォルトの名無しさん :2006/03/12(日) 15:37:18
CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , 0 , 350 , 620 , 100 , hwnd , (HMENU)1 , ((LPCREATESTRUCT)(lp))->hInstance , NULL ); このウィンドウに枠つけたいのですがどうすればいいのだーー!
thx
"\n"をEDITで表示すると"↑"みたいに文字化けする
当たり前だ
のクラッカー?
\r\nだっけ? メモ帳とワードパッドでは違うんだよね
タイプライターから出直せ
画面のプロパティ→デザイン→詳細設定→アイコン→サイズ(フォントの隣) から設定できるアイコン用のフォントサイズを得たいんですが、 どなたか方法がわかる方、教えていただけませんか? GetSystemMetricsあたりで得られるのかと思ったんですが、 どうやら違うらしいです。
> アイコン用のフォントサイズ SystemParametersInfo(SPI_GETICONMETRICS) かな?
247 :
245 :2006/03/12(日) 21:56:09
>>246 ありがとうございます、できました!
ICONMETRICS im;
ZeroMemory(&im, sizeof(ICONMETRICS));
im.cbSize = sizeof(ICONMETRICS);
SystemParametersInfo(SPI_GETICONMETRICS, im.cbSize, &im, 0);
int nSize = abs(im.lfFont.lfHeight);
CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE |WS_BORDER | ES_LEFT | ES_MULTILINE , 10 , 400 , 610 , 40 , hwnd , (HMENU)1 , ((LPCREATESTRUCT)(lp))->hInstance , NULL ); で作ったエディタウィンドウを一番下までスクロール死体のジャー どうすればいいんでしょーあか?
SendMessage(messbox,WM_VSCROLL,SB_LINEDOWN,0); で 事故解決 おれって天才!!! うぉぉぉぉぉぉぉぉ
250 :
デフォルトの名無しさん :2006/03/12(日) 22:12:25
CreateProcess()で echo を起動しようすると、出来るPCと出来ないPCが ある、何の環境に依存しているのだろうか。知っている人いますか? OSはWinXPです。 #include <windows.h> #include <stdio.h> int main(void) { // プロセス起動 PROCESS_INFORMATION ProcInfo; STARTUPINFO StartupInfo; memset(&StartupInfo, 0x00, sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); BOOL ret; ret = ::CreateProcess(NULL,"echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo); if( ret != TRUE ){ printf("起動失敗"); return 0; } CloseHandle(ProcInfo.hProcess); return 0; }
出来るPCがあるほうが不思議なんだが Cygwinのechoでも入ってるのか?
プライマリスレッドのハンドルが
飛んでいった。
ぼくは小さく
256 :
デフォルトの名無しさん :2006/03/13(月) 06:47:54
ダイアログのスタティック・テキスト欄にフォルダ名を表示しているんですが、 パスが長くなると見えなくなります。頭と尻を残して途中を省略するのって 自分で編集しないとだめですか。API 一発ってのはないのでしょうか。
DT_MODIFYSTRINGとDT_PATH_ELLIPSISつけてDrawText() …冗談だ。
この辺かな? GetShortPathName PathSetDlgItemPath PathCompactPath PathCompactPathEx
259 :
250 :2006/03/13(月) 13:20:31
>>251 内部コマンドはCreateProcess出来ないって事?
Cygwinとかないのに、なぜ出来るPCがあるのかな。
「何の」内部コマンドかに思い当たれば解決できるぞ。
261 :
256 :2006/03/13(月) 13:37:03
>>258 有難うございます。説明を読んで見ます。
聞いてみるものですね。縮めては入るか縮めては入るかってのを繰り返すのかと
数日コードを考えて滅入っていましたです。
まぁ、パス名短縮くらい自前でも楽にできるがな
Shell Lightweight Utility APIsのPath Functionsは、 MAX_PATHに制限されているのだけど、 似たようなことをする長さ制限のないもので、 Windows2000以降で追加DLL無しで使えるものは、 ありますか?
>>260 答え書いちゃえよ
>>250 ×ret = ::CreateProcess(NULL,"echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo);
○×ret = ::CreateProcess(NULL,"CMD /C echo test ABC",NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcInfo);
マルなのかバツなのかハッキリしろ!
コピペして消し忘れた。 ○です。
>>265-266 むしろ、○×で正しいと思われ。
# Me辺りだと、command.exeだったはず
よそのアプリ(他プロセス)のリストビューをダブルクリックするメッセージを送りたいんですが、 VirtualAllocEx()で確保したメモリにNMLISTVIEW構造体をセットして WM_NOTIFYメッセージでNM_DBLCLKを送ってもアプリが反応してくれません。 同じ方法でリストビューの文字列は取ってこれてるので メモリの確保には問題ないはずなのですが・・・ リストビューにNM_DBLCLKを使うには他に何か手続きがいるのでしょうか? ちなみにメッセージ送信はPostMessageを使っています。 (SendMessageだとSpy++で見てるとメッセージがとんでこないようなので。)
>>269 左ボタンのダウンとアップを交互に送ればいいんでない?
>>269 回答ではなく、自分だったらこうやって調べるという話だけど・・・。
簡単なものでいいから、「よそのアプリ」を試しに自分でつくってみて、
メッセージを送っているほうのアプリから
どういうパラメータでNM_DBLCLKがやってくるかを調べる。
きっとパラメータに何か問題があるのが分かる。・・・と思う。
>>270 , 271
回答ありがとうございます。
>「よそのアプリ」を試しに自分でつくって
その方法を試していなかったのでやってみたところ
問題なくダブルクリックのメッセージが送れていました。
この結果から、最初に扱おうとしていた「よそのアプリ」は
ダブルクリックのメッセージで動作しているわけではない、という結論になってしまいました。
そのアプリはDelphi製らしいのでダブルクリックメッセージ以外の方法があるのかもしれません。
どうもお騒がせして申し訳ありませんでした。
WM_LBUTTONDBLCLK?
>>273 >>WM_LBUTTONDBLCLK?
まさにそれでした・・・
リストビューなんだからリストビューのメッセージで処理してるんだろうという
考え方にはまってしまっていました・・・orz
リストビューをダブルクリック ↓ リストビューのプロシージャでWM_LBUTTONDBLCLK発生 ↓ リストビューが親にWM_NOTIFY(NM_DBLCLK)送信 コントロールのイベントを発生させるのまで親が面倒見てるわけではないぞ
>>275 > リストビューのプロシージャでWM_LBUTTONDBLCLK発生
この表現に違和感があるのは、漏れだけだろうか?
ああ…もしかして
>>269 は親ではなくリストビュー本体の方にNM_DBLCKLを送っていたということなのか。
278 :
デフォルトの名無しさん :2006/03/14(火) 12:06:35
リストビューの編集って一番左の列しかできないのですか? 他の列のアイテムを編集したかったら自前で書かなきゃだめですか?
自分で書くとかocx使うとか。
280 :
278 :2006/03/14(火) 13:55:01
>>279 分かりました。
ありがとうございます。
COMポートに何が刺さってるか 調べるAPIありますか?
>>282 じゃあ
デバイスマネージャで
列挙されるデバイス名を列挙するようなAPIありませんか
WMIを使うと落
IEに表示されているエディットボックスに文字列を入れる方法ってありますか? 普通のアプリケーション中のエディットボックスならFindWindowで ウィンドウハンドルを取得してWM_SETTEXTを送れば出来るのですが・・・
>>286 WM_KEYUP/KEYDOWN/CHAR を送ってみ?
ウィンドウハンドルがとれないんではあるまいか
IEのバージョンによっては取れる場合があるはずだけど。 そういう場合は、Windows Scriptのキー入力でやっつちゃうから API 使わんわ、俺。
現在トラックバーのカスタムドローをしているのですが、 アクティブになった際に表示される「枠」を消す方法は無いでしょうか? ボタンのようにTABSTOPでは変化しませんし、SPYで見てみたところ WM_PAINTやWM_NCPAINTも関係なさそうです。 どこでどのような処理を行えば良いのでしょうか?
>>281 そもそもcomポートにはUSBのように「何かが繋がっている」かどうか調べる機能さえないのだが。
親のプロセスID得る方法って tlhelp32.h しかなさげです? なんかやりすぎな感じになるけどいいのかな?
SAISONPASSとかはIEに入力できてるよね どうしてるんだろ
Add-inならCOM経由でいくらでも方法はある
Plag&Play → Plug&Play
>>290 トラックバーじゃなくてフレームウィンドウの見かけを変えるときの経験ですが、
アクティブになったとき、アクティブじゃなくなったときの再描画(の一部?)は
WM_NCACTIVATE とかのハンドラ内で行われてる模様です(行儀悪い・・・)。
そのときには
デフォルトのハンドラを実行した後に自前の描画で上書きしてごまかしました。
Plug&Prayって言葉もあったな(´ω`)
IEでウインドウのサイズを変更したときに、メニューバーがちらつかないのは どういう処理をしてるんでしょうか?
気合
逆にちらつく方法を知りたいわ
つダブルバッファリング
IEのはメニューバーではなくてツールバー。
>>297 ありがとうございます。
今日はもう時間がないので無理ですが、明日試してみます。
エクスプローラのファイルの並び順を操作したいんですが どうすればできますか?デスクトップとかQuickLaunchのアイコンの配置とかです
サービスを開始したり停止したりするプログラムを作ってます
で、サービスの依存関係を取得する部分でつまずいています
EnumDependentServices()がGetLastError()で997(重複したI/O処理を実行しています)
を返して失敗(でもEnumDependentServices()はTRUEを返す)します
そのものズバリのサンプルがMSにあるのですが、
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B245230 まるまるコピーして実行しても同じエラーが出ます
アカウントはAdmin権限を持っているので、権限不足とかではないと思うのですが、
何が悪いんでしょうか・・・
#もしかして、WMIを使った方が早い?
>>306 >EnumDependentServices()がGetLastError()で997
>を返して失敗(でもEnumDependentServices()はTRUEを返す)します
意味が分からん。TRUE返してるなら成功してるんじゃん?
308 :
306 :2006/03/16(木) 10:38:58
>>307 関数の戻り値はTRUEを返して、成功しているように見えるけど、
結果を返す引数のポインタには0しか入っていない。
おかしいと思ってGetLastError()を見たらこんなエラーが入ってた。
ってことなんだけど・・・。
>>308 その関数呼ぶ前に、SetLastError(0)とかしてみ?
310 :
306 :2006/03/16(木) 11:00:47
312 :
306 :2006/03/16(木) 11:49:09
解決しました。っていうか、勘違いしてましたorz
EnumDependentServices()での依存関係の列挙って
サービスのプロパティの「依存関係」タブで言うところの、
「このサービスに依存しているシステムコンポーネント」を列挙するところで、
自分は「このサービスが依存するシステムコンポーネント」を取ろうとしていた
ことが分かりました・・・。
試しに"Remote Procedure Call (RPC)"を指定して動かしたら問題なく動きました。
問題なく列挙できてもGetLastError()はやっぱり997を返すんだけど、おかしいよM$
ともあれ、回答していただいた方、ありがとうございました。
>>311 LPDWORD pcbBytesNeeded, // 必要なバッファサイズ
LPDWORD lpServicesReturned // 返されたエントリの数
5番目と6番目の引数です
314 :
306 :2006/03/16(木) 12:02:10
>>313 そりゃ勘違いしてた俺の頭は間違いなくおかしいが、
トンチンカンなエラーな値を返してくる関数もおかしくない?
関数は悪くないって言うなら説明プリーズ
>>314 GetLastError は「API がエラーで終了したときに」エラーコードを取得するために使います。
詳細は Platform SDK の GetLastError の "Remarks" の項の第2、第3段落を参照。
316 :
306 :2006/03/16(木) 12:21:44
>>315 んじゃなんでERROR_SUCCESSってのが定義されてんの?
>>314 MSDNで、その関数の説明読めば分かるが、
GetLastErrorは関数が失敗した(0が返った)ときに呼ぶよう指示されてる
EnumDependentServices関数が成功しているわけだから、
GetLastErrorを呼んで、その戻り値を参考にすることが間違ってる
>>316 関数が成功したときに、呼ぶように指示されている関数もある
そのときに問題がなければ、ERROR_SUCCESSが返る
>>316 ERROR_SUCCESS はレジストリ操作API やWinINet API で、
呼び出しが成功したことを表すための API の戻り値として用いられています。
逆に「API呼び出しが成功した場合に、GetLastError は ERROR_SUCCESS を返す」
なんて一体ドコで覚えたんですか?そんなこと書かれているドキュメントはないし、
実際の動作とも違うし。
>>316 PC起動後 or ERROR_SUCCESSが設定されてから、
「一度もエラーが発生していない事」が判る様にだろ。
321 :
306 :2006/03/16(木) 13:30:03
「ドコで覚えたんですか?」は言いすぎだった。今では反省しています。
>>321 の大人の対応を見て恥ずかしくなったので謝罪する。
>>305 エクスプローラはリストビュー
デスクトップはエクスプローラじゃない
GDI関数って例えばなにに使うのさ。
君には必要無い物のようだから、気にせんでいいよ。
わっかりやした、親方。
win32本当に使えねーな。 DirectXのほうが全然いいや
使えない=使う能力が無い。
エラー:代入式の左側には左辺値を指定しなければなりません。
>>331 一生使ってろ屑wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
334 :
API3日目 :2006/03/17(金) 01:01:52
お取り込み中失礼します。質問です。 (1)CreateWindowで作った子ウインドウの間で、 Tabキーによるフォーカス移動をさせたいのですが、 WS_TABSTOPを指定する以外に何が必要なんでしょうか? (2)ファイルをごみ箱へ移動(?)させるAPIってありますか? BCCを使っています。よろしくお願いします。
>>334 (1)IsDialogMessage呼ぶとか?
(2)SHFileOperation
>>334 えーとね、TABが有効かどうか Queryの役目をするメッセージがある。
それに対応させればよい。
対応の仕方はメッセージの復帰値で自動化するか、復帰値でシステム側の挙動をキャンセルして自分で TAB 移動させるか…だったはず。
メッセージは自分で調べて。
まぁ待てよ CreateWindowで作った子ウィンドウといっても色々あるだろう
339 :
ガウショ :2006/03/17(金) 17:46:27
VC6ですが、WIN32APIでプロパティシートを使う事は出来ますでしょうか? 「プロジェクト」→「プロジェクトへ追加」→「コンポーネントおよびコントロール」で「プロパティシート」を選択すると、CCmdTagetクラスがないから無理だと言われます。 MFCじゃないと無理なのでしょうか…
>>339 PropertySheet っていうそのものズバリの名前のAPIがあるよ。
「URLDownloadToFile」でエラーを返さない時があるんですが、現象としては一度ファイルのダウンロードに成功すると、 その後実際にはサーバ上にファイルをが無くなっているにもかかわらず、成功しファイルが書き込まれてしまいます。 キャッシュと絡んでいるようなんですが、何方か情報ありませんでしょうか。
キャッシュしてるんだろ。 検索すればすぐ出てくる。
そりゃーおまいらが苦しむところをみたいからさ
345 :
ガウショ :2006/03/17(金) 20:04:05
>>340 ありがとうございます。
PropertySheetがあることは知っていました。
が、サンプル(猫でも分かるプログラミング等にあるもの)どおり打ち込んでも表示されません。
と、思ったら表示されましたw
ご迷惑をおかけしました。
ヒント: 日本語ドキュメントしか読まないやつはバカ
普通は英語のドキュメント読むよな
350 :
デフォルトの名無しさん :2006/03/17(金) 23:11:04
質問です。 アクティブでないあるプロセスに対し、"A"というキーを押してから離した、というメッセージを送りたいのですが、 どうすれば良いのか分かりません。 具体的で簡潔なサンプルプログラムを交えながら教えて頂けないでしょうか?
352 :
API4日目 :2006/03/17(金) 23:21:16
334です。 フォーカス移動の件。 今のところIsDialogMessageを呼べば足りているようです。 Queryその他については、これから勉強します。 ごみ箱へ移動の件。 SHFileOperationでググっていろいろ分かりました。 ありがとうございました!
>>343 マイクロソフトに不利なことは訳さない。これ、常識。
Shell_NotifyIconでタスクバーに登録したアイコンが右クリック されたとき、タスクバーのメニューも一緒に表示されてしまうのですが、 これを阻止する方法ってありますか?
どうやったらそうなるのか知りたい。
Shell_NotifyIconでタスクトレイ常駐のソフトを作っているのですが、 タスクトレイアイコンをクリックした時の処理が非常に遅い時があります。 恐らく、他のタスクトレイに入っているソフトウェアの処理が終わるまで クリックが反映されないからだと思うのですが、解消方法はないでしょうか? どうぞよろしくお願いします。
>>354 ShowWindow(hWnd, SW_HIDE);
にするとかは?メインウィンドウも消えちゃうけど。
>>354 のような内容の質問を最近どこかのスレで見た気がする
Win32APIと関係ないかもしれませんが質問。 ウインドウを前回と同じの位置やサイズで表示するのは、 各アプリケーションごとに保存して実現しているのでしょうか? なにか自動でそうするAPIがあるのでしょうか?
.ini ファイルかレジストリに保存しておいて 自力でMoveWindow
364 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 19:02:47
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
アプリケーション(自分自身)を再起動する場合どうすればいいでしょうか? 多重起動を許している場合先に新たに起動して自分を終了させればいいと思うのだけれど、 多重起動が許されてない場合まず自分を終了してからじゃないと再起動出来ない・・・
多重起動を一旦許可してやれば良いじゃん
>>365 - スケジュールタスクに登録
- 自分自身でなく起動係を起動してから自殺する
>>360 GetWindowPlacement&SetWindowPlacement
バグってるつーか、ややこしい仕様のAPIだが。
>>366 そうすると、一部のコードセグメントは変わらないから、完全な再起動にならないぞ。
再起動の別プロセスつくって、それに任せるのがいいんじゃないかな。
そんなもん使わんでもGetWindowRectでおk 作る時はCreateWindowで指定すればいいし、 作ってから整理するならMoveWindowで充分
371 :
デフォルトの名無しさん :2006/03/18(土) 19:36:47
メモ帳のエディットコントロールは親ウィンドウのサイズ変更に同期してサイズが変更されると思うのですが、これはどうやって実現しているのでしょうか?
>>370 最小化・最大化してるときには注意がいるよな。
>>371 サイズが変更されるたびに親ウィンドウが全ての子ウィンドウの位置とサイズを調整してる。
休止状態から復帰したときにある処理を行いたいのですが、 いつがその時なのか判定できないので困ってます。 復帰したときにメッセージかなにか飛んでくるのでしょうか?
WM_POWERBROADCAST
Windowsをアンインストールして代わりにLinuxをインストールしたいのですが、 どのAPIでできますか?
クマー
>>370 そこまで手抜きすると最小化したり最大化したりしてるときに終了すると
次回メタメタじゃん。
>>376 起動可能なCD-ROMドライブにLinuxインストールCDを入れろという、メッセージボックスをだすAPI。
WindowsをリスタートするAPI。
詳しくは自分で調べて。
>>379 実際そういうメタメタなアプリあるよな。結構有名なものでも
ウィンドウ位置を記憶する場合は、マルチモニタも考慮しないといかんね。 以前、復元するときに画面内かチェックを入れていたがマルチモニタを 考慮していなかったので、セカンダリモニタだと位置が記憶されないって 苦情が来た。
>>383 MonitorFromRect, MonitorFromWindow, GetMonitorInfo辺りを使うことになるんかな。
POP before SMTPでメール送信するAPIはどれですか?
winsock
>>385 どうもです、winsockってAPIではないですよね
winsockを実装しないと駄目って事デツカ
それと、Outlook Expressとかも、winsockを使って通信を送受信を
しているということでいいのでしょうか?
388 :
デフォルトの名無しさん :2006/03/19(日) 14:12:12
_、 _ ∩ ( ∀`) 彡 確変だ!確変だ!確変の嵐だ! ((≡O ⊃ | | おまいら!左腕を上下 右腕を前後 し⌒J 同時にやってみろ!話はそれからだ!
>>387 CDO使えば?
pop before smtpがどうかは知らん。
>>387 WinSockはWindowsで通信を行う上では基本じゃないかな
簡単なのならWinInetとかでもできるのかもしれないけど、いつもSockでやっちゃってるからよく知らない
っていうかそれくらいググればすぐ出ないか?
>>387 WinAPIは様々な分野のAPIの集合体。
そして、その中でソケット関連の部分を担うのがWinSook。
まあ、なんでWinSockとか呼ばれてるというと、当初のWin16APIには socketが無かったんだな。 で、後からWinSockってのをつけたわけだ。 そういうことだから、あまり気にするな。
394 :
356 :2006/03/19(日) 22:48:19
どなたかいい方法知りませんか? どうぞよろしくお願いします。
さっぱりわかりません。 お手上げです。
>>394 タスクトレイのアイコンがクリックされたときに、クリックされたアイコン以外は無関係。処理するものは何も無い。
また、メッセージはPOSTされるので他のソフトの処理を待つ事も無い。
よってその仮定は間違っている。
ソースも詳細も無いので良く判らんが、単にクリックされたときの処理がおかしいか、スワップされてるだけじゃね?
397 :
デフォルトの名無しさん :2006/03/20(月) 01:12:07
VC++2005でWINAPIを使うには 何をインクルードすればいいですか?
#include <windows.h>
399 :
デフォルトの名無しさん :2006/03/20(月) 01:15:26
>>398 それがインクルードできないんですよ。
引っかかってエラー出てしまいます
まさかExpressとか言わないよな?w
401 :
デフォルトの名無しさん :2006/03/20(月) 01:17:26
Expressですけど これではできないんですか?
>>401 Win32 SDK(
>>4 のリンク参照)を別途入れよ。また、その他設定を要する。
403 :
デフォルトの名無しさん :2006/03/20(月) 01:19:25
SDK入れなきゃいけないんですか。 ありがとうございました。
404 :
400 :2006/03/20(月) 01:19:34
ツールバーのビットマップにLR_LOADMAP3DCOLORSを指定した場合、 画面のプロパティからウィンドウの背景色を変えると、 黒だけしか使ってないボタンが見えなくなってしまう。 「黒以外の色も使うようにする」っての以外に、 なんかいい解決方法ないかな。
エキスプレスって知らなかったけど無料なの?
コンパイルエラーも出ず、プログラムの動作も期待通りなのですが 時々画面がブラックアウトして少しの間PCが固まることがあります。 一時的にディスプレイへの信号が切れてるっぽいのでVRAMが解放されてないとかその辺 なんじゃないかと思ってるのですが、なかなか原因が見つかりません。 そこで怪しいと思ってる点なのですが、プロシージャ関数内にswitch(msg){}を含む関数 (引数はhWnd,msg,wparam,lparam,戻り値はLRESULT型でそのままプロシージャの戻り値に) を複数配置してif分岐でどのswitchを通るか選んでいます。 こういった記述は問題ないのでしょうか?
>>408 GDIのみ使ってる限りVRAM解放とかは関係ない。
時間かかる処理してて、メッセージループ回ってないとかじゃね?
リソース開放してないで使い切るとそうなる
指定フォルダ内のファイルを全て削除する関数はありませんか? 証拠隠滅用に簡単なのを作ってて、最近使ったファイル削除、ゴミ箱を空にまではできたんだけど、 ブラウザの履歴消去が探しても見つからない
ブラウザの履歴消去なら知ってるけど
履歴消去が目的なのでお願いします
それはFireFoxでも使えるのか?
DirectXを使わずにフルスクリーン(クライアント領域以外の余計な物を表示しない)にする方法を教えてください。 後、その状態で、メニューだけ表示する方法も。
最大化してウィンドウサイズの固定とか。
サイズ分だけはみでたウィンドウを作ればいい
・画面解像度を変更 ・ウィンドウのサイズを画面解像度と同じに変更
>>417 そんな面倒な事しなくても、
キャプションとボーダーを外して最大化すればいいんジャマイカ?
>>409-410 ありがとうございます。
時間のかかる処理と言うのは、メッセージループ内(case MOUSEMOVE内など)
で時間がかかってもダメなんでしょうか?
もしそうなら、最大限高速化して対応する(後は諦める)として
しばらくはリソースが解放されてないって線で調べてみます。
Spy++はどうやってメッセージを捕らえているのでしょうか?
フック
アパカー
425 :
デフォルトの名無しさん :2006/03/20(月) 23:05:13
ノック
426 :
デフォルトの名無しさん :2006/03/20(月) 23:07:50
横山
DeleteMenu()した後には必ずDrawMenuBar()しなければならないらしいのだが、 任意のウインドウに表示可能なポップアップメニューの場合、 DrawMenuBar()の引数 HWND には何を指定すればよいのでしょうか?
>>427 確かにあるね……。
何でDeleteMenu()のRemarkにもDrawMenuBar()があるんだろう。
メニューの変更をした場合は呼び出す必要があるだろうが、
DeleteMenu()を呼び出したということは、
すでに、メニューを破棄してしまったのだから、
もはや存在しないメニューに対して、DrawMenuBar()を呼び出せるわけもないと思うのだが……。
>>428 > DeleteMenu()を呼び出したということは、
> すでに、メニューを破棄してしまったのだから、
いや、DestroyMenu()じゃなくて、DeleteMenu()です。
メニューアイテムを削除した後の話。
あ、勘違いしてた。 それなら普通に、DeleteMenu()にも指定したメニューハンドルを指定すればいいでそ。
・・・ HWND 型にメニューハンドルを渡すのか?
Win32APIの初心者で、まだweb上の基本的な構文しか身につけてないのですが Win32APIを学ぶのに、全ての文法を覚えるのは、とてもじゃないけど無理だと思ったのです で、Win32.APIを学ぶ為の書籍等は、あるのでしょうか Win32APIを熟知していくのにこの書籍はもっとくべきという本はあるんでしょうか できれば、教えていただきたいです。
(´-`)。oO(Win32APIの構文や文法・・・)
434 :
432 :2006/03/21(火) 03:45:44
失礼しました 構文や文法は、記述方法としてはCの文法で、いける(いけないかもしれないですが) 要は、Win32APIを学ぶ為の図書があれば教えて頂きたいです
すれ違い
>>427 いくら任意のウィンドウに表示可能なメニューと言っても
Deleteやら操作するのはどこかのウィンドウのプロシージャだろ
その時の自分のハンドルを渡せばいい
単にそれを適応するウィンドウのハンドルじゃないか? プログラムにウィンドウがひとつとは限らないわけだし
>>432 >>要は、Win32APIを学ぶ為の図書があれば教えて頂きたいです
ASCII出版 Cheales Petzold著 プログラミングWindows 第5版
なんといってもこれだろう、文章がしっかりしていて、翻訳もしっかりしている
序章のあたりは物語としても興味深く読めるしWinndowsに対する造詣も深まる
その導入部から徐々に
WIN32APIの本質に進んで分厚い本でも飽きさせない魅力があるYO!
まあそんなもの読まずにやっている奴の方が多いけどな
解らないことがあっても掲示板に書き込めば 優しいお兄さん達が答えてくれるからな!!!!
>>438 よくnyとかの話題する?
別に深い意味はないけど。
442 :
408 :2006/03/21(火) 11:18:19
たびたびすみません。 ブラックアウトの原因ですが、staticで宣言したクラスの関数に引数としてHDC(描画元、先ともに)を渡して 描画(TransparentBlt)させてるところっぽいです。 変更があるごとに50〜130回ほどTransparentBltしてるのですが これってリソース使い尽くすくらい多いのでしょうか? 解決策はDirectDraw使うくらいですかね・・・?
どーせSelectObjectの使い方が間違ってるとかそんなところじゃね?
>>442 そうじゃなくて、GDIリソースを作るだけ作って解放してないって意味。
リソースリークしていないか確認するならタスクマネージャ。 ハンドルの数、GDI オブジェクト、USER オブジェクト当たりはチェック付けとけ。
>>437 その後いろいろ試してみたところ、特にDrawMenuBar()を呼び出さなくても
メニュー項目はちゃんと削除されることがわかった。
ただし、システムメニューの場合はDrawMenuBar()を呼び出さないとダメらしい。
・・・ドキュメントが間違っているのか?
>>446 System menu の場合、ウィンドウサイズによっては2段になったりして ClieentRgn の更新をしないと
いけないから明示的に DrawMenuBar() 呼び出さないとマズイ と理解している
448 :
408 :2006/03/21(火) 13:54:51
hdc_mem = CreateCompatibleDC(NULL);
hBmp = (HBITMAP)LoadImage(NULL,"back.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hBmp, (int)sizeof(bmp_info), &bmp_info);
bmpw = bmp_info.bmWidth;
bmph = bmp_info.bmHeight;
SelectObject(hdc_mem, hBmp);
back_hdc = CreateCompatibleDC(NULL);
hDummy = CreateCompatibleBitmap(hdc_mem,bmpw,bmph);
SelectObject(back_hdc,hDummy);
DeleteObject(hDummy);
こんな感じで作ってるのですが、おかしいでしょうか?
終了処理にDeleteObject⇒DeleteDCもやってるのですが・・・
>>444-445 オブジェクトのほうはタスクマネージャで見たところ、常に二桁程度で増えてる様子
もなかったです。(ためしにEndPaint消してみるといい具合に増えます)
GDIについて勉強しなおしてきなさい。 サンプルソースコードは沢山ネットに転がってるから。
451 :
デフォルトの名無しさん :2006/03/21(火) 14:09:35
フォルダの所有権を変更するAPIってありませんか?
452 :
408 :2006/03/21(火) 14:53:07
>>449-450 バグ取りに付き合ってもらってすみません。
終了時にSelectObjectで対象を元に戻してからDeleteしてみましたがやはりダメでした・・・
特定の部分は透明で後ろのウィンドウが見えているが、 その部分をクリックしてもちゃんと反応するウィンドウを作るにはどうすればいいでしょうか?
>>453 レイヤードウィンドウで限りなく透明な不透明領域を作るとか。
>>441 >438だが
nyを話題に書き込んだ事は一度もありませんが
なにか?
nyはプログラミング的にはすごく関心はあるけどね
>451 SetNamedSecurityInfoで SE_FILE_OBJECT OWNER_SECURITY_INFORMATION
457 :
441 :2006/03/21(火) 20:33:31
>>455 Winndowsが気になっただけです。
すいません。
>455 だけど、なんであやまるのかな? おいらは最近Windowsの実装を仕方無しにやり始めたYO マネージドだとかアンマネージドとかややこしいねwww 最近なんとなく、簡単なGUIの実装が組めるようになってきた と少し嬉しかったので書いて見る スレ汚しスマソ
459 :
デフォルトの名無しさん :2006/03/22(水) 16:53:11
つーか、
>>453 の「ちゃんと反応する」とは
どっちが反応することを期待してるんだ?
>>459 リージョンだと抜けた部分の操作が下のウィンドウに行っちゃうよ?
>>460 「後ろのウィンドウが見えている"が"」だから、透明な自ウィンドウだと思う。
俺のアンテナもちゃんと反応する
俺のアンテナも感度良好ですぎょん
俺のちんこは早漏気味ですよん。
金冷法を薦めるぞ、やってみちん。
EXEの実行をフックして実行させないようにって どうやるんでしょうか? ウイルス対策ソフトとかはやってると思うんですが。
ウイルス対策ソフトつかえばいいんじゃね?
CreateProcess をすり替えてしまえ
クリティカルセクションが使用するリソースは CRITICAL_SECTIONが占めるメモリだけなんですか?
いいえ
ほう。ということは、いくらメモリ周りが潤沢でも 数万個確保するのはあまりよろしくないのですね?
クリティカルセクション数万個確保って……
マンコー
>>472 例えば
struct { hoge bee; boke gaa; } nanika[10000];
なんてのがあって、個々の構造体へのアクセスをクリティカルセクション内で
行いたいなんて場合は、構造体の中に CRITICAL_SECTION を置くのではなく、
適当なハッシュで個数を減らすのが定石です。
例えば CRITICAL_SECTION cs[100]; なんてのを用いて、cs[index%100] で
クリティカルセクションに入る。1/100の確立で関係ない構造体へのアクセスと
衝突するけど、それによるパフォーマンスの低下は微々たるもの。
万個万個ってあまえら、連発すんなぁ。 ぐへへへ。
>>476 [ ゚д゚]y-~~~ デフラグガカンリョウシマシタ
/[へへ
、。。ぁあえぐすってなへへへまらん万万個個発連
春休みか。
479 :
デフォルトの名無しさん :2006/03/23(木) 22:33:57
Win32APIの中で一番長い関数名ってなんだっけ? 前にこの板のどこかで見たんだけど忘れちゃった。 偶然見つけた52文字 in advapi32.dll ConvertSecurityDescriptorToStringSecurityDescriptorA ConvertSecurityDescriptorToStringSecurityDescriptorW ConvertStringSecurityDescriptorToSecurityDescriptorA ConvertStringSecurityDescriptorToSecurityDescriptorW
480 :
453 :2006/03/24(金) 09:29:04
逆に短い関数名ならArc
GDI+ Flat APIには結構長い名前の関数が多そうな気がする。
そうでもないぞ。gdiplus.dllだと長いっても GdipGetStringFormatMeasurableCharacterRangeCount (49) GdipSetImageAttributesOutputChannelColorProfile (48) ぐらい。まあ、短いのでも GdipGetRegionData (18) はあるが。
すでに起動しているアプリケーションのウィンドウサイズを 自在に変形するにはどうすればよいでしょうか? この場合の変形というのは サイズをかえるという意味ではなくて、 リージョンなどを使って星型とかキャラクタの型だとかに 変形することはできるのでしょうか?
できますよ
485 :
ねこ :2006/03/24(金) 12:58:08
質問させてください。 現在、VB6.0からVB.NETへ移行中です。 iniファイルから文字列を取得するAPI GetPrivateProfileString を使用する上でわからない所があります。 GetPrivateProfileString <引数> lpAppName:セクション名 lpKeyName:キー名 lpDefault:キーが見つからなかった場合のデフォルトの文字列 lpReturnedString:取得した文字列が入る nSize:同、文字数 inifilename:INIファイル名 @戻り値@ 取得した文字列 で、VB6.0では、lpReturnedStringにはnSizeで指定したバッファ分戻ってきた のですが、(空文字列で埋めてそのバッファ分を返していた) VB.NETでは、指定したバッファ分ではなく、文字数分のみかえってきてしまいます。 しかも、文字列AAAだとすると、"AAA だけで、後ろの " が抜けてしまう状態です。 どうすればいいかご存知の方、教えてください! 宜しくお願いします。
意味分からん
そういう現象なら VB.NETの仕様でただしいような気がする。 たぶんいままでバグってた
488 :
ねこ :2006/03/24(金) 13:26:13
えっ!? ばぐ。。。 すみません! VB6.0では lpReturnedString(取得した文字列が入る変数) = Space(256) llngRet = GetPrivateProfileString(・・・・lpReturnedString,256(バイト数)・・) っといった具合に書くと、"文字列+空文字"(256バイト分)で返ってきてたんですが。。 こっちが間違ってる感じですか?? 宜しくお願いします!
感嘆符がうざ
マーシャラがNULL文字で切ってんだろ そもそもそれで何か不都合があるのか?
491 :
ねこ :2006/03/24(金) 14:01:16
無事解決できました。 ありがとうございます。
492 :
デフォルトの名無しさん :2006/03/24(金) 17:00:09
他のアプリでクリップボードからデータが読み出されたことって、 クリップボードビューアチェインのメッセージからは認識できないんでしょうか。 どうやって認識可能ですか?
493 :
デフォルトの名無しさん :2006/03/24(金) 22:40:51
バイナリファイルの途中にデータを挿入したり、途中の指定バイトを削除するAPIってない? CEでの開発を想定しているので、できればメモリに読み込ませたくないんです。
メモリに読み込まなくても自前でできるでそ。
ファイルの途中を抜いたり、途中を追加することはできない。 自前で、ずらすしかない。その際、一時データをメモリに 読み込ませるのは仕方がない。
まとまったお金ができたから、 前々から欲しかった Advanced windows をついに購入するぞ! …と思ったら、何処のオンライン書店でも 売り切れとか重版未定とかなってるじゃーか! どういうことだ!! た、楽しみにしてたのに……orz
>>496 それ大分前に既出@推薦図書スレ
俺も買おうと思ったが無理だった
俺の場合、学校の図書館にたまたまあったので助かっている。
Advanced Windows、ちょっと立ち読みしてから買いたいんだけど、近所の本屋には置いてないな……。 大学の図書館にリクエストしてみようかね。
ウィンドウプロシージャでのキーボードショートカット処理の質問なのですが タスク切り替えのAlt + Tabを「押されたタイミングで」検出することって 出来ないんでしょうか? Alt押しながらだとWM_KEYDOWNのVK_TABは発生しないようだし、 WM_SYSKEYDOWNではAltが押された情報のみしか送られてこず、 WM_SYSKEYUPでやっとTabが「離されたタイミング」を検出できたところです。 要はタスク切り替え用のメニューウィンドウが出る直前までに 処理したい事があるのですが、なんとかなりませんでしょうか。
>>500 WM_ACTIVATEAPPじゃダメなんか?
全ての流れを掌握してるシステムより先に検知することなどできはしない
キーボードドライバになんかかませばOSより先に知れるが。
そんなことを知ってるヤツがここで聞くかよw
505 :
500 :2006/03/25(土) 13:08:30
えっと別に抑止したいとかOSより先にっとかゆんじゃなくて、 タイミングが知りたいだけなんですが… WM_ACTIVATEAPPはAlt + Tabによる切り替えなのか 判断できないと思うんですけど、何か方法があるんでしょうか? クリック操作でウィンドウが背後に回る時とかも来ますよね…
GetKeyState取るとか。 フック掛ければ早そうだが。
フックかければ、ユーザモードアプリより先に取れるはずだよ。 昔、それで、Alt+Tabを独自アプリに切り替えるプログラムがサンプルで Dr.GUIに出てたはず。
win2000とかなら取れるけどwin9x系だと取れないことない? 以前winキーのフックができなくて困った記憶がある
ローレベルフックしようとしたということではあるまいな
そうそうローレベルフックしようとしてたような希ガス だってローレベルじゃないとWinキー拾えないっしょ?
511 :
510 :2006/03/25(土) 14:08:52
記憶が定かじゃないんで間違ってるかもw
同じくWinキーはローレベルフックでないと駄目だった記憶が…
513 :
デフォルトの名無しさん :2006/03/25(土) 18:35:02
はじめまして 同じDLLをLoadLibraryで複数ロードした場合 h1=LoadLibrary("test.dll") h2=LoadLibrary("test.dll") インスタンスが複数できるイメージでいたのですが あくまでもインスタンスは1つなんですね これを上記 h1,h2で個別のメモリを共有しない方法あります? 検索すると逆に アプリケーション間でメモリを共有する 方法はたくさん載ってるのですが よろしくお願いします
>>513 test.dllを別名で保存してロードすればいい
LoadLibraryがやってることを全て自前で実装してしまえばどうとでもできる。
モーダルダイアログをモードレスダイアログのように親ウィンドウとアクティブ/非アクティブ などの動作を共有する方法はないでしょうか? 別のウィンドウに親と自ウィンドウが隠されて、親ウィンドウがアクティブになった歳に 一緒に前面にくるような仕組みを行いたいのです、よろしくお願いします。
モーダルといえば、ふつうそうなるけど。 モードレスのときに、モーダルのように、親からアクティブにしてほしい、ってことか?
モーダルダイアログしか作成できないので、擬似的にでもモードレスと同じ動作をしたいのです。 現状では、スレッドを作成してモーダルダイアログを作成して、親ウィンドウと別々の 動作を可能にしているのですが、親ウィンドウが前面に出てくる時に 自ダイアログが前面に来ないのでこれをモードレスと同じような動きを作りたいと思って 質問させていただいています。
モーダル、モードレスじゃなく、ウィンドウの親子関係の問題の気がするが…
どうにかしてモーダルダイアログのHWND持ってくる必要があるが、 SetWindowPosとかでZオーダー変えればいいんじゃねーの? つーか、 > モーダルダイアログしか作成できないので コレがさっぱりワカンネ
モーダルにしたければ、親ウインドウを無効にするだけでできるんだが、 まさかリソース系の専用のAPIを使わなければできないとか思ってるのか?
モーダルで作成して、SetParentで親ウィンドウを指定したのですが 親ウィンドウ内にダイアログが作成されてしまいました。 モードレスも作成は出来るのですが、メッセージループにIsDialogMessageをかませられないので 正常に動作しなかったのです。
ウインドウスタイルの設定すらまともにできないのなら、 猫のページを見て、やり方を覚えてからにしろ。
>>513 逆に聞くが、なんで別のメモリにしたいの?
スレッドセーフじゃないDLLを使わなくちゃいけなかったときに
>>514 の方法をやったことがあるな。
>>513 が同じ理由なのかは知らんけど。
>>525 それよりも、スレッドセーフにするラッパーDLL作った方がいいんじゃない?
>>526 kwsk
DLLの関数Aを呼んだあとで関数Bを呼ぶんだけど、
Aの結果を受けてBの動作が変わるという仕様だった。
「Aの結果」というのを、たぶんグローバル変数で持ってたんだな。
で、マルチスレッドで問題が起きた、と。
そのときの俺には
>>514 以外にいい方法が思いつかなかったんだ。
>>520 ダイアログボックスを作るのにはDialogBox関数しかないとか思っているオチではないかと
CreateDialogだろ、知ってるよ。IsDialogMessageをメッセージループに入れられないから 正常に動作しないんだよ。 自己解決するのでもう質問への回答はいらないです、失礼します。
>>10 研究成果は国民の共有財産だ。
即物的なものにしか価値を認めないDQNにはわからないかもしれないがね。
>>527 ラッパーDLL内で元のDLLをCopyFile
>>10 は三週間も経った後に
見当違いのレスされてカワイソス
>>529 本当にしたいことを捨て台詞とともに書くようじゃ、まっとうな回答は得られる訳ないな
まともな質問もできないから自分に逆切れしてるだけかと
536 :
デフォルトの名無しさん :2006/03/27(月) 22:19:44
エディットボックスでダブルクリックを検知したいんですけど、どうすればよいでしょうか?
勇気で補え
ttp://www14.big.or.jp/~ken1/tech/tech9.html ここの下記のコード、コピっても全く反応がありません。
case WM_PAINT:
{
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd , &ps);
…
Blit(hdc,hdc,0,100,50,50,400,260,RGB(0,0,0));
EndPaint(hWnd , &ps);
}
break;
どこが悪いか教えてください。お願いします。
>>536 Edit Boxぐらい自前で作れるよ。そうすりゃ簡単。
どうしても、いやならメッセージをフックしろ。
GDIナツカシス
>>538 透過部分を黒(0)、描画部分を白(1)にしたマスク画像を作って
まずマスク画像をBitBleでラスタオペレーションにSRCPAINTで描画、
そのあと本画像をSRCANDで描画すると透過処理できる
「背景とマスクをSRCPAINT(論理和)で結合し、そのあとSRCAND(論理積)で結合することによって
黒(0)の部分は全て0になり、白(1)の部分だけに描画される」
とか俺のAPIメモに書いてあった
フックってDLL作るのがメンドイよなー 実行ファイルでも大丈夫って噂を聞いたが本当だろうか
前提条件が他プロセスなのか? 情報を小出しにしないで、できる限り説明してから質問しろ。
>>536 NM_DBLCLK or サブクラス化
>>539 どうやって作るのかも言えよ!
つかえねえなボケが。
EditBoxくらい、っていうけど、ちゃんとしたEditBox作るのは結構大変だよ。 たとえば、「右から左へ読む」とか「UNICODE制御文字の挿入」とか。
大変って何が大変なんだ? アルゴリズムを考えるのが大変なら、自分の脳味噌を呪えよ。
エディットボックスのダブルクリック検知くらいでフックとかアホかと・・・
>>543 NM系はコモンコントロールの通知メッセージで標準コントロールじゃない
故にサブクラス化にしる
すみません、CreateFont/CreateFontIndirectで、固定ピッチの太字フォントを強制することは出来ますでしょうか? LOGFONT logFont = {0}; HFONT hFont; HDC hDC = GetDC(NULL); logFont.lfHeight = nHeight; logFont.lfWidth = 0; logFont.lfWeight = bBold ? FW_BOLD : FW_NORMAL; logFont.lfCharSet = SHIFTJIS_CHARSET; logFont.lfOutPrecision = OUT_DEFAULT_PRECIS; logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logFont.lfQuality = DEFAULT_QUALITY; logFont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; _tcscpy(logFont.lfFaceName, _T(pszFontName)); hFont = CreateFontIndirect(&logFont); こんなコードを書いているのですが、FW_NORMALではフォント幅が たとえば半角8pixel/全角16pixelで全て固定できるのですが FW_BOLDの場合は9pixelとか17pixelとかの半端な文字が出てしまいます。 何か方法がありましたらご教示頂けませんでしょうか。
・日本語をあきらめ、Courier等を使う。 ・太字描画処理を自分でやる。
それを聞いて思ったんだが、オマイラもちろん コード書くときのフォントはCourier(New)だよな!?
Lucida Console です。
ああ...書き方がまずかったですね、すみません ・lfWidthを8と指定しても9になる ・全角が半角の2倍にならない など、FW_BOLD指定時とFW_NORMAL指定時でフォントの論理的な属性が 異なってしまう点で行き詰まっています。 明示的に指定した値そのもので、かつ全角が半角のきっちり倍になるような 太字フォントで描画することは可能でしょうか?
自作フォントです
目が見えません
>>554 , 558
無理ですか...ありがとうございました。
太さがNGなら色で区別つければ? # 多分見難いかもしれんけど・・・
固定ピッチのフォントは、ピッチが固定してるだけであって、2byte文字が1byte文字の2倍の幅とは限らない。 自前のウィンドウに描画するなら、1文字づつDrawTextすれば? あるいは、2倍幅になるようなlfWidthのみを使う。
564 :
563 :2006/03/28(火) 17:49:54
>固定ピッチのフォントは、ピッチが固定してるだけであって、2byte文字が1byte文字の2倍の幅とは限らない。 (追記) BOLDにしなくてもサイズによっては、2倍になりません。
565 :
563 :2006/03/28(火) 17:51:32
>あるいは、2倍幅になるようなlfWidthのみを使う。 (訂正)あるいは、2倍幅になるようなlfHeightのみを使う。
プログラミングにMSゴシック使っている俺は負け組?
基本でしょう
> 1文字づつDrawTextすれば? ClearTypeとの相性最悪だから俺は好きでない。
東風明朝 さざなみ明朝 1 l I | の区別が楽。 0の中に点があれば、もっとよかったけど。
SMゴシップ
>>557 フォントの指定を持って厳密におこなうと、lfWidthが8の場合も取れる事がある。
ただし、WIFE時代のフォントだけじゃないかな。日本語だと。
列挙して獲得 DCにセット後、論理フォントで確認、まですれば完璧。
一般的には、文字を描画するときに文字間が指定できる API があるから、それを使う。
IMEで入力中というか、未確定文字列があるかどうかを知るには どの関数が適してますか?
質問です 自分の作ったアプリがWinXPでは動くけど、9xでは動かない時、原因としてどのような事が考えられるでしょうか。 ・WINVER, _WIN32_WINNT, _WIN32_WINDOWSのバージョンを適切に設定する ・ユニコードビルドしない くらいしか思いつかないのですが、何か他に気をつけなければならない点があったら教えていただけないでしょうか
>>573 XPにも9xにも実装されている関数だとしても油断してはならない。
細かい差異が存在する可能性がある。
たとえばCreateWindow(Ex)では、
NTならHINSTANCEはヌルにして良いが、9xではヌルにできないと言う違いがある。
そんな具合なんでエラーになる箇所で呼んでいる関数をMSDNなんかで調べてみな。
・IEのバージョン ・使用しているAPIが9xに対応したものかどうか
>>574 なるほど、そりゃキツい
というか、9x系列のOSを持ってないので、9xでも動くように開発するのは無理そうですね…
577 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 13:07:19 BE:317747579-
GetDlgItemTextを行うためにDialogBoxで呼び出したダイアログボックスのハンドルを知る方法って無いですか?
578 :
デフォルトの名無しさん :2006/03/29(水) 13:18:36
教えてオーナードロー&visual-styleに詳しい人 Vistaでプッシュボタンにカーソルを合わせると、じわぁと色が変るのですがあれってどうやるんでしょうか?
579 :
デフォルトの名無しさん :2006/03/29(水) 13:21:08
>>577 LRESULT CALLBACK About( HWND hDlg,....)
{
n = hDlg;
......
}
これじゃダメなの?
580 :
578 :2006/03/29(水) 13:44:55
自己解決(してないけど)
MSDNフォーラムみてたら
「まだサポートしてない、Beta2辺りで新しいAPIを公開するかもしれないから待ってね」(適当に訳した)
とあった…orz
>>577 つ FindWindow()
ってDialogBox()で指定するDLGPROCのHWNDでいいんジャマイカ?
ここで質問していいのかわからないのですけど、 「ファイル名を指定して実行」ダイアログのログってどこに保存されてます?
レジストリのどこか
>>581 レジストリ
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
ありがとうございました。
パソコン初心者も見てるんだ
586 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 15:41:45 BE:322790988-
>>579 これで実行したものの、c_tempの中身が空になって終わりなんですよ。
ちなみにEndDialog(hDig, LOWORD(wParam));の前にブレークポイントを置いて確認しました。
LRESULT CALLBACK WProc_DISC_NAME(HWND hDig, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case WM_INITDIALOG :
return FALSE;
case WM_COMMAND :
switch(LOWORD(wParam)){
case BTN_OK :
GetDlgItemText(hDig, TXT_DB, c_temp, sizeof(c_temp));
EndDialog(hDig, LOWORD(wParam));
return TRUE;
break;
default:
break;
}
break;
default:
break;
}
return FALSE;
}
587 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/03/29(水) 15:49:23 BE:247136977-
c_tempの宣言はちゃんとしてる? TXT_DBというコントロールにちゃんと文字列はあるの? なんでGetDlgItemTextの戻り値をチェックしないんだ?
>>588 >c_tempの宣言はちゃんとしてる?
グローバル変数として宣言してあります。
>TXT_DBというコントロールにちゃんと文字列はあるの?
TXT_DBは別のダイアログでした。
>なんでGetDlgItemTextの戻り値をチェックしないんだ?
クイックウォッチで無いと返されました。
結論:バグ取りに手伝わせてしまい非常にすみませんでした。
(何故かメインのダイアログにあるTXT_DBをGetDlgItemTextの引数に指定していた上に
このダイアログのエディットボックスのIDをちゃんと変えていなかった為。
ちゃんとIDを決めてそのIDを引数にしたら上手く取り込めました。)
>555 Anonymous 最近聞いた。
タスクトレイアイコンの上でマウス動かすとツールチップ出てくるけど、 あれをコードで出すにはどうすれば良いの?
TextOut
595 :
593 :2006/03/29(水) 23:48:44
>>594 それってオレに対するレス?
だとしたらもう少しヒントお願い…
597 :
デフォルトの名無しさん :2006/03/30(木) 00:49:25
メモリデバイスコンテキスト関連の質問です。 SelectObject (hdcMemM1, ii[0]) ; SelectObject (hdcMemM2, ii[1]) ; BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ; BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM2, 0, 0, SRCCOPY) ; ここの部分を、下に直すと上手く動かなくなります。 SelectObject (hdcMemM1, ii[0]) ; SelectObject (hdcMemM2, ii[0]) ; BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ; BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM2, 0, 0, SRCCOPY) ; 出力したい画像が同じで、bitbltを使う場合同じ画像の出力がうまくいきません。 この場合メモリデバイスコンテキストはどのようにするのがヨイんでしょうか?
598 :
593 :2006/03/30(木) 00:50:57
>>596 バルーンはNIM_MODIFYすると直ぐ表示されるけど、
ツールチップはNIM_MODIFYしても何か表示されないっぽくて困ってます
>>597 なんで転送元二つも必要なん?
画像が同じなら一つでいいじゃん。
>>599 トンクスです。
ビットマップハンドルをコピーしてるのが良くなかった気がする。。
デバイスコンテキストハンドルのコピーで増やしてみる。
デバイスコンテキストだけで、128枚画像あるorz 疲れた
>>597 1つのオブジェクトを複数のデバイスコンテキストが同時にSelectすることは出来ない。
一つの「ビットマップは」だろ。
603 :
602 :2006/03/30(木) 13:33:28
>>753 動的にメモリを確保したいときに使う。
mallocしてしっかりfreeしないと、メモリリークが激しいよ。うん。激しいよ。
604 :
602 :2006/03/30(木) 13:34:05
あ・・・っ!激し・・すぎ・・!
>>753 動的にメモリを確保したいときに使う。
mallocしてしっかりfreeしないと、メモリリークが激しいよ。うん。激しいよ。
606 :
602 :2006/03/30(木) 13:35:16
あ・・・っ!激し・・すぎ・・!
607 :
602 :2006/03/30(木) 13:38:24
つまり SelectObject (hdcMemM1, ii[0]) ; BitBlt (hdc, pos[0].x, pos[0].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ; BitBlt (hdc, pos[1].x, pos[1].y, cxSource, cySource, hdcMemM1, 0, 0, SRCCOPY) ;
>>605 malloc/freeだとフラグメント解消できないから、
プロはHeapCreate(0,0,0)してHeapAllocを使う。
CreateThreadもリークしますよね? どうしよ・・・・
C++NETでSMTPによるメール送信プログラムを実装しました 次にSocketを使用して、SMTPメール送信するプログラムの実装をして見ようと 思うのですが、大まかな流れは 1 Socketの初期化 2 TCP/IPを設定 3 SMTP設定 4 Socketを閉じる こんな感じでいいでしょうか?
普通はプロトコルとかエンコードとかを考えると思うが
うむ まずはプロとコルだな プロをマスターした後にコルを習得せよ
ドトネトがやってくれるんじゃね
>>611 だす
みなさんどうもです
PCからカキコ出来ないので、携帯からです
実は、TC/IPプロトコル部分をrawSocketを用いて実装したくて
WIN32APIをC++でコーディングした方がいいかと思い、このスレで質問させて
もらいましたが、ドットネットでもrawSocketの関数は用意してあるのでしょうか?
>>611 Cygwin使えばUnix用のsmtpsendのソースがそのまま使えるよ。
#WinSockは色々互換性がないので注意。
いずれにしても、後はネットワークプログラミングスレにでも。
SMTP (Simple Mail Transfer Protocol) そんなに難むほど難しいことかな?
HTTPよりはムズイんじゃない?
ウィンドウ内に二つの違う画像を並べるのってどうやるの? ______________ | | | ◎ △ | |____________| こんな感じで、メニューで開いた画像を左にとかやりたいんだけども
>>620 全然
620が「何処がどうムズイと思うのか」が知りたい
それから、巨大な画像も 描画エリア内に収まるように縮小したりしたいんだけど 画像を扱うTIPがあまりなくて(´・ω・`)
Win32APIを始めようと、サイトを見ながら導入しようとしました。コンパイラはBorland C++ Compiler 5.5で、 サイトに書いてある通り、bcc32 -W test.c としてコンパイルしても Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland test.c: 警告 W8057 test.c 9: パラメータ 'hInstance' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'hPrevInstance' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'lpCmdLine' は一度も使用されない(関数 WinMain ) 警告 W8057 test.c 9: パラメータ 'nCmdShow' は一度も使用されない(関数 WinMain ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) このようなエラーが出てしまいます。どこが問題なのか指摘して頂きたいのですが、お願いします。
>>621 好きなように描け。
>>623 好きなように縮小しろ。
>>620 もしや、POP before SMTPとかSMTP認証とかと勘違いしていないか?
SMTP自体はCHAT作るより簡単だぞ。
POP before SMTP だって、ソケット通信さえ出来ればどうということ無いしなあ。 メール関係で一番面倒なのは、メールメッセージそのものを作るところだよ。
>>624-625 ありがd
ちょいと色々いじくってるけどまだ上手くいってない
>>627 それが出来ないから聞いてるんだよ('A`;
あと読み込んだ画像データを
ボタン押したらCUIプログラムに送って実行させるみたいな風にするにはどうしたらいいかな
それが一番やりたい
>>626 -Wがあるから大丈夫なはずだけど何でだろう。
間のスペースが全角なのは、ここに書くときにそうしたと思うし。
>>621 位置変えはBitBltの第2、第3引数に普通にあるような。
>>629 CreateProcess。
>>631 そうですか・・・もう少し検索して方法を探してみる事にします。レス有難う御座います。
-tWでないっけ?
windows.hを挿入してないとか PlatformSDKをいんぽしていないとか もしそうなら抜くぞ
>>634 両方試してみましたができませんでした。
>>635 サンプルコードですので、間違ってはいないと思うのですが・・・。
SDKをもう一度インストールし直してみます。
ダメであれば諦めます。有難う御座いました。
>>626 というか真面目に学ぼうとするなら今更BCCなんて使うなや
そうだな VC++2005ExpressEditionが無償で配布されてるんだからそっち使った方がいい 俺もBCCから乗り換えた
そして、LPTSTR hoge="hoge"; みたいなサンプルでハマる、と。
プロジェクトの文字セット設定を変えればよろし
最初からTEXTマクロとかTCHARを使って書けばいいんだけど、最初はウェブからコピペしちゃうよね。 VS2005でもエラーがなく通るのはPetzoldのサンプルコードぐらいか。
TEXTマクロなんか使わなくても普通に通る
デフォルトで_UNICODEとなってからはTEXTとかTCHARとかやめてwchar_t, L""で書いてる
MFCのウィザードで自動で作られるようなメニューのサンプルってどこかにない? 開く・貼り付け・ヴァージョン情報あたりで十分なんだけど
できね・・・Orz。最後に一つだけ質問させて下さい。SDKは25MBをDLして、CoreSDK-common.1.2.cab のフォルダをbcc32.exeと同じ場所に置けばいいのですよね?
>>643 引数がLPCTSTRになってる奴にwchar_t*って渡せたっけ?と思って
MSDNライブラリにあった型定義一覧を探してたが見つからない・・・
誰かどこにあったか知らない?
そもそも簡単なサンプルのコンパイルならPSDKイラネはずだが。 最低限のSDKはBCCに付いてくる。
>>646 LPCTSTRで検索したら普通に出てきたぞ
#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
typedef CONST WCHAR *LPCWSTR;
typedef __nullterminated CONST CHAR *LPCSTR;
なのでLPCTSTRにwchar_t*は渡せない
const wchar_t*なら渡せる
>>648 逆
非constなポインタ引数にはconstポインタは渡せない。
>>647 自分には無理な様なので脳内コンパイルで楽しみます。ご迷惑お掛けしました。
助言して下さった方々有難う御座いました!諦めます。
実は警告とエラーの区別が付いていないだけと予想。
>>651 ぬォォォォォォォォォぉぉぉできたーーーーーーーーーー!!!!
出来ましたよ!警告とエラーと言う意味深な発言をしてくれたので、まさかと思い実行しましたら
ウインドウが表示されました。有難う御座います。
コンパイル結果が警告が出たので先入観から無理と判断してしまってました・・・。
警告が出て違和感ありますが、出来てよかったです。
653 :
648 :2006/03/31(金) 21:36:44
>>646 漏れも
>>649 も寝ぼけてたようだww
(
>>649 の二行目は正しい)
LPCTSTRにはwchar_t*もcons wchar_t*も渡せる。
誤解のないように他のも言っておくと、
当然const LPCWSTR(=const wchar_t* const)やconst LPWSTR(wchar_t* const)も渡せる
(シグネチャは同じだしね)
ちゅか誰か俺の644に応えて
>>652 Warning も全部解決しる
メッセージをよーーーーーく読めばどうすれば分かるはず
C++限定の方法。 int WINAPI WinMain(HINSTANCE, HINSTANCE, char*, int)
ある区間のコードだけは他のスレッドに制御が移らないように出来ますか?
書籍やウェブサイトどおりに int WINAPI WinMain(・・・){ ・・・ return msg.wParam; } とすると警告が出るのですが、return (int)msg.wParam; にしたほうがいいんですか?
無害な警告だし、明示的にキャストして消しても問題ないと思われ
>>660 ありがとうございます。周りに合わせてキャストせずに放っておくことにします。
x64 だと問題があるが、まあ意味はないな
>>655 どう試してみても消える事が無いです。基本から始めていきいつか警告の意味を理解してみます。
WinAPIは楽しいですね。
俺はstatic_castする。
>>664 誰もそんなこと聞いてねーよボケ
だいたいC++かどうかもワカンネーだろ
_tWinMainにしろ。
>>658 カーネルレベルで共有セマフォをねじる。
または、それが発生するような処理を「中途半端」に実行する。
スレッドレベルならば、リソースは共有されているわけで、ひたすら suspend すりゃいいと言うのが妥当。
スレッドの優先順位を最高レベルに上げる。
>>669 それだけは、やるな。
止めたいスレッド以外、つまりほかのプロセスまで止まる。
システムがCPUパワーをどのように割り振ってるか調べればわかるはず。
>>670 調べるからAdvanced Windowsくれ。
_tmemset() なぜないんだ
>>672 つstd::fill_n
C++だけど。
>>670 他のプロセスを止めてはいけないという前提条件は定義されていない。
CPUが2つ以上あったら、suspendThread以外の手法では 並列実行されるけどそれは、「制御が移らない」という条件を満たすといえるの?
複数のプロセッサを考慮するという前提条件が存在しないが、 それを追加するならプロセスの使用するプロセッサをマスクすればいいだけ。
DualCoreとかHTとかある現状で、マルチスレッドプログラムが マルチプロセッサを考慮しないのはとっても危険だと思うが。
>>675 が思いつかなかった、回避方法は示したが、
解決したら逆にグダグダ文句を言い続ける。
相手に勝利するためのだけの議論のふっかけ乙。
679 :
デフォルトの名無しさん :2006/03/32(土) 13:49:53
パソコン起動時に壁紙を自動で変更するプログラム作りたいんですが、 壁紙を変更する方法(どのファイルを書き換えればいいか?)と、 起動時にプログラムを自動実行させる方法を教えてください。お願いします。
>>671 わかってるなら、いらないだろ。Advanced Windows。俺のは初版だから古いぞ。
>>679 ファイル名を決め打ちで持っておいて、任意の壁紙ファイルをその名前にコピーするのが簡単。
#IrfanViewやブラウザがやってる方法もこれ。
その決め打ちのファイルを設定するのはレジストリだが、その位はユーザに選ばせてもいいかも。
自動実行は、スタートアップにショートカットを入れてしまうのがいちばん簡単かな。
これも、場合によってはユーザができることだし。
>>679 [HKEY_CURRENT_USER\Control Panel\Desktop]
"Wallpaper"="C:\\WINDOWS\\Walking_Home_by_x_horizon.bmp"
"WallpaperStyle"="0"
この辺。
レジストリで直接変更するとログインし直さないといけなくなるけど。 APIで用意されているのに使わない理由が何かあるの?
>>681 ,682
おお、なるほど。これなら、出来そうです。サンクス!
>>683 APIであったんですか。調べてみます、サンクス。
リバーコントロールの上にスライダを乗せているのですが スライダの背景色が描画されてしまいXPだと綺麗に見えません。 そこでリバーをサブクラス化して、WM_CTLCOLORSTATICで SetBkMode((HDC)wParam, TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH); としてみたのですが、背景色が透明になるどころか なぜか黒くなってしまいました。 原因や解決策をご存知の方はいらっしゃいませんか?
>>684 APIであると言われて調べるのなら
なぜはじめに調べてみないんだろうか…
APIであるなんて考えもしない 俺の場合
ものすごくくだらない機能のAPIがあったような気がしたんだが なんだっけ?
それはようするに、誰が一番くだらないAPIを見つけられるかという ネタ振りだな?
CharNextを馬鹿にするな!
691 :
デフォルトの名無しさん :2006/03/32(土) 21:39:19
ウィンドウが何のフォントを使っているのか調べる方法はあるのでしょうか? MSDNを調べた結果、GetTextFace()だと思ったのですが、自プロセスのEditコントロールから取得すると何のフォントが使われていても"System"という文字列しか返ってこないようなのですが・・・?
WM_GETFONT
>>690 CharNext()は別に下らなくないだろ
じゃあ、FreeLibraryAndExitThreadとか言ってみるテスツ
画像を窓に表示させたいんだけど これって勝手にスクロールバーとか出てこないの?
出てくるわけねーだろ 甘えんなヴォケ
697 :
デフォルトの名無しさん :2006/04/02(日) 08:23:01
>>695 検索用キーワード
CreateWindow WS_VSCROLL WM_VSCROLL
>>695 おれもあってもイイと思うがない。
high level の bmp control とか image control。audio control か sound control か
wave control とか。edit control, rich edit control があるもんな。
画像を扱う third party 保護といえば保護なんかな。
win98 時代にも jpeg, tiff などの filter も持っているのに公開していない。
自前で decode しないといけなかった。
API の説明も分かり難いものがある。使う側がテストしながら使うはめになる。
説明書くのを手抜きしたいなら、ソースを公開すればいいと思うんだが。
SecureZeroMemory
SetWindowsHook(Ex)でロードされたdllのDllMainは実行されますか?
>>701 DllMain内でOutputDebugStringでも使ってデバッグ出力確認すればいいじゃない
コモンコントロールをリソース無しで(CreateWindow系で)作っています。 この自作コントロール、親がダイアログの場合は何も問題が無いのですが、 親が普通のウィンドウの場合、再描画を行ってくれなくて困っています(例えばタスク切り替え時など)。 手直しする方法を御存知のかた、教えて頂けないでしょうか。 一応、親ウィンドウのWM_PAINTにて、(子の)InvalidateRect等を呼んでみたりしましが、駄目でした。
>>703 親ウィンドウにWS_CLIPCHILDRENが付いてないとか言うなよ。
>>704 はい、それは大丈夫です。
具体的にはWS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
でやってます。逆に、これを外しても駄目みたいです。
補足で、自作コントロールの方では、一応極力DefWindowProcを各メッセージで呼んでます。
その自作コントロールは、WM_PAINTでちゃんと描画してるか?
>>706 お付き合いどうもです。
例えば自作エディットコントロールなんですが、これを枠だけWM_NCPAINTで自前描画しています。
他の文字や反転処理、プロンプト描画などは全て、DefWindowProcに任せています。
そして一応成功しています。
問題なのはその自作エディットコントロールを一度ShowWindowで非表示>表示したり、
あるいはアプリをAlt+Tabでタスク切り替えしたときでして、この時コントロールの再描画を一切行ってくれません。
(ただこの場合も、そのコントロールにフォーカスが行くと再描画してくれます。)
WM_NCPAINTでBeginPaint使ってるとか言うなよ。
リストボックスを持ったモードレスダイアログを作りたいです。 BCCFormで作ったんですが、上手くいきません。 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT スタイルがおかしいのでしょうか?
リストビュー(レポートビュー)のカスタムドローで NMCUSTOMDRAWのrcに正しい値が入ってないのは仕様なの? x座標はあってたけど、y座標の値がでたらめだった。 LVM_GETSUBITEMRECTで解決したが、半日ほど悩んだ。
>>708 マニュアル通り、GetWindowDC(GetDCEx)です。
どうもこいつは、ウィンドウベースじゃ無理そうだな…
TerminateProcessで殺される事を、 事前に察知させる方法ありませんか? せめてちゃんとリソースを破棄してから終了したいのです。 この仕様はあまりにも理不尽です。 Terminate呼ぶ代わりにWM_CLOSEみたいな メッセージを投げるとかの対処しかありませんか?
つまりアレか? メッセージ処理したくないけど終了前になんらかの処理を行いたいと?
>>712 それでリソースの破棄に時間掛けたりあまつさえ無限ループしたりするのか?
馬鹿馬鹿しいイタチごっこだな
とりあえずWM_CLOSEでも送ってみれば? つーかものすごいバカっぽいな
UNIXならシグナルハンドラでどうにかなるんだがな。
ほう、どうやってUNIXでSIGKILLを処理するのか詳しく聞こうか?
うむ
シングルラインのエディットコントロールでEnterキーを押したときに鳴る ビープ音を止めるにはどうすればよいでしょうか? WM_KEYDOWNを捕まえても意味がなかったようです。。
例えば
OKボタン、Cancelボタン、テキストボックスの3つしかないダイアログボックスがあります。
そして、テキストボックスに
http://test.jpg などの文字列を入力。
その後OKボタンを押すとダウンロードが始まる仕組みを作りたいのですが、
このダウンロードのプロセスがわかりません。
APIの関数ひとつで出来るような簡単なものを想像しているのですが、実際のところ
どうすれば実現できるのでしょうか
URLDownloadToFile だったっけ?重いファイルだと固まるけど
>>721 さま
おぉ!即レスありがとうございます!
さっそくこの情報を元に頑張ってみたいと思います。ありがとうございました。
723 :
719 :2006/04/02(日) 22:29:27
自己解決しました。 WM_CHARを捕まえてVK_RETURNのときだけ CallWindowProcを呼ばないようにしたら出来ました。
BMP画像をクライアント領域よりも大きいときは縮小 小さいときは、クライアント領域内に表示っていうのがうまくいかない 誰かおしえてくれ。。。
自分でどこまでできてどこが分からないのかを説明できるようになってからもう一度質問に来い。
クライアント領域を指定して そこに指定したデータを開いて クライアント領域に合わせて画像を拡大縮小させるの 全部がわがんね そんなことを説明してるサイトのアドを教えてよ もう、疲れた
すとれっちんぽ
WM_CHARがキーボードからの入力なのか、 それとも何かのAPIがポスト or 送信したものなのか、判別する方法ってありますか?
TranslateMessageがWM_KEYUP/DOWNを変換してWM_CHARを発行するんじゃなかったっけ?
そのようなんですが、 キーボードからの入力があってWM_KEYUP/DOWNが来てWM_CHARが発行されたのか、 何かのAPIがWM_KEYUP/DOWNを送ってきてWM_CHARが発行されたのか、です。 (もしかしたら直接WM_CHARを送ってきている?) wParamとかlParamを見るのかもしれませんが、とりあえずGetKeyStateでしのいでいます。
>>724 クライアント領域の大きさを取得。
ビットマップの大きさを取得。
minマクロあたりで小さいほうを採用
ストレッチブリットを使う。
こんな感じでどうだい?
732 :
デフォルトの名無しさん :2006/04/03(月) 05:09:53
説明は次のレスで。 HBITMAP CreateMask(HWND hWnd,HBITMAP Src,COLORREF trans){//マスク作成。透過色は黒になる。 BITMAP bm; HDC hdc,mdc,sdc,rdc; HBITMAP hbmp,hmono,old,old2,old3; COLORREF oldbk; GetObject(Src,sizeof(BITMAP),&bm); hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); sdc = CreateCompatibleDC(hdc); rdc = CreateCompatibleDC(hdc); hbmp = CreateCompatibleBitmap(hdc,bm.bmWidth,bm.bmHeight); hmono = CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL); ReleaseDC(hWnd,hdc); old = (HBITMAP)SelectObject(sdc,Src); old2 = (HBITMAP)SelectObject(mdc,hmono); oldbk = SetBkColor(sdc,trans); BitBlt(mdc,0,0,bm.bmWidth,bm.bmHeight,NULL,0,0,WHITENESS); BitBlt(mdc,0,0,bm.bmWidth,bm.bmHeight,sdc,0,0,SRCCOPY); old3 = (HBITMAP)SelectObject(rdc,hbmp); BitBlt(rdc,0,0,bm.bmWidth,bm.bmHeight,mdc,0,0,SRCCOPY); SelectObject(sdc,old); SetBkColor(sdc,oldbk); SelectObject(mdc,old2); SelectObject(rdc,old3); DeleteDC(sdc); DeleteDC(mdc); DeleteDC(rdc); DeleteObject(hmono); return hbmp; }
733 :
732 :2006/04/03(月) 05:18:04
現在非常に困っています。お知恵を拝借したい。
>>732 はとあるビットマップの透過用マスク画像を生成するための関数です。
引数はGetDCするためのウインドウハンドルとマスクのソースとなるHBITMAPそして透過色を指定する数値です。
で、現状の問題はこの関数を使ってできた画像をそのままウインドウにBitBltしてみても期待のようにはならず白になってしまいす。
白になるのは途中でWHITENESSをBltしているからなんですが、その先の処理がうまく意図どおりに動かないようです。
どこか見落としなどの指摘があればぜひお聞かせください。
誰もいない。 鳥のさえずり聞くなら今のうち。 ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。 ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。 ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。ピーちゅんちゅん。 Orz
735 :
732 :2006/04/03(月) 06:24:26
寝ます。 それと質問は一端取り下げます。 また別の機会にでも質問させてもらおうと思います。 それじゃお休みです。
>732 マジレスしてやる そんな糞コードをこねくり回すよりCreateDIBSectionで作ったDIBに 自分でマスク用データ書き込んだ方が比較にならんほどマシ 全部書き直せ
物理メモリの使用容量を取得するにはどうすればよいでしょうか? GlobalMemoryStatusで取った総容量から空き容量を引いた値は システムキャッシュで使われている分も含んでしまうので、 それを含まない値を取得したいのです。
>>734 [゚д゚] デフラグカンリョウ
/[_]b
| |
Orz。。。。。。。。。。。。。。。。。。。。いいうえくさずちちちちちちちちちちちちちちちちちちちちちちちちち
ちちちちちちちちちちちちななののもゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅゅ
ゅゅゅゅらりんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんピピピピピ
ピピピピピピピピピピピピピーーーーーーーーーーーーーーーーーー今聞誰鳥
画面のプロパティの設定タブで確認できる、各モニタ毎の番号は EnumDisplayDevicesの第2引数で指定したもの+1なのでしょうか? そうでないならばモニタ番号とディスプレイデバイスの対応を取る方法は無いでしょうか?
createprocessでDOSプログラム(○.exe)に ”ファイルパス | -n > FILE” 見たいな感じのコマンドラインを実行させたいのですが どういう風にもっていけばいいのでしょうか ためしにノートパッドの起動だけやってみたのですが ノートパッドだと、これに文字列がはじめに入力されるような感じで STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = /*SW_HIDE*/SW_SHOWNORMAL; PROCESS_INFORMATION pi; CreateProcess(NULL, "notepad ", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
> UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount ); > BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString ); GetDlgItemText に必要なのがLPTSTR型で SetDlgItemText に必要なのはLPCTSTR型ですが GetDlgItemText で取得したものを SetDlgItemText で表示する際 データの変換はどうするのでしょうか? (LPCTSTR)LPTSTR とか (LPTSTR)LPCTSTR 、あとstrcpy関数も試してみましたが うまくいきませんでした
>>740 何がやりたいのかさっぱり言ってることの意味わからん。
> コマンドラインを実行させたい
ここだけに反応すると
cmd.exe /c コマンドライン
を実行すればいい。
>>741 > うまくいきませんでした
では原因わからんわ。
質問するときは何が起こったのか書いてくれ。
猫でもわかるWindowsプログラミングを片手に簡単なスクリーンセーバーを作ろうとしているのですが ほぼ本の通りにやっているのですが、画像が表示されません 何度も本と見比べたのですが、どこが間違っているのかわかりませんでした #define ID_TIMER 101 LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc, hdcMem; static RECT rc; HBITMAP hBmp; BITMAP bmpInfo; switch(msg){ case WM_CREATE: SetTimer(hWnd, ID_TIMER, 500, NULL); GetClientRect(hWnd, &rc); break; case WM_TIMER: if(wParam != ID_TIMER) break; hdc = GetDC(hWnd); hBmp = LoadBitmap(hMainInstance, "MY_BITMAP"); // ビットマップリソース GetObject(hBmp, (int)sizeof(BITMAP), &bmpInfo); hdcMem = CreateCompatibleDC(hdc); SelectObject(hdcMem, hBmp); BitBlt(hdc, 50, 50, bmpInfo.bmWidth, bmpInfo.bmHeight, hdcMem, 0, 0, SRCCOPY); DeleteObject(hBmp); DeleteDC(hdcMem); ReleaseDC(hWnd, hdc); break; どこが悪いのか教えて頂けないでしょうか
うわ、スペースおかしくなってしまってすいません・・・
CreateProcess(NULL, "netsh interface ipv6 install", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); これで出来ないか?と一週間前に知った関数で知ったかンス 流してほしい海の果てまで
>>736 おはようございます。
書き直しですか。なるべく泥臭いことはしたくなかったんですが。
少々残念ですが、そのように検討してみます。
>>741 LPTSTRはTCHAR*のtypedef。
LPCTSTRはconst TCHAR*のtypedef。
だからLPTSTR型のオブジェクト(変数)はLPCTSTR型へ暗黙の内に変換できる。
>>745 自分へのレスでいいのかな?
どうもです。
ただ、プログラム始めたばかりなので
いまいちどういう関数か分からくて試すのに時間がかかりそうです。
あ、上は
>>743 です。ここってID出ないんですね
実はリソースが無いというオチではないか
751 :
743 :2006/04/03(月) 21:19:56
ありがちなオチだな。
教えてくださいお願いします。 ウィンドウを作ろうとしてるのですが 一番最後のNULLの部分で警告がでるのですが (warning C4133: '関数' : 'char [10]' と 'LPCWSTR' の間で型に互換性がありません) どこをどうすれば良いのかがわからないです。 hWnd = CreateWindow(szClassName, //タイトルバーにこの名前が表示 L"俺じゃわからんWindowプログラミング", WS_OVERLAPPEDWINDOW,//ウィンドウの種類 CW_USEDEFAULT,//x座標 CW_USEDEFAULT,//y CW_USEDEFAULT,//幅 CW_USEDEFAULT,//高さ NULL,//親ウィンドウのハンドル、親ならNULL NULL,//メニューハンドル、クラスメニューを使うときはNULL hInst,//インスタンスハンドル NULL);
L"俺じゃわからんWindowプログラミング", _T("俺じゃわからんWindowプログラミング") Warningは行単位で出るので一番最後のNULLの部分で出ているわけではない。
'char [10]'って言ってるんだから、警告が出ているのはszClassNameの方だと思われ。 szClassNameの宣言をCHAR(char)ではなく、WCHAR(wchar_t)もしくはTCHARにするべし。
756 :
753 :2006/04/04(火) 10:38:40
>>754 さん
ありがとうございます
一応TEXT("俺にはわからないwindowsプログラミング")でコンパイルしたのですが
やはり警告がでて、でもビルドは出来ました
ただコンパイル時の警告
(warning C4133: '関数' : 'char [10]' と 'LPCWSTR' の間で型に互換性がありません)
は、なぜ出るのかまだ、自分自身理解不足で、コンパイル時点では出てしまう警告
はビルドが正常に行われたらあまり気にしなくて良いのでしょうか
初心者の質問で申し訳ありません
757 :
753 :2006/04/04(火) 10:45:35
>>755 さん
ありがとうございます
szClassNameをWCHAR
にしたらコンパイルエラーがなくなりました
ちなみに、文字列を書くときはTEXT()で囲んで書く習慣
つけた方が良いのでしょうか
初心者すぎてすみません
>>757 文字列はTEXT()で。
変数もTCHAR,PTSTR等を使ったほうがいい。たぶん。
GetProcAddressにはASCII版しかないし、GDI+なんかはほとんどUnicodeしか食わない。 つーことで結局臨機応変に対応するしかないわけだが。
>>757 LPTSTR、LPCTSTR は TCHAR[] で TEXT("hoge")とか_T("hoge")、
LPWSTR、LPCWSTR は WCHAR[] で L"hoge" 、
LPSTR、LPCSTR は CHAR[] で "hoge"、
LPOLESTR、LPCOLESTR は OLECHAR[] で OLESTR("hoge")、
BSTR はちょっと変なの、
と昔から決まってる。
指定のプロセスを強制終了させたいんだけどそういうAPIありますか? Internet ExplorerだとIEXPLORE.EXEのプロセスを殺すとか
TerminateProcess ただし、強制終了だから不具合起きても知らん。
>>763 そんな用途ならWin+D or Win+Mで十分じゃ?
なにこのWindows組み込みボスが来たコマンド Windows数年間使ってきたけど今まで知らなかった せっかくだからTerminateProcessの方も作ってみて そのあとでキー状態変更APIでも探してそっちのも作ってみる ありがと
>>740 ちゃんとやるなら
CreateProcess()で取ってきたpiの中にあるハンドルをゴニョゴニョして
ReadFile()するのが定石
てゆうかかなり昔にやったことなので詳しいことは忘れた後は自分で調べてくれ
(猫のパイプがどうのこうのって所にサンプルがあったような気がする)
ちなみに、結果をnotepadに出す方法はシラン
>>743 scrnsave.libをちゃんと入れたか?
>>764 ただのデスクトップだけだと怪しいからこっちの方がいいんジャマイカ?
・適当なテキストファイルを作成
・そのファイルのショートカットを作る
・ショートカットを右クリックしてプロパティを選択
・ショートカットキーという項目に適当なキーを登録、実行時の大きさは最大にしておく
結構無駄な努力だけどね<ボスがきた
769 :
743 :2006/04/04(火) 18:22:52
>>767 入れました
コンパイル後に、本に書いてあった通りに.exeの部分を.scrに変更すると起動するんですが
画像は表示されないんです
指定された区域にスクロールバーつけたいんですが、 ウィンドウって分割できますか?
位置の指定はいくらでも出来るので、好きなように分割しろ。 問題は指定された区域ではなく、指定した区域になるということだ。
772 :
770 :2006/04/04(火) 21:01:31
>>771 ありがとうございます。
小出しすみません。
分割の方法を教えてください。
見えない子ウィンドウにバーをつけようかと試みたのですが、
バーも消えてしまって上手くいきませんでした。
お願いします。
773 :
デフォルトの名無しさん :2006/04/04(火) 21:12:30
>>769 exeと同じ起動方法で起動しない、
とか言うオチじゃないだろうな?
774 :
770 :2006/04/04(火) 21:36:04
分かりにくいですね。すみません。 CreateWindow()でSCROLLBARクラスを指定したら、座標は指定できますが 旧式のスクロールバーになってしまうので xp仕様(?)のスクロールバーにできませんか? って事です。
775 :
デフォルトの名無しさん :2006/04/04(火) 22:41:23
RSTパケを送出したいのですが、socketの生成から、 順にどんな関数を使えばいいですか? とりあえず関数名だけ羅列してくれれば助かります。
世も末だな
connect() して send() して close() じゃないかな、うん
778 :
743 :2006/04/05(水) 00:23:09
>>773 起動はして、マウスを動かすと終了する感じでスクリーンセーバーの動きはするんですが
用意した画像は表示してくれません
プルダウンメニューをプログラムで閉じたいのですが、いい方法はないでしょうか。 あるボタンからプルダウンメニューが表示されているウインドウに ウインドウメッセージを投げると、プルダウンメニュー閉じ、そのウインドウメッセージを処理するようなイメージです。 エクスプローラの表示(一覧/詳細/アイコン/...)ボタンに近いです。 で、以下のように書いてみたのですが、プルダウンメニューは閉じるものの、ボタンは凹んだままで完全ではありません。 HWND hWndMenu = ::FindWindow(_T("#32768"), NULL); if ( ::IsWindow(hWndMenu) ) ::DestroyWindow(hWndMenu); あと、プルダウンメニューを表示するボタンはたくさんあり、特定のメニューを閉じるという実現方法は避けたいです。 よい方法があればご教授をお願いします。m(_ _ )m
>>743 多分rcファイルのリソース名がIDになっているんだな
LoadBitmap()の所の"MY_BITMAP"をMAKEINTRESOURCE(MY_BITMAP)に変えると解決するかも
>>779 keybd_eventでは駄目なのかのぅ?
782 :
775 :2006/04/05(水) 03:03:51
>>777 レスありがとうございます。
が、そういうことでなくて、自前でRSTパケだけを送出したいのです。
(1) socket()
(2) setsockopt()
(3) sendto()
だけで送れそうなので試してみるけどダメっぽいんです。
なので、根本的に使う関数とかが間違えてるかなぁと思いまして。。
生ソケットとか
ヒント:スレ違い
ヒント房、うざい。
基礎知識が欠乏
787 :
デフォルトの名無しさん :2006/04/05(水) 09:24:04
>>778 > 起動はして、マウスを動かすと終了する
回線切って(ry
789 :
デフォルトの名無しさん :2006/04/05(水) 10:41:31
すみません。 1つ質問させてください。 ディレクトリの削除で SHFileOperation を使いたいのですが。 相対パスが使えません。 EX:"..\..\DATA"こんな感じで。 これは、使えないのでしょうか? もし出来ないとしたとき、APIで相対パスをフルパスに変換するAPIは、あるのでしょうか? もしわかりましたら教えてください。
790 :
デフォルトの名無しさん :2006/04/05(水) 10:44:49
もしかして - \ + \\ とかって問題?
>>789 "..\\..\\DATA"じゃないのか?と適当な事を言ってみる
792 :
デフォルトの名無しさん :2006/04/05(水) 10:56:20
>>792 API でいいなら
GetCurrentDirectory して PathAppend して PathCanonicalize かな。
794 :
デフォルトの名無しさん :2006/04/05(水) 11:20:19
ヒント:MSDN
795 :
デフォルトの名無しさん :2006/04/05(水) 11:20:54
>>793 ありがとうございます。
やってみます。
GetFullPathNameを忘れるな。
それ以前に、カレントディレクトリからの相対パスを 扱うってのは危険じゃないか? カレントディレクトリ=実行ファイルのあるディレクトリとか 思ってないか?
798 :
デフォルトの名無しさん :2006/04/05(水) 11:55:41
皆さん色々ありがとうございます。 vbつかってるのでカレントディレクトリは、app.pathでとります。
800 :
デフォルトの名無しさん :2006/04/05(水) 12:28:33
>>799 EXEを実行したときの始めに
app.pathでとればカレントになると思うが違ってますか?
すんませんAPIの名前を教えてください。 「ファイルを開く」で使われるコモンダイアログはOpenFileName()ですが、 似たような感じで「フォルダ」のパスを取得するAPIはなんと言うやつでしょうか?
802 :
デフォルトの名無しさん :2006/04/05(水) 12:36:56
>>801 SHBrowseForFolder()の事か?
この腐女子め!
app.pathは実行ファイルのパス ショートカットの作業フォルダ等で、 起動時のカレントが変更されたりする可能性はあるだろ。
804 :
デフォルトの名無しさん :2006/04/05(水) 12:57:01
>>803 そういうことか
ご指摘どうもありがとう。
EXEのパスがほしかっただけなので。
皆さんいろいろありがとうございました。
>>802 表示デキター、サンクソ
しかし寒いギャグは頂けないな
音をミュートにするAPI又は方法はありませんか? 検索しても出てこなかったので
ありがと、その辺探してみる
809 :
デフォルトの名無しさん :2006/04/05(水) 22:33:32
質問があります。 Win32API@VC++2005でMP3プレイヤーを作ろうとしています。 でも、どうにも再生できないので、知恵を拝借願いたく。 mciSendStringを利用し、以下のようなプログラムを書きました。 if(!mciSendString("open \"test.mp3\" type mpegvideo alias MP3", NULL, 0, NULL)){ // ファイルを開く mciSendString("play MP3 notify", NULL, 0, hWnd); // MP3の再生 } とりあえずDebugでビルドしてるので、プロジェクトのDebugフォルダに test.mp3を置いてビルドしてるんですが、 ifの中にブレイクポイント仕掛けてもそこに到達すらしてないようです。 なんとかMP3を再生する方法を教えてください。お願いします。
>>809 まずはtest.mp3をフルパスで指定してみたら?
>>809 環境が分らんからアレだがVCはデバッグ時のカレントディレクトリがDebugフォルダではない。
>>809 せっかくだからIGraphBuilder使おうよ
>>809 の人気に嫉妬
ちなみにtype mpegvideoがなくても拡張子で判断してくれたりする。
RenderFileが簡単でマジオススメ
816 :
743 :2006/04/06(木) 19:12:15
>>780 遅くなりましたが、レスありがとうございました
おかげで解決できました
エクスプローラバー(グーグルツールバーみたいなやつ)自作して ひととおり動作しました。 で、IEではなく、エクスプローラで動かしたところIWebBrowser.Documentは IHTMLDocument2をもたないようです。 このときはどのようなインターフェースをもつオブジェクトが入ってきますか? または調べる方法、ドキュメントはないですか?
818 :
779 :2006/04/07(金) 00:50:15
>781さん >788さん 試してみたところ、どちらの方法でも大丈夫そうです。 WM_CANCELMODEを使うのが本来の方法みたいですね。 どうもありがとうございました。m(_ _ )m
IShellViewとかじゃね
821 :
デフォルトの名無しさん :2006/04/07(金) 14:57:15
ツールチップをエディットボックスやチェックボックスに設定するにはどうしたら良いでしょうか!? ラベル上ならちゃんと表示されるのですが…
822 :
デフォルトの名無しさん :2006/04/07(金) 17:22:13
アプリケーションの関連付けについて教えて下さい ○<\_ 特定拡張子のファイルにあらかじめアプリケーションを関連付けておいて、 ファイルをダブルクリックする事でアプリケーションを起動する場合、 呼び出されるアプリケーション側ではファイル名をどのように取得すれば 良いのでしょうか?
>>822 コマンドライン引数
(w)WinMainの3番目の引数や(w)mainならargc。
WinAPIの関数を使いたければGetCommandLine。
その際にはPathGetArgsが使えるかもしれない。
他のウインドウのイメージを取得したいのですが、手前で作成したDCを添えて、 WM_PAINTメッセージをターゲットのアプリケーションウインドウに送っているのですが、 全く何も取得できません。 PowerToysのAlt+Tab Replace等では、ウインドウの画像を取得して表示していますが、 どうするとこのように取得できるのでしょうか。 どうぞ宜しくお願いします。
boot.iniの/3GBとVC.netの/LARGEADDRESSAWAREオプションを使っても 7c800000にkernel.dllが配置されるんだけど、 /LARGEADDRESSAWAREは2GB以上のメモリ空間を使えるというだけで 連続したのは無理ってことですか?
826 :
822 :2006/04/07(金) 18:00:37
>823 取得できました、マリガトウゴザイマス
>>824 GDIオブジェクトはプロセス跨げなかったと思う。
あとWM_PAINTはシステムが送るメッセージなので、ユーザーが勝手に送ってはダメ。
フックで目的のプロセスに忍び込んで、WM_PRINT(WM_PAINTじゃないよ)送ればいいんじゃない?
>>825 一応訊くけどWindowsのバージョンは?
830 :
825 :2006/04/07(金) 20:56:59
http://support.microsoft.com/default.aspx?scid=kb;ja;328882 重要 : /3GB スイッチは、次のオペレーティング システムでのみ使用してください。
.Microsoft Windows Server 2003 Datacenter Edition
.Microsoft Windows Server 2003 Enterprise Edition
.Microsoft Windows 2000 Advanced Server
.Microsoft Windows 2000 Datacenter Server
.Microsoft Windows NT 4.0 Enterprise Server
XP Homeで/3GBが効かないのは変わらないけど。
IEでTABキーを押してコントロール(ボタン)に標準をあわせ、Enterを押してボタンを押すということ
(例えば、
http://www.google.co.jpを開いていたとすれば 、TABキーを押して「Google 検索」に
フォーカスを当て、Enterを押して検索といったこと)をアプリケーション側から自動で行いたくて、
HWND ie = FindWindow("IEFrame", 0);
SendMessage(ie, WM_KEYDOWN, VK_TAB, 0);
SendMessage(ie, WM_KEYDOWN, VK_RETURN, 0);
というようなコードを書いたのですが、うまく動作しませんでした。
何か良い方法はありませんでしょうか?
>>835 SendMessageではなく、PostMessageを使う。
>>837 さんの方法で出来ました
ありがとうございました!
839 :
デフォルトの名無しさん :2006/04/08(土) 07:16:28
一般に、リストビューコントロールのカラムの数ってどうやると得られるんでしょうか? アイテムの数はLVM_GETITEMCOUNTで得られるわけですが・・・
>>839 Header_GetItemCount(ListView_GetHeader(hList));
はどうだろうか。
841 :
デフォルトの名無しさん :2006/04/08(土) 11:10:14
WIN32アプリケーションで、IEなどブラウザの表示をさせたいのですが、 WIN32APIでそれを実現する手段ありますでしょうか? 出来ればクッキーを渡したり、ポストをしたいのですが。
簡単に荒らしツールが作れてしまうね
843 :
デフォルトの名無しさん :2006/04/08(土) 11:41:11
競馬の投票プログラムを作りたいなと思っておりまして・・・。 最後のパスワードの入力などはブラウザに任せたいと思っているのですが・・・。
>>841 CreateProcess辺りじゃないかと
質問です。 SelectObjectが失敗する状況ってどんな感じですか? LoadImageでよみこんだやつで、GetObjectでの情報取得は成功していて読み込み失敗ではないとおもいます。 SelectするHDCもGetDCでウインドウのDCを取得後CreateCompatibleDCしています。 なにか、心当たりありませんか?
>An application cannot select a bitmap into more than one DC at a time.
>>846 レスThx。
一度に2つ以上のBitmapをセレクトできないよー。
って感じですか??(エキサイト翻訳使ったんですけどね・・・。
関連付けにSelectObject使わない方法は無いし。
Sleepいれろとかそういう意味ではないと思うんだけど・・・。
あ!それとも、2つのDCにひとつのBitmapをSelectできないよー。ってことですかね。
そういえば後者には心当たりが。。。
ちょっといじってみます。
848 :
847 :2006/04/08(土) 14:06:03
えーっと。できました。 うーん。こんな仕様だとは思わなかった。 それはそれとして、助かりました。Thx!!
エクスプローラのツールバーの更新とかのボタンを押したときって どんなメッセージがいってるんでしょうか? spy++でツールバーみてもそれらしいのが見当たらないんですが
そらツールバーみたって分からんわな
あは、ウインドウをターゲットにしてツールバー関係を見てたということです。 それでも間違ってるかもしれないけど
とりあえずマウスのメッセージ
指定プロセスのタブ(ボタン?)をプロセス自体は終了せずにタスクバーから消すAPIありますか? ウィンドウ最小化とのコンボでちょっと上手くやってみたい
なにやりたいのかわからないけど、 ShowWindow(SW_HIDE)でいいんじゃない?
ありがとう ウィンドウハンドルはリストで保持しておいて後で戻せば大丈夫そうだね
ごめんもう一つ質問 プロセスIDや実行ファイル名が分かっていて、そこからウィンドウハンドルを出すにはどうすればいい? EnumWindows()とかEnumThreadWindows()、GetWindowThreadProcessId()辺りを探してみたけどそれぞれ使う引数がバラバラでわけわかめ ウィンドウハンドル取得にはスレッドIDが必要だし(EnumThreadWindows())、 スレッドID取得するにはウィンドウハンドルが必要(GetWindowThreadProcessId())
現在実行中のプロセスの数を取得するにはどうすればいいでしょう?
//プロセス一覧取得 if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))==INVALID_HANDLE_VALUE) return; //プロセス情報格納構造体初期化 PROCESSENTRY32 pe; pe.dwSize = sizeof(pe); //プロセスリストの最初のポインタを取得し、ループごとに次のアイテムに移動 for(BOOL bResult = Process32First(hSnap, &pe); bResult; bResult = Process32Next(hSnap, &pe)) count++; CloseHandle(hSnap); 一応検索してみたけど無かったから自分の使ってる走査を弄ってみた ちゃんとできるかどうかは分からない
>>859 小一時間ほどお聞きした後の質問だから許して
864 :
デフォルトの名無しさん :2006/04/09(日) 17:22:20
猫でも〜を見つつ、ウィンドウにBMPを表示させようとしているのですが、 200*200の24ビットカラーBMP(ペイントで作成)を表示することができません。 SetDIBitsToDeviceを使ってやってみようとしているのですが、 表示させようとしているエリアが真っ黒になります。 真っ黒になるということはどういうミスが考えられるでしょうか? アドバイスお願いします。
とりあえずまともに動くサンプルを見つけてそれを参考にする。 動かないサンプルを参考にしてもしょうがないだろ
>>856 EnumWindowsで全てのウィンドウハンドルを列挙することができる。
それぞれをGetWindowThreadProcessIdに渡して得られたIDと
自分が知っているIDとが一致するウィンドウだけを記録しておけば、いいのでは?
もっと単純な方法を俺は知らない。
スタートボタンを押したときに出てくるスタートメニューのウインドウハンドルって 取り方ありますか? ウインドウタイトルは無いようなんですが。
>>856 ウィンドウハンドルを取得するのにスレッドIDが必要なわけでも、
スレッドIDを取得するのにウィンドウハンドルが必要なわけでもない。
ウィンドウハンドルもスレッドIDも取得する方法は沢山ある。
単にそれらが、ウィンドウハンドルからスレッドIDを取得するAPIと、
スレッドIDからウィンドウハンドルを取得するAPIなだけ。
だが決して具体的な名は挙げない。
>>864 1.COLORONCOLOR などのモードの設定がない
2.bmp_info が正しくない
3.bitmap データが真っ黒
StretchDIBits() などでも描けるが、心配なら前もって hdc を FillRect() で
背景色、例えば白で塗りつぶしておく。
左上座標、画面の縦横、絵の縦横は間違ってないという前提。
猫のどの章を見ているか言えばもっと話が早いかも。粂井さんの palette の設定
のとこは間違ってたと思うが、直っているかな。今回 BPP24で関係ないが。
>>865 説明が足らなくてすみませぬ。
>>866 その通りだねってことで別のサンプルで試してみたら出来ました。
ありがとん。
>>871 170章見てて出来ず、172章でやってみたら出来ました。
(ただし、24ビットカラーなら出来るけれども、他のだとパレット設定が失敗してしまいますね。
まだ直ってないのかもしれませんね。)
ちゃんと原因を理解していないので、挙げてくれたのを検証してみます。
御三方、レスありがとうでした。
DLLの関数をLoadLibraryで呼び出そうとしているのですが、 実行時に上手く動作せず、困っています。 どんな状態かというとビルド自体は特に問題なく出来ているのですが、 関数をポインタ経由で呼び出した後に戻ってくる値がおかしいといった感じです。 関係のありそうな部分を適当に抜き出してみるとこんな感じに書いてあります。 if((hInstDLL=LoadLibrary("Advapi32.dll"))==NULL) MessageBox(NULL, "「Advapi32.dll」のロードに失敗しました。", "エラー", MB_OK); typedef LONG (APIENTRY *TFUNC)(HKEY,LPCSTR,DWORD,REGSAM,PHKEY); TFUNC DllFunction; DllFunction=(TFUNC)GetProcAddress(hInstDLL,"RegOpenKeyExA"); if(DllFunction==NULL) MessageBox(NULL, "関数のアドレスの取得に失敗しました。", "エラー", MB_OK); int ref = DllFunction(hKey,pSubKey,ulOptions,samDesired,phkResult); 実際のソースでは RegCloseKey, FreeLibrary とかはちゃんとしています。 実行したときは戻り値は「ERROR_SUCCESS」、 だけれども「phkResult」の値はNULLではないものの不正な値になっています。 MessageBoxのエラーは特に表示されていません。 どこに問題があるのか、わかる方がいたらお教えいただけませんでしょうか? よろしくお願いします、長文失礼しました。
874 :
873 :2006/04/09(日) 20:35:59
補足です、なぜこんな紛らわしい事をしていることかというと 既存のアプリケーション(バイナリの)動作を替えたかったからです。
カレントディレクトリを確認したか? パスは確認したか?
876 :
873 :2006/04/09(日) 22:13:08
>>875 一応ダイアログを表示してみたりとか、そのほかでテストをしてみたので
ロードするDLLに間違いは無いんじゃないかと思います。
>「phkResult」の値はNULLではないものの不正な値になっています。 不正な値とは? どうやって判断したの?
878 :
873 :2006/04/10(月) 00:30:58
>>877 sprintf(test, "%X,%s,%X,%X,%X",hKey,pSubKey,ulOptions,samDesired,*phkResult);
と言うような表示をしてみた時に実行する前には
「80000001,Software\test\test,0,F003F,CCCCCCCC」
実行した後には「0xD8」となっていたからです。
「80000001,Software\test\test,0,F003F,D8」
ハンドルでこの値はおかしいのでないかなと思ったからです。
880 :
873 :2006/04/10(月) 00:59:50
>>879 0x400000(実行モジュール領域?)以上なら普通に使っていて
あり得る値だと勝手に思っていたのですが…
思い込みでプログラム作るんじゃねえ
882 :
856 :2006/04/10(月) 01:09:26
>>867 exe名をテキストから読み込み→プロセス一覧から一致するexeを検索、プロセスIDを取得
としてるのでそれだとプロセス一覧を2回まわすことになるから速度面で少し不安
情報後出しスマソ
>>869 くぁしく
いや一応Google先生にお聞きしてくるけど
883 :
873 :2006/04/10(月) 01:10:47
>>881 申し訳ないです。
思いつく限りは試してみましたが、何が原因で実行出来ないのでしょうか?
そろそろ寝ないと仕事がつらいので今日は落ちます。
明日、必ず返信します。
>>883 実行出来ないって何が?
DllFunctionはERROR_SUCCESSを返しているんだろ?
ERROR_SUCCESSを返している以上ハンドル値は格納されている。
で、実際にCCCCCCCCからD8になったと
>>878 で言ってるじゃないか。
885 :
873 :2006/04/10(月) 01:19:57
>>884 エラーで強制終了されてしまいます。
エラー内容は"0x00551522"の命令が"0x000000D8"のメモリを参照しました。メモリが"read"になることはできませんでした。
と言った感じです。
886 :
873 :2006/04/10(月) 01:21:51
言葉不足でした。 返ってきたハンドルの「0x000000D8」を使おうとすると エラーが起きると言ったところです。
>>886 エラーが起こってるところのコードも晒した方がいいんじゃねえかな?
ハンドルとポインタを混同している悪寒。
RegOpenKeyEx() の最後の引数に渡しているポインタがあやしい phkResultってどこを指してるんだろうね?
ハンドルをポインタとして読み書きしているね絶対
お手上げ。 我が家でも、 80000001,Software\test\test,0,F003F,0 //←できれば初期化する癖 80000001,Software\test\test,0,F003F,7B4 DLLの動的ロードを使わずに、普通にRegOpenKeyExを呼び出したら、 80000001,Software\test\test,0,F003F,7B0 この7B4や7B0のハンドル使って、RegSaveKeyしてみたら、 空のファイルしか出力されなかった。
PHKEY phkResult; とだけして、phkResultが指す先を用意していない悪寒。
>>892 それだとRegOpenKeyEx呼び出した時点でアウツじゃね?
HKEY hkResult = NULL; として &hkResult を渡してみ
つーか問題の本質は RegOpenKeyEx 側じゃなくて、その後のハンドル利用コードの予感
自分自身の実行ファイル名を取得するにはどうしたらいいんでしょうか。 実行ファイル名をハードコーディングできないプログラムなのです。 main()から始まるコンソールアプリなら、argv[0]からファイル名を取得できるのですが。 WinMain()から始まるプログラムの場合にどうしたらいいか分かりません。
ただし、コマンドライン引数が含まれる。
899 :
896 :2006/04/10(月) 15:44:05
>>896 の補足です。
ウインドウを持たないプログラムですので、
GetWindowModuleFileNameは使えないんです。
画面を一切出さないプログラムを作ろうとして、コンソールアプリを作ったら、
実行時にコンソール画面が出てしまったので、Win32 Applicationでウインドウなしの
プログラムとして作り直しました。
GetModuleFileName()
>>897 ありがとうございます!
WinMainの引数にはプログラム名が入ってなかったので
無理かと思ってました。
>>900 ありがとうございます。
こっちの方がちょっと簡単ですね。
903 :
873 :2006/04/10(月) 22:18:22
>>887 結構長くなってしまうと思いますが良いでしょうか?
やっていることとしてはAPIのフックです。
>>888-895 確かにハンドルとポインタをごっちゃにして考えていました。
とりあえず一番の問題としてはエラーで強制終了されてしまうことです。
元々は正常に動作していたソースを書き換えていたので、
レジストリ関係の関数の取り扱いに特に問題は無いのではないかと思います。
現状だと「RegOpenKeyExA」の呼び出し以外には特に手を加えていません。
HKEY hkResult = NULL;
として「&hkResult」を渡してみましたが、やはり結果は強制終了でした。
>>869 FindWindow()以外の関数きぼん
FireFoxだとGoogle - Mozilla Firefoxになるからウィンドウタイトルじゃ指定できないだす
905 :
デフォルトの名無しさん :2006/04/11(火) 08:57:29
>>904 ウィンドウ・クラス名でも検索できるだろ
>>905 ありがと、分かってきた。
クラス名の取得にはGetClassName()でウィンドウハンドルが必要
これは開始前にクラス名を取得して書き出しておくしかないのかな
907 :
デフォルトの名無しさん :2006/04/11(火) 16:50:32
画面上の特定の範囲のスクリーンショットを撮るにはどうしたらいいですか?
>>908 それだと範囲内に複数のウィンドウが入っているときとか面倒じゃない?
ウチのwinuser.hのGetDCには引数1つしかないんだが・・・
質問です。 マウスジェスチャー的なものを作っているのですが、マウスフックした状態で 1)Explorerのウインドウ内で右ボタンを押す 2)マウスカーソルを移動してExplorerの範囲外に移動 3)右ボタンを離す という操作をしたとき(ファイルを選択しない右ドラッグみたいな感じの操作)に、 3)のところでWM_RBUTTONUPが通知されません。 Spy++ではWM_RBUTTONUPが見えているので、どうにかすれば拾えるのはわかるのですが… WM_RBUTTONUPでなくてもいいので、右マウスを離したことを検出する 方法を教えてください。
>>914 できました!ありがとうございます。
猫は一通りやったんですが、このAPIは頭に入ってませんでした。
ファイルハンドルを指定してリネームする関数ないですか? changefilename(hFile, "c:\\foo.txt"); みたいなかんじで
>>916 ハンドルがあると言うことは、ファイルを開いている事になる。
開いているファイルをリネーム出来るとでも?
C標準でそういう関数あったな
>>917 できないんですか? 随分仕様もないOSですね。
922 :
デフォルトの名無しさん :2006/04/12(水) 13:19:56
imm32.dllの使い方に関して説明がある 日本語又は英語のサイトであって、 マイクロソフトMSDN以外のものをご存知でしたら、 どうか、どうか、教えてください。 (VC#ExpressPreview)
>>917 開いててもリネームできるよ
(少なくともNT系はできる)
924 :
デフォルトの名無しさん :2006/04/12(水) 13:23:48
.netを利用してワードを操作するアプリを作っております。 ワードの画面で、例えばCtrl+Rを押したときに、 ワードを操作するアプリ(wordobjectlibrary9.0)にその旨(Ctrl+Rが押下された)を 伝えることはできますでしょうか。
925 :
924 :2006/04/12(水) 13:26:34
付記 WndProcで、メッセージを監視するという方法もありますが、 これだと、ワード画面が非アクティブなときに 押下されたCtrl+Rも前述したアプリに拾われてしまうので、 この方法は避けたいと思っております。 もっとも、ワード画面が非アクティブになったという事実を 前述したアプリに送ることができれば、もう少し選択の幅が 広がるかも知れませんが。
keybd_event?
>>924 グロ−バルフックとかじゃだめ?
出来るかどうかさっぱりわからないけど、Wordのアドインとして
自プログラムを登録しておいて、キー押下とかコマンドとか
拾えないかな?
928 :
924 :2006/04/12(水) 15:30:08
>>927 ごめんなさい、さっきの文、間違えました。正しくは、
付記
「GlobalHotkey」で、メッセージを監視するという方法もありますが、
これだと、ワード画面が非アクティブなときに
押下されたCtrl+Rも前述したアプリに拾われてしまうので、
この方法は避けたいと思っております。
もっとも、ワード画面が非アクティブになったという事実を
前述したアプリに送ることができれば、もう少し選択の幅が
広がるかも知れませんが。
グローばるほっときーは、
半ば無差別にキーボードを監視するので、
ワード文書を操作しながら、平行して
オートキャドを操作する場合、不具合が生じてしまいまうのです。
929 :
924 :2006/04/12(水) 15:32:20
以前、WndProcを試してみたこともありましたが、 えっと確かじゃないですけど、 そのときは、 メッセージをワードに食われてしまう結果、 メッせーじを監視できなかったような気がします。 immGetContextのメッセージを監視しようとしても、 WndProcで監視してもメッせージが出てこなかったような・・ ところで、グローバルホットキーと、グローバルフックって 同じことをさすのですか?
930 :
924 :2006/04/12(水) 15:35:21
>出来るかどうかさっぱりわからないけど、Wordのアドインとして >自プログラムを登録しておいて、キー押下とかコマンドとか >拾えないかな? それ、すごくいい!!(・∀・) どうやるの・・・??
931 :
924 :2006/04/12(水) 15:37:01
ちなみに、現行ソフトは、 HonliangSoft.Utilities を使用しております。
そんなローカルな名前出されても困る。ついでに間違ってる。あとあれはホットキーじゃなくてグローバルフック。 GetForegroundWindow とか使えない? どうやって Word をホストしてるんか知らないけど。
933 :
924 :2006/04/12(水) 15:46:55
word文書においてCtrl+Rを押す。 すると、マクロAが起動する。 マクロAは、現在実行中のプログラム一覧を取得する。 当該プログラム一覧の中に、「myAppli.exe」というものがあるか 確認する。 もし「myappli」が2以上見つかったら、もしくは見つからなかったらreturn; さもなくば、「myappli」に所定の処理をさせるようにメッせージを送る。 myappliは、何らかの方法でこのメッせージを受け取る。 myappliの変数wdAppli(Word.Applicationインスタンス)を介して、 ワード文書内に適宜の文字を追加する。WdTypeText(string str); 理想はこんな感じです --------------- (a)現在実行中のプログラム一覧を取得 → VBAでやったことないから自信ないけど不可能ではなさそう。 (b)「myappli」に〜〜メッせージを送る。→送れるのか・・・ (c)myappliは、何らかの方法でこのメッせージを受け取る。→受け取れるのか・・・ この3点さえ解決すれば、OKです
934 :
924 :2006/04/12(水) 15:50:17
>>932 僕がグローバルホットキーを使う方法は、こんな感じです。
///<summary>ホットキーが押された時に発生します。</summary>
public event HotkeyReceivedEventHandler HotkeyReceived;
///<summary>WndProcをオーバーライドします。</summary>
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x312 && HotkeyReceived != null)
{
//LParamの上位ワードが仮想キーコード、下位ワードが修飾キー
Keys key = (Keys)((int)m.LParam >> 16);
Modifiers modifiers = (Modifiers)((int)m.LParam & 0xFFFF);
HotkeyReceived(this, new HotkeyReceivedEventArgs(key, modifiers));
}
base.WndProc(ref m);
}
ぶっちゃけると、このスレの住人は.NET Frameworkなんて知らない 旧世代の人間だから、別のスレで聞いた方がいいと思うぞw っていうか、そもそも.NET Frameworkはこのスレではないと思うが。
>>933 その myAppli 内に COM オブジェクトを実装して(COMサーバ化して)、
word の マクロの中ではそれを CreateObject して myAppli と通信するってのが一般的。
ATL なら簡単にできる。MFC だとどうやるんだっけ・・。APIだけだとちょっと難しい。
937 :
924 :2006/04/12(水) 15:54:02
938 :
924 :2006/04/12(水) 15:56:16
>>932様 >>936様 孤独感から解放された気がしました。
939 :
924 :2006/04/12(水) 15:59:11
>>939 > しかし、myappliは、ワード文書を作成中(即ち、Ctrl+Rを押下する時点)では、
> 非アクティブとなっております。
逆。myAppliがグローバルフック仕掛けてC-r押されたときにWordがアクティブか判断する。
がホストしてるWordのウィンドウハンドルを手に入れるのは無理な気がする。
モジュール名の取得とかで行けないこともないか?
>>933 で良いのならそれで良さそうだが。
SendMessage WndProc
941 :
924 :2006/04/12(水) 16:09:11
942 :
924 :2006/04/12(水) 16:15:31
>>940 >逆。myAppliがグローバルフック仕掛けてC-r押されたときにWordがアクティブか判断する。
なるほど、よく理解できます。
これだったら、ワード文書の作成と並行して起動されているイラストレータ
をいじってるときに、イラストレータのショートカットであるCtrl+Rを
押しても、ワードがアクティブじゃなければ、WndProcプロシージャの中では
何もしなければいいんですものね。
でも、でも、ワード文書で日本語を入力しているときであって、
入力されている文字がまだ未確定の場合はどうなるでしょうか。
ワード文書はアクティブですが、文字が未確定(変換中を示す。)のときに、
myAppliがワード文書内に所定の文字を追加するようWdTypeText(String str)
を実行してしまうと、ワードばぐるんですよ
(この問題が発生しているので、私は他の手法を考えていたところだったのです)
944 :
924 :2006/04/12(水) 17:17:18
>>943 どうもありがとう!
>ctrl+R押すと右揃えになるんだわ。参考までに。
デフォルトでは仰るとおりです。
945 :
デフォルトの名無しさん :2006/04/12(水) 18:35:51
実行プログラムを開くとメールで開いたことを伝えるプログラム組みたいんだけど何方かわかる人いますか?
socket使ってSMTP送ればいいじゃん
947 :
デフォルトの名無しさん :2006/04/12(水) 18:44:55
948 :
デフォルトの名無しさん :2006/04/12(水) 18:50:02
まんまのコードが載ってるのに技量も糞も無いだろ
カット&ペーストの技量が今ひとつなんだろう
とゆうかよりにもよって猫かよ
>>945 プロセス列挙かスナップショットでポーリング。
見つかったらCDOで送る。
ポーリングの間をすりぬけるケースを拾いたければ、、、知らん
>>953 CreateProcessをフックすればいいんじゃない?
WH_GETMESSAGEでメッセージフックしてるんですが、しばらく動かしてると 時々フックが外れて何も通知されなくなってしまいます。 このときマウス等の他のフックは動いているようです。 いろいろ探していてExplorer.exeが再起動したときなんかはフックが外れる ようなことをどこかで見たのですが、対処方法まではわかりませんでした。 フックが外れたことを検出する方法と、その際の復旧方法について教えてください。
>>955 さあ、さっぱりわからんけど、explorer.exeの再起動を
検知する姑息な方法として思いついたのは、
・PIDを覚えておいて定期的にチェック
・タスクトレイ常駐アプリはexplorer.exeの再起動を
教えてもらえると思うので、それを利用
PIDってProcessIDか なんかピッドとかいうハンドルみたいなものがあると思ってた
>>955 シェルが再起動した場合は、RegisterWindowMessage("TaskbarCreated") のメッセージが来る
TaskbarCreatedって定数式じゃないからcaseに出来ないのが微妙に腹立つんだよな
960 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/04/12(水) 23:36:19 BE:161396148-
>>1 に
>日本語版MSDN Online Libraryは不完全です
ってあるけど、本当だね。
FindFirstFileで英語版だとルートディレクトリも工夫次第で検索できることになっているのに
日本語版だと検索できないとしか書いてないという。
>>959 ものすごい勘違いしている気がする・・・
>>962 よくわからんが
RegisterWindowMessage() … つか、関数の戻り値を case ラベルに利用する方法を教えてくれ。
964 :
デフォルトの名無しさん :2006/04/13(木) 08:11:00
基本的にメッセージハンドラへの分岐に switch - case なんぞ使ってねえし
フレームワークを使わないSDKオンリーのサンプルは switch-case使ってるのがほとんどだけどね。
966 :
デフォルトの名無しさん :2006/04/13(木) 09:14:39
空気読めよ
これから勉強しようとしている者です。 Win32API作成するのに一番主流なのはMFCですか?
Win32API を作るのは Microsoft しかできないと思うが。
969 :
デフォルトの名無しさん :2006/04/13(木) 13:59:50
キーボードからの物理的なキーストロークは受け付けるけど、 SendInput でキーストローク送っても受け付けないウィンドウがあるんですが、 受け付けさせるのに何か良い方法ありませんでしょうか?
MFCなんていらん 実力付けたきゃ全部自分で書け
VBです。
SetKeyStateみたいなの無い? キーの入力状態を設定する関数
SendKeyでUp/Downとか送っとけ
KFCウマー(゚д゚)
>>975 >>986 なんて相手にするなよw
意地悪かバカかのどっちかだ。どっちにしてもかまってロクなことはないw
まあリアルで友達いないんだろうな。ここでかまってあげる優しさもありか( ´艸`)
MFCは馬鹿には扱えないから
馬鹿しか使わないの間違いだろwww
馬鹿は「***を使う奴は〜」と言いたがる。
981 :
972 :2006/04/13(木) 15:51:24
>>972 C++使ってるからむりぽ
Ctrl+Alt+Delに似たことをやりたいんだけど、何か無い?
983 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/04/13(木) 19:17:11 BE:90786029-
VB6って8年ぐらい前じゃないか?
>>981 やりたいことがわからんから多分外してるが
LockWorkstation
986 :
デフォルトの名無しさん :2006/04/13(木) 21:37:45
988 :
デフォルトの名無しさん :2006/04/13(木) 21:45:12
987さん ありがとうございます。 Microsoft Platform SDK for Windows Server 2003 SP1 というやつをインストールしましたが、 これのどこをみたらAPIのヘッダファイルをみることができるか 教えてもらえないでしょうか?
まて、32bit環境で64bitのEXEを作成する気かもしれないだろ!
そうなのか?小出しh(ry
991 :
デフォルトの名無しさん :2006/04/13(木) 23:38:38
プラットフォームSDKをインストールしましたが。 どこさがしてもヘッダファイルが見つかりませんが? どこをみたらいいのでしょうか?
見ようとするな。
もちろんインストールしたドライブを*.hで検索とかはしたんだろうな?
994 :
デフォルトの名無しさん :2006/04/14(金) 00:03:22
ありがとうございます。わかりました。
995 :
デフォルトの名無しさん :2006/04/14(金) 00:42:25
定数をVB.NET用定義にするにはどうしたらよいのでしょうか? 具体的なやり方を教えてください。
それがWIN32APIに関する質問だと思うなら、居座り続けるがよい。
997 :
デフォルトの名無しさん :2006/04/14(金) 02:23:04
定数の定数名をエクスプローラーに掛けてみましたがヒットしません。 これはどういうことが考えられるのでしょうか?
998 :
SOURCE ◆tAo.kQ2STk :2006/04/14(金) 02:59:26
梅
桜
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。