1 :
デフォルトの名無しさん :
2006/06/28(水) 22:38:45 スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
2 :
デフォルトの名無しさん :2006/06/28(水) 22:39:49
3 :
デフォルトの名無しさん :2006/06/28(水) 22:41:01
4 :
デフォルトの名無しさん :2006/06/28(水) 22:42:11
5 :
デフォルトの名無しさん :2006/06/28(水) 22:43:11
MessageBox(NULL, "
>>1 乙", NULL, MB_OK);
一物
11 :
デフォルトの名無しさん :2006/06/29(木) 19:27:01
ハードディスクのキャッシュ内容ををハードディスクに書き出したい(シンクロさせたい?) だけど、APIありますか?
12 :
デフォルトの名無しさん :2006/06/29(木) 19:28:54
ハードディスクのキャッシュ内容ををハードディスクに書き出したい(シンクロさせたい?) だけど、APIありますか?
ttp://support.microsoft.com/default.aspx?scid=kb;ja;332023 キャッシュされたデータを即座に物理ディスクに書き込むように強制するには、一般に以下の 2 つのコマンドを使用します。
*)flush buffers コマンドは、SCSI および IDE/ATAPI のディスク デバイスで使用できるコマンドであり、
ディスクに対し、キャッシュされたデータをすべて即座にディスクに書き込むように命令します。
SCSI ディスクの場合は、ディスクに SYNCHRONIZE CACHE コマンドを発行することによって実装されています。
IDE/ATAPI ディスクの場合は、ディスクに対して FLUSH CACHE コマンドが送られます。
このコマンドは、通常、Windows のプログラムが FlushFileBuffers API を呼び出した結果として発行されます。
レジストリへの書き込みは、FlushFileBuffers API の呼び出しと
ディスクへの SYNCHRONIZE CACHE コマンドの送信が発生する操作の一例です。
*)Write Through コマンドは、SCSI ディスク デバイスでのみ使用でき、ForceUnitAccess (FUA) ビットを設定した状態で
ディスクに対して WRITE コマンドを発行することによって実装されています。この種のコマンドは、現在のデータのパケットを、
オンボード書き込みキャッシュを通さずに、即座にディスクに書き込むように命令します。
通常、この動作が発生するのは、Windows プログラムが、FILE_FLAG_WRITE_THROUGH フラグを設定した状態で
CreateFile API を呼び出して開いたファイルに対して、WriteFile API を呼び出して書き込みを行った場合です。
一般にウイルス検索ソフトウェアは、FILE_FLAG_WRITE_THROUGH フラグを設定した状態でファイルを開きます。
FUA ビットのサポートはオプションです。この機能は、一部の SCSI およびファイバ チャネル (FC) デバイス
(一般には RAID アレイではなく個々のドライブ) にのみ実装されています。
仕様により、これらのコマンドは、ディスクに書き込まれているデータの安全性を確保するため、
ある程度のパフォーマンス (一般にはディスクのオンボード書き込みキャッシュによって提供されるもの) を犠牲にします。
これらのコマンドによってデータがディスクに即座に書き込まれず、さらにディスクの電源が突然切れた場合、
キャッシュされたデータは失われます。また、書き込み中のファイルが破損する可能性もあります。
ファイル・アクセスを細かく制御する (API VC++)
ttp://www.geocities.jp/monalipse/c/api/FileAccess.html
15 :
デフォルトの名無しさん :2006/06/29(木) 20:17:28
早速のレスどうもです! 参考になりました。 ハードディスク全体のキャッシュの書き出しをしたいので「flush buffers」で目的が達成できそうなんですが、 VCのヘッダー群、Googleで検索してみたんですが、有効な情報が見つけられませんでした。 何か情報ありましたら教えてください。 よろしくお願いします。
17 :
デフォルトの名無しさん :2006/06/29(木) 20:25:16
>このコマンドは、通常、Windows のプログラムが FlushFileBuffers API を呼び出した結果として発行されます。
自作ポエムを大量に流せ
フィギュアぶっかけ画像も
21 :
デフォルトの名無しさん :2006/06/30(金) 01:58:58
タスクマネージャの「プロセスの終了」はどのような方法をとっているのでしょうか? TerminateProcessかと思ったのですがDLLの管理について問題があるようです ExitProcessは引数にプロセスのハンドルが渡せないので自プロセスのみかと思われます
>>21 タスクマネージャがどう処理しているのかは知らないが、
予め終了させたいプロセスが分かっている(hProcessとする)なら
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "ExitProcess"), 0, 0, NULL);
のように、相手のプロセスに強制的にExitProcessを呼び出させることができるけど。
これでうまくいくかはシラン
23 :
15 :2006/06/30(金) 11:47:23
レスありがとうございます、 スイマセン説明不足でした。 やりたい事は、自分が作ったファイルのキャッシュの書き出だけではく、 システム駆動中のプロセス全部のキャッシュの書き出しを行いたいのです、 (シッピング?のような) 情報ありましたら、よろしくお願いします
他の実行ファイル(Notepad)を実行してNotepadに文字列を入力して改行したいの ですが、どうすればいいでしょうか? 一文字、一文字を入力ならkeybd_eventで入力は出来たのですが文字列で一気に 入力したいのです。理想としては char MOZI;とかの変数にwscanfなどで入力された文字列を変数に保存(代入?)して そのあとにNotepadを起動したらその文字列と最後に改行を入力したいのです。 どうかよろしくお願いします。
25 :
21 :2006/06/30(金) 18:00:18
>>22 うまくいきました. ありがとうございます
>>25 一応言っておくと、22の方法は9xでは使えないが平気?
プロセス/スレッド制御は9xとNT系で大きく違いすぎて 互換性を考慮するのが大変になってきたな…
>>23 そのリンクに「レジストリに書き込めばすべてフラッシュされる」と書いてある
めちゃくちゃくだらない事で恐縮なんですが… DWORDってDoubleWORD、ワード長*2 って事で32bitなんですよね? でも今のCPUってIA32だからワード長は32bitじゃないんですか?
>>29 16bitのときからあったデータ型なんじゃないのか?
で、そのままソースの互換を保つために32bitに。と適当に回答。
あーなるほど…… 即レス感謝です。
自プロセスで生成したメインウィンドウの一覧を取得したいのですが何かよいAPIはあるでしょうか? EnumWindowsだと他のプロセスのメインウィンドウも取得してしまうので困っています。
EnumWindowsで取得したウインドウに対してGetWindowThreadProcessIdをかけてプロセスIDを取得し、 それをGetCurrentProcessIdで取得した自プロセスのIDと比較する。 一致していれば自プロセスのウインドウ。
>>33 スレッド単位で良ければEnumThreadWindowsがあるんだけどね。
タスクトレイの件で質問した、前スレ979ですが
>>980 おっしゃるホバー時に文字列を動的に生成される場合には、
正常に取得できないとの事ですが、そういう場合は
諦めるものとして、それ以外のホバー時に動的に生成しない
ものについて、取得する方法はありますか。
>>983 CPU使用率を取るためにこういう事をしたいんじゃなくて、
タスクマネージャのCPU使用率のように、ころころとツールチップの
内容が変わる場合に、その文字列を取得したいという例です。
勿論取得したい文字列は、タスクマネージャのものではありません・・。
98 までを切り捨てるなら、 Shell_TrayWndから辿っていってToolbarWindow32まで行って、 そいつのToolTip取得して、 そっから文字列取得すればいいだろ。
39 :
982 :2006/07/01(土) 10:48:40
>>37 だからShell_NotifyIconをフックしろって。
動的だろうがなんだろうが対応できるから。
41 :
デフォルトの名無しさん :2006/07/01(土) 15:11:21
ほかのウィンドウよりいつも手前に表示されてるんだけどウィンドウメッセージは 自分の裏のにスルーしたいときってシコシコ自前で中継する方法しかありませんか? 自ウィンドウを表示されてるんだけど存在してないことにしてくれるモードになれるAPIみたいのがほしいです
日本語でおk
>>41 多分、キーボードイベント・マウスイベントをフォアグランドウィンドウ以外の
ウィンドウで受け取りたいとの事ではないかと。
その機能を実現するAPIは、AttachThreadInput で実現可能
>>42 つまり、AAであらわすとこんな感じのやつってことでわ?
// |
// 」 |
// 7Γ |
//_ |
||| | |
| | /
ダンッ | u | /
ダンッ | \ |
ちょwwおまww \ _ | \ |
マトリクスー _―\\ || | ___ |__  ̄ ̄―______-/
Λ_Λ ━−‐‐‐ ) ( ̄ ̄ ̄(Ξ (|| || | _______|__
(;´∀`)━Λ_Λ‐‐ ━−‐‐‐  ̄―//  ̄ ̄(Ξ (|| || ___|―― _________|_
( ) ( ´∀`)ーっ__ ミ / ダンッ (Ξ (|| ||≪| _―― ̄ ̄ |
| | | ⊂ニ__  ̄ヽ\ | ̄― ̄/ ̄ ____―――――――――
(__)_) (__)_) ( ̄(0_/ ̄ ̄ ̄
エディットボックスに無効な数字(例えば小さすぎる数字)などが 入力されたときに、エラーメッセージをMessageBoxではなく バルーンを使って表示したいのですが、どうすれば良いでしょうか? CToolTipCtrl ttc; ttc.Create(m_hWnd, 0, 0, TTS_BALLOON); ttc.Activate(TRUE); ttc.SetTitle(TTI_ERROR, L"エラータイトル"); ttc.AddTool(CToolInfo(TTF_SUBCLASS, GetDlgItem(IDC_EDIT), 0, 0, L"エラーメッセージ")); こうしてしまうとエディットボックスにカーソルを置かないとエラーメッセージが 表示されないし、IDC_EDITに元からある説明のためのバルーンに重なって表示されてしまいます。
できました〜みなさ〜ん!!
まだ課題が山積みですが、一応SDKレベルでActiveXコントロールを初期化する方法がわかりました。
WBC001.LZH:SDKレベルでWebBrowserコントロールを使用して簡易ブラウザを作るサンプル(C++)
ttp://winscript.s41.xrea.com/upload/source/No_0015.lzh あの後、CoCreateInstance()じゃなくてOleCreate()を使うのだ、という事に気付いたのだけれどその後がわからなくて、OleCreateでググったらズバリな記事がCode Projectにありました。ありがとうCode Project!
ttp://www.codeproject.com/com/cwebpage.asp?df=100&forumid=13828&exp=0&select=1119074 しかし、MSにはまたやられた・・・
SDK文書にはDoVerbすると書いてある個所があるのは分かってた。
で、DoVerbのリファレンス見たらEnumVerbしたものをパラメータに入れるって書いてある。
のでIEnumVerb::Next()してみたら一つも列挙できないのでこれじゃDoVerbなんか出来ないな、と思ってたら実はEnumVerbしなくてもDoVerbはできるのだった・・・
それは上のCode Projectの記事でVerb列挙できないWebBrowserコントロールにDoVerbしているのを見てわかったのだった・・・
・・・MSDN・・・なぜこんなにもオレを酷い目に遭わせる・・・OrZ
なお、現在ひっかかっているのはタブストップです。コントロール内の各コントロール(ボタンとかエディットとか)やリンクをTABキーで巡回できません。
そもそも私はTABキーで移動する正式なやり方を知らなくて、
いつもはメインループ部でWM_KEYDOWN/VK_TABが来たら次の子ウィンドウにSetFocusする、という方法をやってます。(バカなのかも)
たぶんみなさんならTABキーで移動できる方法が想像つくんじゃないでしょうか?
で、何はともあれ、これでどんなコンパイラでもWebBrowserコントロールが使えます!
BCCでもgccでもWin32対応なら何でもです!(NASMとかもありかも) MSに頼る必要はもうありません!
うーん・・・ブラウザ百出の予感・・・
長文失礼しました。m(_ _)m
>>46 Sub1〜Sub8っていう関数名どうにかしろよ。
>>46 コンストラクタでAddRef呼んで、デストラクタでRelease呼ぶのもおかしいだろ。
51 :
50 :2006/07/02(日) 00:07:35
あっ、タブストップはあれじゃないか? ウィンドウスタイルのWS_TABSTOP指定してないんじゃないか?
54 :
デフォルトの名無しさん :2006/07/02(日) 07:49:08
すでに起動されてるプロセスの実行ファイル名がわかってるときに(仮にtest.exeとする) そのプロセスハンドルを取得するにはどうすればいいのでしょうか?
Process クラス調べろ
HDC・・・・・・・・画像を描く板 HBITMAP・・・・画像のデータ情報 HBITMAPの形式 ・DIB・・・・・多様性が高い情報形式 ・DDB・・・・マイナーな情報形式 上の認識でOK? CreateCompatibleDCでDCを55個作りまくったんだんだが、たった55kアップ。 メモリがあまり変化してない、画像データってもっとメモリ食うと思ってたよ。
( ゚д゚)ポカーン
ツールバーを作ったのですが、bitmapによってエラーをはくと思ったら、trueカラーがだめなようです。 ソフトで対応しているものは多いのに、なぜだめなのでしょうか?MSDNで調べてみましたが、見つかりませんでした。 それとも別の方法で実現しているのでしょうか?ほかに原因と思われるものはないのですが・・ よろしくお願いします。
>>56 HDCはデバイスコンテキストへのハンドル
デバイスコンテキストというのは抽象的なもので
描画先はウインドウだったり、プリンタだったりする。
これによって、描画先が何であろうと、プログラマが気にしなくてすむ。
DIBとDDBは簡潔に説明するのが、自分には無理なのでパス
CreateCompatibleDCで作ったデバイスコンテキストには、
1x1モノクロのビットマップが割り当てられている。
もしこのDCに描画したかったら、自分でビットマップを確保して
SelectObject()すること。
>>54 プロセスを列挙して一個ずつ条件にあうかどうか調べる。
画像の表示までは出来た・・・・ 透明も・・・しかし半透明ができない!w やっぱ一個一個計算していくしかないのね・・・うはすふあhふdsyひゅは オワタ
>>56 HDC…画家
HBITMAP…紙
DIB…デバイスに依存しない統一された形式
DDB…デバイスによってフォーマットが異なる
>>56 俺は、HDCが画像を書く板という認識でもよいと思う。
ただ、CreateCompatibleDCで作ったデバイスコンテキスト(板)は、
その上に紙(ビットマップ)を置いて、その紙に画を描くんだという感じ。
(紙を置くとは、HBITMAPをSelectObjectで選択するということ)
初期状態では、1×1モノクロと言うどうしようもないほど小さな紙が置いてある。
紙がない状態が存在すると面倒だから、とりあえず置いてあります程度に考えておけばいい。
結構無理がある言い方だけど、これは連想ゲームの限界。
また、DDBはマイナーでもなんでもない。ただ内部でのみ使われるので外に現れないというだけ。
HBITMAPはDDB。DIBのHBITMAPは存在しないと思え。(ハイブリッドなDIBセクションというのもあるが)
64 :
デフォルトの名無しさん :2006/07/02(日) 15:51:48
-- ビルド開始: プロジェクト: 01, 構成: Debug Win32 ------ リンクしています... WinMain.obj : error LNK2019: 未解決の外部シンボル "public: static struct tagBITMAPINFO * CSpriteAlpha::lpDibBitInfo" (?lpDibBitInfo@CSpriteAlpha@@2PAUtagBITMAPINFO@@A) が 関数 "public: _thiscall CSpriteAlpha::~CSpriteAlpha(void)" (??1CSpriteAlpha@@QAE@XZ) で参照されました。 WinMain.obj : error LNK2019: 未解決の外部シンボル "public: static struct HBITMAP__ * CSpriteAlpha::hDib" (?hDib@CSpriteAlpha@@2PAUHBITMAP__@@A) が 関数 "public: __thiscall CSpriteAlpha::~CSpriteAlpha(void)" (??1CSpriteAlpha@@QAE@XZ) で参照されました。 WinMain.obj : error LNK2019: 未解決の外部シンボル "public: static struct HDC__ * CSpriteAlpha::hDC" (?hDC@CSpriteAlpha@@2PAUHDC__@@A) が 関数 "public: __thiscall CSpriteAlpha::~CSpriteAlpha(void)" (??1CSpriteAlpha@@QAE@XZ) で参照されました。 D:\c\works\takuhai\Debug\01.exe : fatal error LNK1120: 外部参照 3 が未解決です。 ビルドログは "file://d:\c\works\takuhai\01\Debug\BuildLog.htm" に保存されました。 01 - エラー 4、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
r;ァ'N;:::::::::::::,ィ/ >::::::::::ヽ . 〃 ヽル1'´ ∠:::::::::::::::::i i′ ___, - ,. = -一  ̄l:::::::::::::::l . ! , -==、´r' l::::::/,ニ.ヽ l _,, -‐''二ゝ l::::l f゙ヽ |、 ここはお前の日記帳じゃねえんだ レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ チラシの裏にでも書いてろ :ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ ::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ ::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ , な! :::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::/// :::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ / ::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
HDC…カンバス HBITMAP…紙 ペンやブラシ・・・画材 LineTo 等の関数・・・画家
LoadImageやBitBltで画像の表示&色抜きは出来たけど、 半透明&回転が出来ない、どうやらDDBでは無理らしい。 なのでDIB(直接アクセス?)でやらんといけないとか・・ 表示はStretchDIBitsでやるのかBitBltは!? あ〜 もうダメポ・・・・・orz DirectXの方が簡単に思えてきた。
その手のサイトを読み込んで出直して来い ここはお前の(ry
>>67 ライブラリ組んでしまえばDirect3D使った方が楽な上に早い
ちらし DIBSectionを使えばいいことが発見!! DDBは回転&透明でない、DIBは使いづらいなどの欠点を解決した!? いいとこどりのDIBSection!!! DIBSectionは速度どうだろう、測定してみるか。
>69 DirectX使えない人のためにGDIの方がいいと思って。 DirectX使えない人はいまだに見かけるorz やっぱ切り捨てたほうがよさげ!?
AlphaBlendってなかったっけ?
ピクセル単位で処理すればなんでもできるだろ とりあえず「今日は〜ができました」とか言ったことはチラシの裏に書いとけ ここは質問箱
AlphaBlendはWin98で動かないらしいので諦めました ちなみに、我輩はXPです。
>75 thx 無事成功すると思います。
DIBSection遅いーーー!!!! 640*480 十回表示。 DDB 30fps CPU 8% DIBSection 3fps CPU100% 使えない・・・・orz
>78 じゃ、質問 早い回転&透明が出来る方法教えて。
もういいよ。うせろ
>80 質問聞いといて、答えられないw
82 :
80 :2006/07/02(日) 22:16:02
俺は
>>78 じゃないけど
そうだな。少なくとも俺はレベルがとても低いので答えられそうにない
よってゲーム製作板に行く事をオススメする
83 :
デフォルトの名無しさん :2006/07/02(日) 22:18:18
すいません質問させてください。 煩雑にファイルの出し入れや書き換えをしているフォルダが複数あるのですが、 それらのファイルの状況を監視したいと思っているのですが、 数が多すぎて通常のファイルアクセスでは遅くなってしまいます。 そこで、OSがファイル書き込みした時やファイル書き換えをする時などに、フックを仕掛けられないかと思っているのですが、 そのような方法をご存知の方がいましたらご教授ください。
84 :
デフォルトの名無しさん :2006/07/02(日) 22:25:10
初心者質問ですいません。 c言語のソースをコンパイルしたいのですがどうするのか・・・。 コマンドプロンプトでしたいのですが
85 :
83 :2006/07/02(日) 22:29:52
FindFirstChangeNotificationかなんかで出来た気もするが、たぶん見てないだろうな
>>84 a.cをコンパイルするとしたら、
VCならコマンドプロンプトから cl.exe a.c
mingwならコマンドプロンプトから g++.exe a.c
BCCならコマンドプロンプトから bcc32.exe a.c
コマンドラインの引数が知りたかったら cl /? とか g++ -h とかbcc32は知らん。とかすればいい。
89 :
45 :2006/07/02(日) 23:39:30
こっちも誰かいいアイデアお願いします・・
90 :
83 :2006/07/02(日) 23:41:13
>>86 レスありがとうございます。
知りませんでした。情報ありがとうございます。m(_ _)m
ただWaitForSingleObjectがブロック関数なので、同時に監視したいフォルダの数だけスレッドを作らないといけないみたいですね。
ICopyHookインターフェイスと異なりNTFSだけというわけではなく
Win95,NT3.1以降対象なので、FAT32でも問題なく動きそうなのでこちらで検討してみます。
>>90 少しは勉強しろよ。
WaitForSingleObject()が見つかれば、すぐそばにWaitForMultipleObjects()があるだろ。
92 :
83 :2006/07/02(日) 23:56:50
>>91 レスありがとうございます。
気づきませんでした。まだプログラムの感覚が鈍いと反省してます・・・・
監視自体が内部的には別スレッド動いているみたいですね。
>プログラムの感覚が鈍い ┐(´-`)┌
MessageBox APIの第二引数の型はLPCSTRですが、 ここにint型を指定したいんですがどうすればよいでしょうか? MessageBox(0,i,NULL,MB_OK); みたいにやりたいんですが
>>94 無理。itoaとかsprintfとかで文字列に変換してからに指定しる。
>77 これって俺のプログラムミス? 異常だよな、、、サイト探してるとDIBSection普通に使っているし。
98 :
94 :2006/07/03(月) 01:23:21
>>95 さん
>>96 さん
どうもありがとうございます
char buff[100];
int i = 3;
sprintf(buff, "%d", i);
MessageBox(0,buff,0,MB_OK);
でいけました
表示されている画面の色だけを変更したいのですが。 例えば赤い丸の図形があってこれを青色にしたいとき。 こういう場合は、再描画(丸をいったん消して、ペンの色を変えて円を書き直す。) するしかないのでしょうか。
いや
あるフォルダ内にあるファイル一覧を元に動的にポップアップメニューを作成する場合、 どういう方法をとるのが楽ですか? 普通にCreateMenu、AppendMenuをして map<UINT, string>型のグローバル変数に IDとファイル名を保存しておいて、WndProcでどのメニューアイテムが クリックされたか取得というのを考えたのですが、どうでしょうか。
ID_BASE + n とか
106 :
デフォルトの名無しさん :2006/07/03(月) 14:21:57
だれか、Win32 API の FindFirstFile()や FindNextFile()を使って、 指定されたフォルダの中のファイルを全て削除するプログラム作ってけろ。 サブフォルダがある場合は再帰的に。 よろぴく。
1万円で作ってやる
FindWindow APIの第二引数はドキュメントによれば 「NULL で終わる文字列へのポインタを指定します」 とありますが、 FindWindow(NULL,"aaaaa"); とすると、aaaaaというタイトルのウィンドウがあればちゃんとハンドルが帰ってきます。 例えばchar a[] = "aaaa"; とすればa[]には実際にはaaaa\0が格納されますが、 LPCTSTR型に関しても同じ作用があるのでしょうか? あ、LPCTSTR型ってchar *の別名でしたっけ?
>>108 Win32APIというよりC/C++の問題。
"aaaaa"のような文字列リテラルは、ヌル文字終端の文字の配列。
LPCTSTRはconst TCHAR *のtypedef。
そう思いたいのなら、const char *のtypedefだと思えばいい。
110 :
デフォルトの名無しさん :2006/07/03(月) 15:06:16
リストビューで、Drag&Dropを受け付けようと、DragAcceptFilesを実行してみたのですが、 WM_DROPFILESのメッセージが来ません。ぐぐってみた所、 リッチエディットコントロールだと、EN_DROPFILESというのがあるようなのですが、 リストビューの場合は、Drag&Dropを受け取る手段が無いのでしょうか?
111 :
108 :2006/07/03(月) 15:07:33
>>109 はやっ
全然知りませんでした。ありがとうございます
TCHARを調べてみると
For Unicode platforms, TCHAR is defined as synonymous with the WCHAR type.
とありました
#define _UNICODE
すれば wcharになるんですね
Drag&Dropは受けれる
114 :
デフォルトの名無しさん :2006/07/03(月) 19:22:12
アプリを再起動させていんだけど。。。 自作アプリを一旦終了し、また再起動(パソコンの再起動じゃないよ、自作アプリの再起動)させてたい。 こんな事したいんですけど、気の利いたAPIありますか? それとも、別のプロセスで見張ってないとですか? 知ってたら教えてください。
質問があります。 Tera Termからコマンド入力するプログラムがあるのですが、コマンドを毎回入力するのは 面倒ということで簡単なリモコンぽいモノをVCで作ることになりました。 Tera Termからのコマンド入力という考え方はそのままで、VCのボタンなりを押下することで Tera Termのコンソール部にメッセージを送りたいと思っています。 (例えば、STARTボタンを押下するとコンソール部にstartと表示される) FindWindowでTera Termのウインドウハンドルを取得して、SendMessageでメッセージを送ろうとしたのですが、 Tera Termのハンドルの取得がうまくないのか、コンソール部ではなく、タイトル部に対してメッセージを送ってしまい タイトル名が変更されるという結果になってしまいました。 何か処理が足りないのでしょうか?それとも他の方法があるのでしょうか? ご教授のほど、お願いします。
>>114 自exeを起動して、自プロセスを終了させるだけじゃん。
>>115 spy++でどういうウィンドウ構成になっているか調べろ。
Tera Termのソースなら持ってるよ
Tera Termのヘルプをよく読もう
レジストリ
122 :
115 :2006/07/03(月) 20:37:50
>>117-119 早速のレスありがとうございます。
解決しましたと言いたいところですが、明日改めて確認してみます。
会社ではネットを見る権限がないので・・・
spy++とTera Termのヘルプですか。
spy++は確認したつもりですが、理解不足だったみたいですね。
ヘルプはTera Term側が原因と思わず、見向きもしてませんでした。
>> SH〜〜のAPIにそういう関数があったと思う。SHRemoveDirectoryだっけか、よく覚えてないが
>>123 DeleteFileより、
> To recursively delete the files in a directory, use the
> SHFileOperation function.
ということのようです。
>>112 どうやって受け取るのでしょうか。WM_DROPFILESのメッセージも来ないようですし、
WM_COMMANDやWM_NOTIFYをチェックしてもそれらしいメッセージが見当たりません。
>>125 ぐぐってると、コモンコントロールへのドロップは、
サブクラス化しないと受け取れないという事が書いてありましたので、
試してみたらいけました。お騒がせしました。
127 :
デフォルトの名無しさん :2006/07/03(月) 21:50:08
>>114 多重起動防止のロジックを応用して、
起動時に多重起動だったら
古いプロセスを殺すようにしておいて
再起動したいときはargv[0]を
CreateProcess()する。
という手はよく使う。
128 :
120 :2006/07/03(月) 22:27:32
CS_DROPSHADOWなんてのがありました
座標からウィンドウハンドル取得できなかったっけ
WindowFromPoint
133 :
デフォルトの名無しさん :2006/07/04(火) 01:12:43
>113 大変ありがとうございました。 さっそく、明日、会社で、参考にさせていただきます。
135 :
デフォルトの名無しさん :2006/07/04(火) 03:10:48
Windows起動や終了時、ログオン、ログオフの時に飛んでくるメッセージは何になるのでしょうか?
いや別に飛んできたメッセージが何か別のものになることはないから。
GetProcessHeap()って同一プロセスなら常に同じハンドルが返ってくる? void *buf = HeapAlloc( GetProcessHeap(), 0, size ); if ( buf == NULL ) return 1; HeapFree( GetProcessHeap(), 0, buf ); みたいなのは安全?
>>136 起動時や終了時、ログオン、ログオフ時に何か処理をしたいと思っているのですが
どんなメッセージを捕まえればよいのかさっぱりで途方にくれています。
何かヒントをいただけませんでしょうか?
起動時やログオン時には何もこないよ。 アプリも動いてないし。 ログオフ時、終了時には WM_QUERYENDSESSION とか WM_ENDSESSION とか来ますよ。
>>140 その二つのメッセージがあれば目的を達成できそうです。
回答ありがとうございますた。
>>140 続けてお尋ねしたいのですが
ログオフ時と終了時の区別、スタンバイと休止の区別をつけることは出来ますでしょうか?
>>142 スタンバイ等のときにはWM_POWERBROADCASTも来ますので、
それでなんとかならないでしょうか。
>>144 回答ありがとうございます。
それが私の環境ですと休止、スタンバイとWM_POWERBROADCASTが送られてきて
スタンバイと休止の区別が付きませんでした。
環境はWindowsXPsp2です。
それにしてもXPのグループポリシーでは起動・終了・ログオフ・ログオンを区別出来てるようなのに
それに対するメッセージがないのはなんでだろう。
>>145 WM_POWERBROADCASTが飛んできたらwParamを見て、
PBT_APMQUERYSTANDBYになっていたらスタンバイ
PBT_APMQUERYSUSPENDになっていたら休止状態
じゃなかったっけ?
>>146 私もそう思っていたのですが検証してみると
PBT_APMQUERYSUSPENDのみ飛んできて
STANDBYと名の付くメッセージは飛んできませんでした。
何かおかしいのかな?
>>143 根拠が不明だから本当に安全かどうか分からん
単に「今まで動いてた」ってだけかもしれないし
>>147 PBT_APMQUERYSTANDBYは廃止されたっぽい。
ヘッダには残ってるけどMSDNからは説明が消えてる
>>148 HeapAlloc/HeapFreeの引数にGetProcessHeapを使うイディオムは
MSDN内のサンプルコードの所々に使われてるよ。
>>143 でも俺はGetProcessHeapを呼び出すオーバーヘッドが気になって、
結局グローバル変数にコピーする派。
>>147 以前に誰かのサイトで、
サンザ探したけどその情報の取得の仕方はわからず、
NT系列のOSではレジストリのどっかに書かれてるので結局それを参照した
とかいうことが書かれていますた・・・
特定のプロセス(のウインドウ)だけを、一時的に最小化・元に戻す事を出来なくしたいのですが どうすれば良いでしょうか。グローバルフックしてメッセージを破棄すれば良さそうなのは 分かるのですが、そうすると全てのウインドウに対して行われてしまいますので^^;
エクスプローラのタイトルバーみたくウィンドウのサイズを変更したら ピクセルの色をグラデーションみたいに表示したいんだけど いい方法あったら教えてほしいんだ。 本にGetPixelとSetPixel関数は使わないほうがいいって書いてて、 実際それでコーディングしてみたらウィンドウサイズ変更のたびに重くて使えない。
156 :
153 :2006/07/04(火) 16:09:21
すいません自己解決しました。
>>153 グローバルフックして、その特定のプロセス(のウインドウ)だけ処理すればいいじゃない。
>>155 ありがとう。
今調べてるんだけどGradientFill関数のサンプルコードがなかなか見つからない・・・
なんか知らない構造体が引数になっててとまどってる
>>153 システムメニューから削っちゃえば?
元にもどせるかどうか知らんけど。
162 :
デフォルトの名無しさん :2006/07/04(火) 22:17:01 BE:233717663-
質問です。 オーバーラップI/O で、WriteFile の引数に送りたいデータのポインタを 渡した後、そのデータをすぐに書き換えてしまうのは危険でしょうか? それとも、内部でコピーを取ってくれているものなんでしょうか?
そもそもオーバーラップI/Oは内部でコピーを取る無駄を省くために 存在しているわけで
165 :
デフォルトの名無しさん :2006/07/04(火) 22:44:36 BE:389529465-
ありがとうございます。というか、普通に書かれてましたね。すいませんでした。
ActiveDirectory環境でクライアントが認証を行ったサーバ名を取得したいのだけど どの関数を使うのがいいのかな? NetGetDCNameじゃ、PDCしか取ってこなさそうだし・・・・ これ使うと幸せになれるよってのがありましたら教えてください。
167 :
デフォルトの名無しさん :2006/07/05(水) 11:49:11
test
168 :
デフォルトの名無しさん :2006/07/05(水) 12:14:20
すんません、すれ違い覚悟で質問なんすが、 自分の作ったアプリを一般に公開されたWin Vistaのパブリックベータ版(日本語版 build 5384)で動くか試してみたんです、 殆どは動作したんですが、一部自作のCOMコンポーネントを使ってるアプリが動作せず、調べてみるとコンポーネントの登録に失敗しているようで、 試しに該当COMのDLLを「regserv32 自作コンポーネント.dll」とすると、エラーしてしまい ダイアログで「このアプリケーションのサイドバイサイド構成が正しくないため・・・・」と出力されてしまいました。 Dependency Walkerで欠損ファイルが無い事は確認してるんですが、 Manifestとかそういう問題なんでしょうか、何か情報ありましたらよろしくお願いします。
>>168 欠落エクスポート(利用しているシンボルが無い)とかも無いですか?
FindFirstChangeNotificationでフォルダ内のファイルの変更を監視できますが、変更を行ったアプリケーションがどれか調べる方法ってありますか?
ReadDirectoryChangesW
173 :
172 :2006/07/06(木) 12:51:54
すまん、なんでもない。早漏した。
>>174 UserData目的ならSetPropのほうがいいと思われ
SetPropならHANDLEなんで元からポインタだし
どのみちコンパイラに指示しなきゃ32bitなのでは?
RegisterHotKeyで登録したホットキーを押すと 該当スレッドにWM_HOTKEYが飛びますが、 そのとき現在フォアグラウンドのウインドウに、 ホットキーを押した情報が伝わるようにするには、 どうしたらいいでしょうか。 該当スレッドのWM_HOTKEY処理内でkeybd_eventを発行してみましたが、 上手く行きません。
先ほどMFCスレで質問したのですが、スレ違いだったようなので 続きをこちらで質問させてください。 DLLでWH_CALLWNDPROCをフックしてるのですが g_hHookWnd = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hDll, 0); のように第4引数を0で呼び出してもシステムフックできず、ローカルフックしか出来ません。 何が原因として考えられるでしょうか?
フックプロシージャがEXE内に有る
>>178 フックをセットする関数はDLL外部に開放してEXEから呼んでいますが、
CallWndProc()自体はDLL内に定義しています。
このDLLは全てCで書かれていて正常に動作するソースをそのまま
使っているのですが、MFCのSDIアプリから呼ぶとSDIアプリのメッセージ
しか受け取れないようなんです。
他プロセスにマップされたDLLとのデータ共有とか考慮してないとか。
DDBでアクティブ 非アクティブ 状態を繰り返してると 突然、重くなる。 しかもメモリもどんどん食うしwww これはバグなのか!? DirectXと同じようにデバイスの再構築とか必要なのか エロい人教えて!
184 :
デフォルトの名無しさん :2006/07/07(金) 12:10:43
例えばDOS窓を開いて、 notepad.exe [ENTER] と打ち込むとメモ帳が開きます。 一方、メモ帳のアイコンをダブルクリックしてもメモ帳が開きますが、 質問は、メモ帳さん自身が、自分はDOS窓から起動されたのか、アイコンのダブルクリックで起動されたのか、 あるいは、他のアプリからsystem()とかcreateProcess()などで起動されたのか、 そういう違いを判定することはできますか?
>>184 GetStartupInfo関数だったかな?
186 :
デフォルトの名無しさん :2006/07/07(金) 12:22:05
>185さん ありがとうございます。 早速調べてみます。
>>181 ,
>>183 ありがとうございます。
最初は
>>183 さんのサイトのサンプルを参考に作っていたのですが、
それで上手くいきませんでした。
(オリジナルのキーフックの方は上手く行くのですが)
しかし色々と調べてみて解決したようなので一応ご報告。
DLLでフックしたメッセージを共有メモリに詰め込んで親画面宛てに
ユーザーメッセージを送信していたのですが、SendMessage()する際の
親画面のhWndが共有されてなかった事が原因だったようです。
・・・この辺の根本的な理由はよく判ってないのですが。
SetWindowsHookEx()が返すハンドルを共有化する理由も
よく判らずにサンプルのまま使っていたので気付きませんでした。
この辺の情報がまとまった本をご存知の方がいらっしゃいましたら
ぜひ教えてください。
>>184 Windows系OSの場合、プロセスの起動は最終的に "CreateProcess" APIを利用して
起動されます。
DOS窓からの起動、プログラムアイコンのダブルクリックによるExplorerからの
起動、任意のプログラムからの起動も最終的には "CreateProcess" を呼び出して
起動されますので、起動方法の違いを判定する事は出来ません。
但し、メモ帳の起動を行った親プロセスの確認を行う事は出来ます。
メモ帳の親プロセスの確認を行う事で、DOS窓からの起動かExplorerからの起動
かの確認を行うことが出来ます。
CreateToolhelp32Snapshotでググって見て下さい。
ボタンコントロールを使って、ボタンを押しっぱなしにしているときと離したときで 処理を分けるにはどうすればよいでしょうか? PUSHBUTTONだと押して離したときにWM_COMMANDメッセージが送信されるだけなんです。
>>189 WM_LBUTTONUPとかWM_LBUTTONDOWNとかでは解決できない話?
191 :
デフォルトの名無しさん :2006/07/07(金) 15:51:46
>188さん 詳しい解説ありがとうございました。 早速Googleしているところです。
192 :
デフォルトの名無しさん :2006/07/07(金) 16:28:27
「WindowsタスクマネージャでいうCPUの使用率」のHDD版みたいのを作ってみたいのですが、 ディスクI/Oの現状アクセス状況の取得というのは可能なのでしょうか? もし可能でご存知の方がいましたらご教授ください。
可能です
パフォーマンスメーター用のAPIがあったような気がする WMIだったかな CからWMI呼んでいいなら可能
簡単なペイントソフトを作っているのですが、鉛筆のようなペン(ブラシ?)を 「WM_MOUSEMOVE」で作ってみたいのですが、マウスを早く動かすと振り切られて 点線のようになってしまいます。SetCaptureも試してみたのですがうまくいきません。 MFCではMoveToなどで解決できるみたいですが、APIではどうしたらいいでしょう?
可能ですか、できますか、ありますか、知りませんか、 というような質問に対して詳細な回答をしたばかりに、 出来るかどうかしか聞いてねーのに 何知識ひけらかして余計なこと書いてんのw? などと書かれて、軽い人間不信に陥ることがたまにあります。 質問者はちゃんと自分の無知がばれるリスクをとって、 「〜のやり方がわからないので教えてください」と書きましょう。
>>192 WindowsNT系OSに特化できるのであれば、
パフォーマンスカウンタでググって見て下さい。
>>195 WM_LBUTTONDOWN で現在位置を保存。押してるよフラグを true に。
WM_MOUSEMOVE で、押してるよフラグがtrueなら、
前の位置から新しい位置までMoveTo,LineToで線を引く(新しい位置を現在位置として保存)。
WM_LBUTTONUP で押してるよフラグをfalseに
そんな感じ。いずれにせよ SetCapture/ReleaseCapture は適切に呼ぶ必要がある。
WM_MOUSEMOVE ではどうもイベントが間引かれているんじゃないかという疑いが
ある場合には、タイマーか何かで GetCursorPosを呼んで監視。
200 :
195 :2006/07/07(金) 16:59:45
>>198 >>199 どうもお早い解答ありがとうございます。
MoveToは使えるんですね・・書いたらエラーが出たので他のやり方がある
ものだと思ってました。今度からはもっとちゃんと調べてから質問します。
今は MoveToEx しか無いかもね。もしかすると。
>>196 > 出来るかどうかしか聞いてねーのに
> 何知識ひけらかして余計なこと書いてんのw?
赤の他人の煽りだろ。どこまで神経質なんだよ。
203 :
デフォルトの名無しさん :2006/07/07(金) 17:17:20
便乗質問なのですが、Win32APIからWMIを使うにはどうすればよいのでしょう?
205 :
デフォルトの名無しさん :2006/07/07(金) 17:46:57
>>187 本は知らんけど共有化する理由は、
システムフックの場合、フックプロシージャを持つDLLは各プロセスごとにロードされるから。
単純に変数に入れといても、別のプロセス中のメッセージをフックしたときにはDLLごと別のインスタンスなので
それを考慮して、フックプロシージャ内で必要な情報はプロセスを跨いで有効な方法で持っている必要がある。
207 :
187 :2006/07/07(金) 23:02:13
>>206 つまりDLLからのメッセージを受信するSDIアプリと同じスレッドにいるDLL以外は
hWndが初期化されてないので、DLLが変なハンドルに宛ててSendMessage()してた
ということなんですね。
システムフック掛けただけでDLLのスレッドがどっと増えるというイメージも
まだなんだか良くわからないけど、またこつこつと勉強していきます。
いろいろと教えて頂きありがとうございました。
>>196 そこまで勘ぐらなくてもwww
相手にとって役に立つかどうか知らんけど、
自由気ままに答えればいいんじゃん。
>>192 俺もちょっと知りたかったりする。と思ったらURLマリガトー
>>203 >>205
209 :
189 :2006/07/08(土) 02:09:52
>>190 WM_LBUTTONDOWNはボタンコントロールを押している間は発行されないみたいなんです。
たくさんのボタンで押しっぱなしと離した場合を分けたいので、適当なところでクリック、
ではダメなんです。
フィルタドライバでも作って入力を横取りしろ
横取り40萬
>>209 WH_KEYBOARDをフックしてlParamを調べると幸せかも
>>209 ごめん間違えたw
マウスじゃフックしてもだめだな、
自分で何クリックしたか覚えとけば良いんじゃ?
216 :
デフォルトの名無しさん :2006/07/08(土) 12:25:17
DeleteUrlCacheEntryの使い方を教えてくらはい
教えてください。 hEditBox = CreateWindow( TEXT("EDIT"), TEXT(""), WS_DLGFRAME | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_LEFT, 170, 50, 500, 25, hWnd, (HMENU)EDIT_ID, ((LPCREATESTRUCT)(lParam))->hInstance, NULL ); /* 実行ボタン作成 */ hActBtn = CreateWindow( TEXT("BUTTOn"), TEXT("実行"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP, 170, 100, 50, 30, hWnd, (HMENU)ACT_ID, ((LPCREATESTRUCT)(lParam))->hInstance, NULL ); この二つのコントロールを作成したときTABキーでフォーカスを移動できるようにしたいんですが、 WS_TABSTOPを指定してもうまくTABキーでフォーカスが移動してくれません。 WMでキー情報取得してそれがTABキーならフォーカス移動でもいいんですが、それは何か面白くないので なんとかならないでしょうか?
>>216 そこまでわかってたらぐぐってソースコピペすれば動くと思う。
mouse_event()でクリックイベント送ってもボタンが反応してくれない。 なぜかドラッグになったりして・・・ かと言ってペイントブラシ上でお絵かきさせても飛び飛びになる。 思い切り間隔開けると(100msくらい)ボタンにも反応するけど、 もちっと早くならんかな。
実際のマウスで発生するマウスイベントの真似をする。
コテハン忘れた・・
>>219 ダイアログにはしてないんだよ。
とりあえずコードはこんな感じに
処理はコールバックのCREATEのCreateWindowを何とか変更してTABで移動できるようにしたいんだけど できねぇ
225 :
189 :2006/07/08(土) 14:02:03
>>211-
>>212 >>214-
>>215 サブクラス化でできました!!
ありがとうございましたぁ!! 。゜(゜´∀`゜)゜。
228 :
46 :2006/07/08(土) 19:46:16
みなさんちゃんと見てくれて有り難うございます!
sub1〜ですが、いい名前が思いつかないのです。捨てルーチンなのでいいんじゃないか、と思ったのですが・・・
>>48 ・・・AddRef()/Release()、間抜けでした・・・ハズカシ・・・
修正しました。今度は大丈夫かと・・・↓
WBC002.LZH:SDKレベルでWebBrowserコントロールを使用して簡易ブラウザを作るサンプル(C++)
>>50 >
http://www.adp-gmbh.ch/win/misc/mshtml/HTMLWindow.html やっぱりありますか・・・どっかにはあるだろうとは思ってましたが・・・これが見つけられていれば・・・
・・・オレの費やした2週間って・・・OrZ
タブ巡回ですが、自作コントロールではSetWindowLong()で直接WS_EX_CONTROLPARENTに設定し、IsDialogMessage(g_hWndMain)する事でできました。
(でも窓APIをじかに使うのが正しいのかどうかわからない・・・)
が、WebBrowserはやっぱりできない・・・WebBrowserの場合はそもそも各HTML要素はウィンドウではないのでSetFocus()することさえできない・・・
・・・今度はActiveXコントロールをSDKレベルで作ってみようかと思ったんだけど、やっぱりどっかにありますよね・・・OrZ
非アクティブ時でも実行を続けるようにしたいんですが…
そうですか
ウィンドウのサイズを変更できないようにするにはどうすれば良いでしょうか??
できた。簡単だった。
233 :
220 :2006/07/08(土) 23:49:30
なんか変だと思ったら・・・ 間違ってWM_LBUTTONDOWNとか送ってたよ、テヘッ (*´∀`*)
>>228 WM_KEYFIRST 〜 WM_KEYLASTに対して
IOleInPlaceActiveObject::TranslateAccelerator()
IOleInPlaceActiveObjectはWebBrowser2からQueryInterface。
これで、TABキーとかその他のキーボードショートカット使えるはず。
私が昔作った時はこれでいけた。
>>234 に補足
メッセージループの中で、TranslateAcceleratorでS_OKが返って来たら
アクセラレータが変換されたということなので、
それ以降のTranslateMessageやDispatchMessageは実行してはいけない。
236 :
228 :2006/07/09(日) 10:02:02
WindowsXPでVC++.NET2003使用 BGMにMIDIを使いたいんですが ・リソースから読み込み ・ループ再生 ・非ループで1曲演奏し、それの終了を知りたい などはどうすれば良いのでしょうか。
MDIはやめとけ
>>237 一番上はIGraphBuilderで簡単なの書いたことしかないから知らん。
残りはDirectShowのIMediaEventで可能。
MCI?
回答ありがとうございます。 DirectShowの使い方がいまいちよくわからず、 何とか再生することはできたのですが ただ再生するだけならMCIの方が簡単かな、と思いました。 何か相違点などあるのでしょうか
MCIは簡単な分、細かい操作が苦手だったかと 細かく制御したいなら midiOut〜系関数を使うとか
API で MIDI 扱ったら、CPU 負荷が大きくなると途端に遅延しまくって困った。 ので DirectX お勧め。
CPU負荷が大きくなればDirectXでも遅延しそうだが・・・ 内部で何かやってるんだろうか ひょっとして別スレッド作って再生してなかったとか?
Windowsアプリケーションのサイズ変更のしくみってどうなってるんですか どこかでウィンドウの大きさのリージョンを毎回セットしなおしてるんでしょうか それとも長方形ブラシかなんかで領域を塗ってマウスの左クリックが離れたら その大きさをリージョンにセットしてるんでしょうか 今タイトルバーやウィンドウやメニューのインターフェースを自前で作ろうとしてて ビットマップから不定形のウィンドウを作成したまではいいんですが、 不定形のウィンドウのサイズを変更しようと思ってもどうやっていいかさっぱりです。
WM_NCHITTEST使って不定形ウィンドウの淵をWindowsにサイズ変更枠と認識させて、 WM_SIZEきたらリージョン再作成かな。 でも、リージョン再作成の処理によっては激しく重いかもしらん。
247 :
231 :2006/07/11(火) 00:22:53
解決しました。
248 :
デフォルトの名無しさん :2006/07/11(火) 10:16:07
今作っているアプリAで、ライセンス有無の判定をするために、 GetVolumeInformation()を使ってディスクのボリュームのシリアル番号を確認する方法を採用しました。 問題なく動いていたのですが、 そのアプリを他の二つのアプリ(BとC)から、数秒にに一回くらいの割合で、CreateProcess()使って 数百回呼び出したところ、そのうち数回くらい、GetVolumeInformation()がエラーしました。 こんな感じです。 アプリC → アプリB →アプリA (GetVolumeInformationエラーした) 実は、それは特定のパソコンで3回だけ連続して発生し、今は起こらなくなってしまったのです。 でも確かにエラーしたのを確認しましたし、自然に治るのも気持ち悪いので、どこかに何か問題が あるように思うんですが、皆さん何か心当たりとかありませんでしょうか? よろしく。
よくわからんけどエラーしたの内容を具体的に書いた方がいい
250 :
デフォルトの名無しさん :2006/07/11(火) 10:27:29
>249 ありがとうございます。 具体的には、GetVolumeInformation()がエラーを意味する0を返しました。 それしか分かっていません。
GetLastErrorしなかった自分を呪え
VS2003.NET VC++ MFC未使用です 任意のアプリケーションが起動したことを知るにはどうしたらよいでしょうか? あるアプリを起動させておき、ターゲットアプリが起動したらアクションを起こしたいのですが。。 よろしくお願いいたします。
言葉足らずですみません ターゲットアプリが起動していなければ待機し、 起動したらフックをかけるアプリを作成したいのです。 まだフックについて勉強不足ですが、それもフックで可能なのでしょうか?
有効なファイル名(ファイル名として使える文字で構成されている)かどうかをチェックするAPIってあったっけ?
257 :
254 :2006/07/11(火) 13:53:21
>>256 ヒントいただけないでしょうか・・・?
ターゲットアプリが起動していない状態でフックをかけるということでしょうか?
起動していないとできないと思ったのですが。。。
プロセス監視はだめぽ?
フックって言ってもいろいろあるだろ、何のフックか書いてくれんとわからんぞ。
船長に決まってるじゃないか!!
赤いモサモサの事だろ
262 :
254 :2006/07/11(火) 15:10:14
失礼しました フックはWH_CALLWNDPROCです
264 :
254 :2006/07/11(火) 17:00:41
WH_CBTを使ってやって見たいと思います。 ありがとうございました
265 :
254 :2006/07/11(火) 17:39:57
連投すみません。 起動したウィンドウがターゲットプログラムのときにTSK_CREATEを 作成アプリに通知し、作成アプリ側で受け取って操作できるようにしました。 WH_CBTフックのプロシージャ LRESULT CALLBACK MySysHookWndProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HCBT_CREATEWND){ CBT_CREATEWND *pcw = (CBT_CREATEWND *)lParam; if(pcw->lpcs->lpszClass == TARGET_CLASS_NAME){ SendMessage(g_hCallExe, TSK_CREATE, 0, 0); } return 0; } return CallNextHookEx(g_hSysHook, nCode, wParam, lParam); //次のフックを呼ぶ } アプリ側 switch(msg){ case TSK_CREATE: MessageBox(hWnd, "起動しました", "", MB_OK); break; } しかし、これで実行するとターゲットプログラムの起動前にメッセージボックスの発生が 無限ループになり、作成アプリを強制終了しないとターゲットプログラムが起動しませんでした。 TSK_CREATEを一回だけ通知し、ターゲットプログラムを起動するにはどうしたらよいのでしょうか? よろしくお願いします。
>>265 WH_CBTフック
Windowsは、 次に示す処理を行う前に、 WH_CBTフック プロシージャを呼び出す。
・ウィンドウのアクティブ化、 作成、 破棄、 最大化、 アイコン化、 移動、 サイズ変更
・システム メッセージ キューからのマウス イベントやキーボード イベントの削除
・入力フォーカスの設定
・システム メッセージ キューの同期化
あなたのコーディングでは、無限ループになります。
TSK_CREATEをキャッチして "MessageBox" を呼び出す。
その "MessageBox" のアクティブ化をキャッチして "TSK_CREATE" を発行。
TSK_CREATEをキャッチして "MessageBox" を呼び出す。
よって、"MessageBox" では無く、自前で簡単なロギングウィンドウを作成し
そのウィンドウに処理状況を出力する。
266の追加 ロギングウィンドウは事前に作成しておく。
268 :
254 :2006/07/11(火) 20:52:26
>>266 レスありがとうございます。
if(nCode == HCBT_CREATEWND)
で、ウィンドウの作成に限定し
if(pcw->lpcs->lpszClass == TARGET_CLASS_NAME)
で、作成されたプロセスのクラスが起動を確認したいアプリのクラスと同じか確認して
TSK_CREATEの発行をターゲットアプリが起動したときに限定しているつもりだったのですが、
これでもMessageBoxのアクティブ化時にTSK_CREATEが発行されるのでしょうか?
>if(pcw->lpcs->lpszClass == TARGET_CLASS_NAME) はlstrcmp()使わなくて良いのか?
こんばんは。 趣味でWebカメラのプログラミングを始めました。 現在傍らにある本は「ロボットの目をつくる」というトランジスタ技術の増刊号です。 この本でパン、チルト機能がついたQCamOrbitというWebカメラのプログラムが公開されており、それに挑戦していま す。 それを参考にVisualCとOpenCVでカメラから画像を取得して処理をするところまでは出来ました。 しかしカメラを動かすところについては「あとは出来るでしょ」といった感じで省略されていました。 残念ながらボクの力では動かすことは出来ませんでした。 一週間ほど検索していましたが、とっかかりすら掴めない有様です。 最後の砦だとここにすがりつきに参りました。 どうかヒントだけでも、宜しくお願いします。 雑誌にはドライバに機能が用意されている、という記述がありました。 今はドライバが入っているCDを中心にあたっています。 目的 Webカメラをパン、チルトさせたい 環境 Windows2000 VisualC++ 6.0 QcamOrbit
273 :
271 :2006/07/11(火) 21:32:35
>>272 すばやい返信ありがとうございます。
しかし、残念ながらこのプログラムは私の環境では動かなかったのです。
具体的にはDevice番号が(本来は自動取得のはずなのに)取得できませんでした。
動かなくても、このソースを解読して知識を深めるべきでしょうか?
274 :
271 :2006/07/11(火) 21:39:04
さらに、言い訳なのですが、 このプロジェクトにはioctl2.hというヘッダファイルが入っておらず、 自分のPCではコンパイルできませんでした。 これらの話も最初の質問時にすべきでした、もうしわけありません。
ドライバはUSBに機器をつないだ状態でインストールする必要があるような気がします。 ドライバがちゃんとインストールされていなければ、それほど参考にならないかもしれません。 (デバイスドライバをCreateFileで開いてDeviceIoControlで制御、という流れは参考になるかもしれませんが) 雑誌にドライバが付いてきているなら、そちらに戻ってみるのが良いと思います。
>>274 ioctl2.h の内容は、vbの方を読むとこんなところでしょう。
#define IOCTL_BULKUSB_VENDORREQUEST_OUT 0x220014
#define CTL_DEVICE_NAME_ASCII "\\\\.\\filtCtlp"
#define URB_FUNCTION_VENDOR_DEVICE 0x17
typedef struct _PARAM_VENDOR_REQUEST
{
DWORD Function;
DWORD TransferFlags;
BYTE ReservedBits;
BYTE Request;
DWORD Value;
DWORD Index;
BYTE Dummy[2];
} PARAM_VENDOR_REQUEST;
#define MAX_BUFSIZE_BULK (1024 + 100)
typedef _PARAM_VENDOR_REQUEST_WRITE
{
DWORD Function;
DWORD TransferFlags;
BYTE ReservedBits;
BYTE Request;
DWORD Value;
DWORD Index;
BYTE Dummy[2];
BYTE buf[MAX_BUFSIZE_BULK];
} PARAM_VENDOR_REQUEST_WRITE;
277 :
271 :2006/07/11(火) 22:09:12
>>275 う〜ん、一応カメラは繋いだ状態でインストールしたつもりなのですが。
なにか不備があったかのも知れません。
しかし流れは参考になるかも知れませんが、という一文だけでもずいぶん参考になります。
すこし読む気がでてきました、ありがとうございます。
>>276 ありがとうございます。
なんとなく読んで内容を書けてしまうなんて凄いですね。
ちなみに無謀にも何も考えずこぴぺして実行したところエラーが出てしまいました。
(構文エラーが1,2個あるといった程度な気もしますが)
参考にさせてもらいます。
手取り足取り教えて君なので釣りかと思ったが まあがんがれ ただ微妙にスレ違いな話題なので他の場所に 移動した方がよい鴨試練
279 :
デフォルトの名無しさん :2006/07/12(水) 11:22:35
諸先輩方、宜しくお願いします。 IMEの状態(漢字モードON又は漢字モードOFF)を 取得する方法を教えて下さい。
281 :
279 ◆lnkYxlAbaw :2006/07/12(水) 11:54:39
「表7-5:新しいIME API」 いっぱいあるね、どりですか?
283 :
279 ◆lnkYxlAbaw :2006/07/12(水) 12:43:00
284 :
254 :2006/07/12(水) 14:01:48
>>269 >>270 if(nCode == HCBT_CREATEWND)
{
CBT_CREATEWND *pcw = (CBT_CREATEWND *)lParam;
GetAtomName(LOWORD(pcw->lpcs->lpszClass), szBuf, 10);
if(!(strcmp(szBuf, "ClassName")))
{
PostMessage(g_hCallExe, TSK_CREATE, wParam, 0);
return 0;
}
}
とすることで望みどおりの動作をさせることができました
ありがとうございました
285 :
デフォルトの名無しさん :2006/07/12(水) 15:34:54
286 :
285 :2006/07/12(水) 15:53:48
すいません、補足です・・・ ・フォームはTopMost=trueにしております。 ・"ビデオミキシンクレンダを使う"のチェックを外しても、ちらつきが無くなるようです。
>>286 どうにもならないので Vista を待ってください。
288 :
デフォルトの名無しさん :2006/07/12(水) 18:47:55
こんにちは。 BMP画像を表示させるアプリケーションを作っています。 Borland C++ Compiler 5.5 でコンパイルしたところ、 リソースファイルで指定したビットマップのファイルが1Mを越えたあたりで コンパイルエラーで実行ファイルが作成できません。 指定ファイルの上限などあるのでしょうか。 初心者で、説明がわかりにくいところもあるかと思います。 どうぞよろしくおねがいいたします。
(´-`).oO(エラーの内容をなんで書かないんだろう…
ようやく復旧したか
>>288 自分の最高は768kbだが、そこまでは大丈夫だろう。
292 :
288 :2006/07/12(水) 21:30:00
288です。 どうもすみません。 BCC32 -W test.c は問題ありません。 そのあと BRC32 test をすると 「 Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland 」 とコマンドプロンプトに表示された後、 「問題が発生したため、Turbo Incremental Linker を終了します。 ご不便をおかけして申し訳ありません。」 という画面がでてきます。(エラー報告を送信する・送信しないというボタンのある画面です) 送信しないをクリックするとコマンドプロンプトの画面に戻り 「** error 1 ** deleting kaw70.exe d:\docs\mydoc\cfile> 」 とコマンドプロンプトに表示されます。 つづく
293 :
288 :2006/07/12(水) 21:30:34
292のつづき test.rc の中身 /// Oth1 BITMAP "4.bmp" Oth2 BITMAP "5.bmp" Oth3 BITMAP "6.bmp" Oth4 BITMAP "7.bmp" Aug BITMAP "8.bmp" Sep BITMAP "9.bmp" Oct BITMAP "10.bmp" Nov BITMAP "11.bmp" Dec BITMAP "12.bmp" /// ↑だとエラー /// Oth3 BITMAP "6.bmp" Oth4 BITMAP "7.bmp" Aug BITMAP "8.bmp" Sep BITMAP "9.bmp" Oct BITMAP "10.bmp" Nov BITMAP "11.bmp" Dec BITMAP "12.bmp" /// ↑だとエラーは出ず、test.exeが作成されます。 というながれです。 ながくてすみませんが、よろしくおねがいします。
>>292 それリンカが異常終了してんじゃん?
このスレでわかる人がいればいいけど。
・環境依存の話なのでBCCのスレで聞く
・リンカのバグフィックスされたバージョンを使う
ことをおすすめする。
296 :
288 :2006/07/12(水) 22:38:28
アドバイス、ありがとうございます。 BCCのスレで質問してみます。
297 :
285 :2006/07/12(水) 22:54:12
>>287 レスありがとうございます。
OSの問題という事でしょうか。。
微妙に話変わりますが、SetLayeredWindowAttributesでフォーム切り抜きをしてもちらつくんですね。
LayeredWindowはこういう仕様なのかな・・・。
あるアプリでは、画像をある色で透過させてちらつき皆無で画面に表示させていましたが、
SetWindowRgnでやってたんですかね?
PCやグラフィックカードの仕様も書かずによくそんな質問が出来るな
299 :
285 :2006/07/12(水) 23:33:05
>>298 仕様とは私のPCのスペックの事でしょうか?
そうとなると、環境依存の現象という事ですか?
エクスプローラのリストビューにはソート順を表す▲や▼マークが表示されますが これはコモンコントロールとしてサポートされてる機能でしょうか? もしそうであれば、どういう手順で表示するのでしょう?
SPY使ってみた?
メモ帳を起動して自動的にファイルを読み込むプログラムを作っていて、 ファイルを開くダイアログボックスを出すところまでは出来ているんですが、 ダイアログボックスのハンドルの取得の仕方が分かりません。 検索してもなかなか分からなかったので、 どうかお教え下さい。
notepad.exe file_name
305 :
デフォルトの名無しさん :2006/07/13(木) 12:50:43
日本語でおk?
306 :
デフォルトの名無しさん :2006/07/13(木) 12:52:41
>>303 メモ帳だったら、コマンドラインでいけなくない?
>>303 このスレ的に回答すると ShellExecute() って所か?
どちらにしろ、やり方が間違ってると思われ。
>>306 将来的にアプリケーションを自動的に操作したい思っていまして、
これはあくまで練習用です。説明が足りなかったですね…
もう少し詳しく言うとCreateProcess()で起動させたプロセスに、
SendMessage()などを使用してメッセージを投げるというような形で、
処理を実現させようと考えているのですが、
まぁ要はダイアログのハンドルを取得するAPIはあるのかなと。
逆の場合だったらGetParent()を使うみたいですが。
EnumChildWindowsとかで探すとか?
>>307 どの辺りが間違っているのか、詳しくお聞かせ願えないでしょうか?
細かい部分の処理なのか、それとも自動化のアプローチ自体なのか。
>>309 その方法で解決出来るような気がしてきました。
皆様どうもありがとうございました。
糞ソフトがまた一つ増えました
ユーザにファイルを選ばせたいのならダイアログが 表示された時点で成功なんじゃ?
>>313 いや、だからダイアログ操作するとかは練習用なんでしょ?
実際は別のことをやりたいんじゃね?
316 :
デフォルトの名無しさん :2006/07/14(金) 01:48:34
win32APIを説明したサイトを見ると、関数の仮引数の名前を省略している場合があります。 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PTSTR pszCmdLine, nCmdLine) ↓ int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) VC ExpressのIDE上でコンパイルしたところ、確かにコンパイルが通ります。 しかし、まったく同じソースを、コマンドライン(cl.exe)でコンパイルしたところ、 エラーになってしまいます。以下がログメッセージです。 >error C2055: 型リストではなく、仮パラメータ リストが必要です。 これは何が原因なんでしょうか?
WinMainはAPIなのか……。 引数の名前を省略できるのは言語仕様だからスレ違いだと思うが。
質問です。 SYSTEMTIME構造体に入っている時刻をn分進めたり、戻したり、また、n日進めたり、戻したりするAPIはありますでしょうか? ない場合、何か利用できるものはありませんでしょうか?C++のライブラリ(MFCとか)とかでもかまいません。 使用環境はVS2003です。
SHBrowseForFolderのBIF_NEWDIALOGSTYLEを使ってできるダイアログの 新しいフォルダを作成ボタンにIDOK,IDCANCELみたいなコントロールの識別子割り当てられてますか?
>>318 MSDN嫁。
SYSTEMTIME構造体のメンバを使って時間を足し引きするのはお勧めしないと書いてある。
・SYSTEMTIMEをFILETIMEに変換する(SystemTimeToFileTime()を使う)
・FILETIMEをULARGE_INTEGERにコピーする
FILETIMEを直接足し引きするのもお勧めできない。X86だと問題なく動くだろうけど。
・ULARGE_INTEGERを使って、時間の足し引きをする(単位は100ナノ秒)
・ULARGE_INTEGERをFILETIMEにコピーする
・FileTimeToSystemTime()で、SYSTEMTIMEに直す
321 :
318 :2006/07/14(金) 08:31:44
>>320 レス、ありがd。
↓こんな感じでいいのでしょうか?
SYSTEMTIME stime; FILETIME ftime; ULARGE_INTEGER ulint;
GetLocalTime(&stime);
SystemTimeToFileTime(&stime, &ftime);
ulint = ftime; // or ulint.LowPart = ftime.dwLowDateTime; ulint.HighPart = ftime.dwHighDateTime;
ulint.QuadPart += 10 * 1000 * 60 * 20; //20分進める。
ftime = ulint; // or ftime.dwLowDateTime = ulint.LowPart; ftime.dwHighDateTime = ulint.HighPart;
FileTimeToSystemTime(&ftime, &stime);
> MSDN嫁。
失礼。かなり読んだのですが、ここまでたどり着けませんですた。
> SYSTEMTIME構造体のメンバを使って時間を足し引きするのはお勧めしないと書いてある。
お薦めしない理由を知ってたら、だれか解説キボン。
そういう計算は考慮してないんだろう
コマンドプロンプトから起動したとき、 1) 起動時に/wオプションをつけた場合はウィンドウ表示 2) つけなかった場合は、起動したコマンドプロンプトを対象にcin/coutで入出力 ということをしたいのですが、方法がわかりません。 ウィンドウアプリとして作成し、AllocConsole() APIを使用した場合、 新たにコンソールウィンドウが生成されてしまいます。 また、リダイレクトでの入力(cinでの入力)が使えません。 作成しているプログラムをprog.exeとすると、例えば C:\> dir | prog.exe /w ↑このようにしたとき、dirの標準出力をprog.exeで読みつつウィンドウ表示もしたい。 C:\> prog.exe Sample Program v1.0...... ... ↑このように/wなしのときは通常のコンソールアプリのように実行してほしい。
>>321 FILETIMEは以前memcmpで比較しようとして正しい結果が得られないで何故か悩んだ結果、宣言が下位、上位の順で並んでるからという結論に至った。
実際は、桁あふれ等を考慮しつつ自分で書かなきゃいけなくて場合分けがめんどくさいからお薦めしないだけ、もしくは仕様変えても文句いうなよ、っていう脅しだと思う。
328 :
318 :2006/07/14(金) 15:21:44
>>316 C++では仮引数名を省略でき、Cではできない。
VC++のIDEでプロジェクトを作るとデフォルトでは拡張子cのファイルも
C++としてコンパイルするようオプションが指定されている、/TPか何か。
>>321 >>324 320の書き方からしてアラインメントの問題だろう。
330 :
デフォルトの名無しさん :2006/07/14(金) 18:56:40
Wininet.DLL を使用してftpサーバ(telnetも使用可)からファイル情報を取得したいのですが、 FtpFindFirstFile,FtpFindNextFile関数ではファイル名・サイズ・最終更新日などしか取得できません。 他に、パーミッション・オーナー名・グループ名などの情報も取得したいのですが、 どのようにしたら良いのでしょうか? 言語はVB6です。よろしくお願い致します。
接続先のファイルシステムに、そういうものがあるとは限らないわけだが。
332 :
デフォルトの名無しさん :2006/07/14(金) 19:33:16
>>331 サーバはUNIX(AIXだったかな?)のみです
ls -al コマンドで表示される情報が取得できれば良いのですが...
そういう馬鹿でも使える系のapiはそういうものだとわりきって使ってください。
いまさらftpなんてつかうなよ
335 :
デフォルトの名無しさん :2006/07/14(金) 22:18:26
今はftpの代わりに何を使うの?
今でもftpはメジャーなので心配するな
sftpに決まってるじゃん
^~
陰毛落としていくなよ
クラス名かウインドウハンドルから、サブクラス化される前のオリジナルの WindowProcを取得する方法ってないですか?
既にサブクラス済みのウィンドウから、サブクラス前のWndProcを取るって事? だったら無理だと思う。
GetClassLongPtrで大元のウィンドウプロシージャを取得することはできると思う。 ただ2重3重にサブクラス化されていたら341はどうしたいのかが問題だ。
345 :
デフォルトの名無しさん :2006/07/15(土) 17:45:17
pu
ge
t Sound
一応できました。タブ巡回。
WBC003.LZH:SDKレベルでWebBrowserコントロールを使用して簡易ブラウザを作るサンプル(C++)
http://winscript.s41.xrea.com/upload/source/No_0019.lzh ですがこれが完全に正しいやり方なのか確信が持てません。みなさんはどう思われますか? 窓API的におかしい所ないでしょうか? (でも結局自作コントロールでは通用せず・・・)
g_pOleInPlaceActiveObject->OnFrameWindowActivate(TRUE);
g_pOleInPlaceActiveObject->OnDocWindowActivate(TRUE);
for(;;)
{
if (!IsWindow(g_hWndMain))
{
break;
}
GetMessageA(&msg, NULL, 0, 0);
hr = g_pOleInPlaceActiveObject->TranslateAccelerator(&msg);
if (hr == S_OK)
{
DispatchMessageA(&msg);
}
else if (hr == S_FALSE)
{
if (!IsDialogMessageA(g_hWndMain, &msg))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
}
なお、IsWindow()でループ脱出するのは気にしないでください(^^;)DefWindowProc使ってるのでこうなるのです。
ここはGetMessage()==FALSEで判断されているのだと思って下さい(^^;;;)いずれウィンドウプロシージャは設置するつもりです。
で、OnFrameWindowActivate/OnDocWindowActivate()は、本当はウィンドウプロシージャのWM_ACTIVATE中で呼び出し、ステートに応じてTRUE/FALSEするのが正しいと思うのですが、なぜこれをコントロールに通知しなければならないのでしょうか?
例えばアニメーションを表示するコントロールとかで非アクティブになった時にアニメを停止するとか?
質問! w2kで/dev/randomのようなPRNG(疑似乱数生成器)は利用できますか?
>>350 マジd
CryptGenRandom()発見!
質問です。 WindowsSocketに使われてる関数 たとえば、connect()関数の中に const struct sockaddr FAR * name だとか const char FAR * aptval と書いてあるのですが、 FAR* って何の意味があるのでしょうか? 定義を調べてみたところ #define FAR far #define far と書いてありました。特に意味がないように感じるのですが、なぜ付いているのでしょうか?
Win16時代の名残
昔はfarとかhugeとかセグメントとか64kの壁とか色々大変だった
vc使ってデスクトップ転送ソフト作ってるんですけど、 ビットマップのまま転送すると重たいので、 jpegなど、何らかの形で圧縮して転送しようと思います。 色々検索してるのですが、以下の条件にあうやり方が見つからなくて困ってます。 何かよい方法ありませんか? 1."できるだけ"windows標準のライブラリだけで作りたい。 (dll置くだけインストールできるようなライブラリなら使っても良いかもです) 2.メモリ上で圧縮、展開を行いたい。ハードディスクは仲介したくない。
356 :
デフォルトの名無しさん :2006/07/16(日) 23:15:02
age
>>355 Windowsつってもバージョンで相当変わるわけだが。
Gdiplus使っていいならpngでもjpgでも何でもどうぞ。
358 :
デフォルトの名無しさん :2006/07/17(月) 00:12:25
>>357 レスどうもです。
Gdiplusってwindows2000にインストールできましたっけ?
できれば、XPと2000で動かしたいんで。
>>358 インストールは出来るけどデフォでは付いてない。
再配布版gdiplus.dllを添付すれば2kもXPもOKな筈。
>>359 ありがとうございます。
ちょっとやってみます。
キャプチャボードからの映像信号を表示するソフトの映像部の色を GetPixel()関数で取得したいと思ったのですが、できませんでした。 調べてみると、どうも映像がビデオレンダラーというハンドル(?)に関連していることが 原因のようです。 どうすればイイでしょうか?
おれもそれ知りたいかな。 ビデオカードか何かのオーバーレイ機能だよな。多分。
それは、GetPixel()でのみ失敗するかね? それとも他の関数でも失敗するかね?
>>361 オーバーレイ表示になってると思うからGetPixelじゃ無理だとおもう。
DirectShowのインタフェース取れるならISampleGrabberインタフェースで画像は取れるみたいだけど他のアプリだと‥‥
「USBが入力された時」をどうすればフックできますか? WM_の中に有るかも、だけどWM_多すぎorz
>>365 意味がわからない。「USBデバイスが接続された時」?
そうです。色々検索してみたけど全く出てこなかった。 検索語句が悪いのかな。 USBが接続された時、タスクバーの所に「○○が接続されました」みたいな メッセージが出ますよね。だからAPIか何かで そのタイミングを捕まえることができないのかなと。
WDM
WM_DEVICECHANGE
370 :
361 :2006/07/17(月) 15:28:31
どうでもいいかもしれないけど、 動画なんかでPrintScreenキーが使えないという話も、結局根は同じなんだろうな。
374 :
デフォルトの名無しさん :2006/07/17(月) 23:12:27
メニューのオーナードローについて教えてください。 プログラムはほぼ出来たのですが、一点不可解なことが残っています。 サブメニューを持った項目の右横にある小さい三角のマークが、 Windows側で描画されているようです。それはいいのですが、 サブメニューをGRAYED状態にしてもマークがマウスの移動を 感知して白黒反転してしまいます。 オーナードローをしなければサブメニュー項目をGRAYEDに すると、三角マークもグレーに固定されます。 オーナードローを使ったときに、サブメニューを持った項目 のGRAYED状態を3角マークにも反映させる方法を教えてください。 ご存知の方、よろしくお願い致します。
ウェブ上のMSDNのAPIリファレンスってどうやって見るの?前は見れたのに
サーバエラーってなるんだけど
378 :
仕様書無しさん :2006/07/18(火) 04:44:24
CImageに設定されている画像(PNG)を、 ネットワークで他のマシンに転送して表示させたいのですが、 CImageに設定されている生データ(PNG形式)を取得、設定する方法を msdnで見つけられなくて困っています。 誰かご存知ないでしょうか?
>>379 馬鹿な俺に教えてくだされ
どう巡ったらツリービューからAPIリファレンスに辿り着くの?
383 :
デフォルトの名無しさん :2006/07/18(火) 23:08:02
IMEを叩いて文字入力をしてるのですが IME2000では全く問題なかったのにIME2003にしたら TranslateMessageでエラーが発生するようになってしまいました 状況は日本語入力モードでひらがなを入力し、 変換キーをおして漢字変換しようとすると メモリ読み込みのアクセス違反エラーが発生します 変換キーを押すだけだと問題ないです エラー時のMessageの内容 message = 256 = WM_KEYFIRST wParam = 229 = VK_PROCESSKEY lParam = 7929857 = ? 解決法を知ってる方、お願いします
>>381-382 すまなんだ
An error occurred on the server when processing the URL.
と出るのは俺のパソの環境が悪いのかな?
な、なるほど
387 :
デフォルトの名無しさん :2006/07/19(水) 11:44:22
WindowsXPのC++にて「MoveFile」関数を使用しています 通常時は上手くいくのですが偶にリターン値が正常なのにも関わらず move元ファイルが削除されておらず且つ、move先ファイルのファイルが ロックされたままとなる場合があります ネットワーク越しのmovefileなので動作が不安定っぽいのですが movefileExのMOVEFILE_COPY_ALLOWEDとMOVEFILE_WRITE_THROUGHで 解決できるのでしょうか? みなさんはネットワーク越しのファイル移動はどうやってます?
このスレが妥当かどうかわからんが、regmonやfilemonその他 Windows関連の役立ち情報を公開してるsysinternalsを運営してる winternals が MS に買収されちまったyo!!
スレ違い 失せろ
>>388 そうなんや。いいのか悪いのかよくわからんニュースやな。
とりあえず systeniternals は全て保存しとくべきだな。
>>388 sysinternalsサイトで公開されている各フリーソフトは十分に役立つ
ソフトが多いのだが。
今後も同じ様な形で運営が行われるのだろうか?。
公開が中止されたら非常に残念なことだと思う。
世界中のヤツラが同じこと考えてるらしく、sysinternals のサイト劇重・・・ DbgView だけでも落としておきたい。
とりあえずFirefoxのScrapbookでサイトごと落としとくかな。
>>388 そりゃ大変だ。
と思ってsysinternalsのサイトを見ようとしたら、めちゃくちゃ重い。
>>392 MSが公開していない、
あるいは、OSのバージョン毎に実装を変える可能性があるので、公開すべきでないと考えている、
情報がかなりあるので、もしそうなったら残念だな。
一応ブログでは、サイトは今まで通りだし、ツールもフリーなままとは言っているけど……。
windef.hに以下のコメント、コードがありました // Win32 defines _WIN32 automatically, // but Macintosh doesn't, so if we are using // Win32 Functions, we must do it here #ifdef _MAC #ifndef _WIN32 #define _WIN32 #endif #endif //_MAC なんでマックに関する定義があるんですか? win32apiってマックと何か互換性でもあるのですか?
MACaddress
MSはMacのソフトも開発してるから。
NT4.0までPowerPCとかサポートしてたんだっけ
Mac版のIEもあるし別に不思議なことじゃないと思うが…
MSにはMac部がある。
マ・クベか
2ちゃんねるのトップページ、あの壺はいいものだ!
そしてMac部長がいるのね
APIの質問ではないのですが
ここなら詳しい方もおられると思いますので
質問させてください。
VC8のリンクの過程で
> xxx.obj : error LNK2001: 外部シンボル ""public: virtual void * __thiscall name::type<char>::`scalar deleting destructor'(unsigned int)" (??_G?$type@D@name@@UAEPAXI@Z)" は未解決です。
> xxx.obj : error LNK2001: 外部シンボル ""public: virtual void * __thiscall name::type<char>::`vector deleting destructor'(unsigned int)" (??_E?$type@D@name@@UAEPAXI@Z)" は未解決です。
のように出力されリンクできません。
http://www.thescripts.com/forum/thread263644.html によるとVCが勝手に作るヘルパーらしいのですが
解決方法がよく解りません。
MFCやATL等は使用していません。
ご教授お願いします。
スルーされますように
誘導希望
VC++スレ探せ
コンベンショナルモミモミ
ifで「COLORREF型同士が一致する場合」って どうすればいいですか? clr == GetPixel(hMChar , i , ib)じゃ駄目みたいなんですが
あ。やっぱいいです。ごめんなさい
(^ω^#)ビキビキ
>>414 許してください。悪気はなかったんです!
416 :
407 :2006/07/20(木) 23:31:06
すいません自己解決しました。 質問、VCで抽出したのですが 見つからなかったのでここで お願いしました。 スレ違い失礼しました。
417 :
デフォルトの名無しさん :2006/07/21(金) 11:35:05
rubyでCD−ROMのトレイを開けるコード書いて
mciSendString("set cdaudio door open",buf,buflen,NULL)
419 :
デフォルトの名無しさん :2006/07/21(金) 13:37:51
うちでは開いた
くぱぁって開いた
ひぎぃ!
ら、らめぇ
Rubyならこうかな。 require 'Win32API' mciSendString = Win32API.new "winmm","mciSendString",["P","P","I","I"],"I" mciSendString.call("set cdaudio door open", nil, 0, 0)
>>426 おかしいなあ
おんなじエラーになっちゃうよ
RGSSでためしてみたけど。
社婚
Cで Windowsが最小化かどうか調べるにはどうしたらいいですか?
WindowsじゃないWindowです><
IsIconic
ありがとうございます><
433 :
デフォルトの名無しさん :2006/07/22(土) 11:46:03
Process32Nextとかで取得できるPROCESSENTRY32のszExeFileを頼る以外にイメージファイル名を得る方法はありますか? 大抵のプロセスは以下のような感じでOKなのですが いくつかのプロセスはOpenProcessで失敗してしまいます (GetLastErrorはアクセスが拒否されたといってます HANDLE ph = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, this->pid_ ); HMODULE mh=0; DWORD r=0; EnumProcessModules( ph, &mh, sizeof(mh), &r ); char buf[MAX_PATH] = {0}; if( GetModuleBaseName(ph, mh, buf, sizeof(buf)) ) result = std::string(buf);
LRESULT と HRESULTの違いってなに? ほかにもあるの?
>>433 稼動中のプロセスのフルパス名を取得したいのであれば、
PSAPI.DLLを利用する方法もあります。
>いくつかのプロセスはOpenProcessで失敗してしまいます...
との事なので、NT系OSでの情報取得ですよね。
でしたら、PSAPI.DLLでググって見て下さい。
438 :
433 :2006/07/22(土) 13:09:11
>>435 環境書き忘れてました. すいません Windows XP Home Edition SP2です
ttp://support.microsoft.com/default.aspx?scid=kb;ja;JP175030 PSAPI.DLLを利用する方法というのは
上記URLの「PSAPI ライブラリを使用したプロセスの列挙」 (ソースコード中では// If Windows NT 4.0以降
のことだと思われますが
hInstLib = LoadLibraryA("PSAPI.DLL");
...
lpfEnumProcesses = (BOOL (WINAPI *)(DWORD *, DWORD, DWORD*))GetProcAddress(hInstLib, "EnumProcesses");
...
lpfEnumProcesses(lpdwPIDs, dwSize2, &dwSize)
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, lpdwPIDs[dwIndex]);
と結局OpenProcessを呼んでしまっているので失敗すると思われます
違ってたらすいません
>>438 アクセス拒否を回避する場合は、
LookupPrivilegeValueとAdjustTokenPrivilegesで特権を付与する。
但し、OSのアクセス権の変更可の設定に依存したと思う。
440 :
433 :2006/07/22(土) 14:05:37
441 :
デフォルトの名無しさん :2006/07/22(土) 20:35:20
質問なのですが ・cygwin環境 ・g++ でプログラムを作っているのですが この度boostのregexを使おうかと思い 入れてはみたのですが。 APIプログラムじゃないソースでは動くのですが。 APIプログラムでコンパイルしたところ(コンパイルはできます 実行し、regexの部分に差し掛かったときに(boost::regex プログラムが停止してしまいます。(問題が発生しましたと・・・ 解決方法ありますでしょうかorz
>>441 単にお前のプログラムにバグがあるだけだろ。
443 :
441 :2006/07/22(土) 22:20:24
regex regex("<[^>]+>"); この一行だけで 動いてたプログラムが止まりってしまいます。 コンパイルでエラーはでてません。
NTFSのディレクトリにセキュリティ設定についてです。
やりたいことは、C:\hogehoge ディレクトリとその中の全てのファイル・サブ
ディレクトリに、Everyoneのフルコントロールのアクセス許可を追加することです。
Explorerで、C:\hogehoge のプロパティーのセキュリティタブ・詳細設定で
適用先=[このフォルダ、サブフォルダおよびファイル]のEveryoneのフルコン
トロールを追加すると、C:\hogehogeの中の全てのファイル・サブディレクトリ
にも継承元がC:\hogehogeとしてEveryone/フルコントロールが追加されます。
(これと同じことをプログラムでやりたい)
元としているプログラムは、
http://support.microsoft.com/kb/102102 で、Step14のAddAccessAllowedAce()のところをAddAccessAllowedAceEx( ...
OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE,...) に変えています。
これで、C:\hogehoge 自身のセキュリティーは目的通りにEveryone/フルコント
ロールが追加されるのですが、中のファイル・サブディレクトリにはC:\hogehoge
から継承したEveryone/フルコントロールが追加されません。(元のまま)
中のファイル・サブディレクトリに継承するには、C:\hogehoge へのセキュ
リティ追加時に、OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE を追加する以
外にやらなければならないことがあるのでしょうか?
あるいは、中のファイル・サブディレクトリ全てに対して、自前で
AddAccessAllowedAceEx( ...,INHERITED_ACE,... )のアクセス制御エントリを
追加しなければならないのでしょうか?
446 :
441 :2006/07/23(日) 01:28:23
お騒がせしました。 cygwinのg++でコンパイル時に no-cygwinオプションのせいでした。
現在の実行ファイルのアドレスを取得する方法を教えてください。 おねがいしまス。
>>447 GetModuleFileName
この質問多いな。
つーか「アドレス」ってなんだよw
リモートのを実行してるのかもしれん
モジュールがロードされてるアドレスが知りたいんじゃないの?
>>447 つ GetModuleHandle
×ロードされてる ○マップされてる
__ImageBase
そうじゃないです
454 :
444 :2006/07/23(日) 21:35:16
自己解決しました。 SetFileSecurity()でなく、SetNamedSecurityInfo()を使えば、既存の設定を残しての追加や 中のファイル・サブディレクトリへの継承が簡単にできました。
WM_ERASEBKGNDメッセージなどでwParamに入っているデバイスコンテキストハンドルは どういった筋のものでせうか これ使ったときも削除or解放しなくてもよろしい?
タブコントロールをSetWindowLongでサブクラス化したんですが どうもセットしたプロシージャーにメッセージが入ってないみたいなんですよ(↓で確認) switch(msg) { MessageBeep(-1); これって何が原因なんですかね?エロイ人おせーてorz
言語の基本からやり直せ
>>457 よくわからん。
case :WM_NULLが来たって事か?
いやはやお恥ずかしい
書く場所間違えてたorz
>>458-459 おかげ様で解決できました、ありがとう
すいません、platform SDKを探していたのですが、
>>1 の
Server 2003 SP1 Platform SDK Full Downloadしか結局見つからなかったのですが、
あたまにserver 2003って書いてるんですけど、これでいいんでしょうか?
当方XPです。
今後はPlatformSDKではなくFrameworkSDKで開発しろって事なんでしょうか??
見当違いな事を言ってたらすいません。
>>461 Server 2003 SP1まで対応してるって話で、XPでも問題ない。
が、それで良いかは知らん。
VC++6.0だったら、February 2003使うべきだし。
VC++2005でDirectShowのBaseClassesをビルドしたい場合は、
最新のWindows Server 2003 R2 Platform SDKのを使う必要あったりするし。
>>462 2003server「に」対応してるという意味ではなく、2003server「まで」っていうことなんですね
勘違いしていました。。
>DirectShowのBaseClasses
というのを今後使うかはわからないのでとりあえず
Server 2003 SP1 Platform SDK
をインストールして、必要に応じてR2のほうも入れてみます。
ありがとうございました
464 :
デフォルトの名無しさん :2006/07/24(月) 12:09:26
SDKでプログラムを書いてるんですが、 FindFirstFileやFindNextFileで"."と".."を拾ってくるのは使用なんですか? C:\やD:\について用いるとそんなことないんですが。
"."はカレントディレクトリ ".."は親ディレクトリ 存在するものを拾ってるって事です。
FATの頃からの仕様なんじゃないか? root 以外のディレクトリには . と .. は実在するテーブル情報だし
ウインドウにくっついてるルートメニューにオーナードローする方法を 教えてください。普通にやっても出来ません…
>>469 お答えどうも有難うございます。
リンク先に書いてあるオーナードローのためのWM_MEASUREITEMや
WM_DRAWITEMはルートメニューに対しては飛んで来ないようです。
ルートメニューというのはウインドウのタイトルバーの下について
いる横長のメニューバーのつもりで書きました。他に言い方が分
らないので…。
やりたいことは、ルートメニューバーにビットマップで絵を
貼り付けたいのです。どこか勘違いしていますでしょうか?
よろしくお願い致します。
とりあえずどうやっているか大まかに書いてくれ。 MFC使ってるかどうかも。 今のままだとプログラムが間違ってるとしか答えられん。
>>471 済みません。勘違いしてました。
プログラムを見直したところ、メッセージが飛んできたようです。
お騒がせしました。プログラムはWin32APIのみです。
有難うございました。
474 :
472 :2006/07/24(月) 20:06:38
475 :
472 :2006/07/24(月) 20:08:38
>>473 返事有難うございます。単に貼り付ける用途のフラグでは機能的に
ちょっと足りないと思いました。なのでオーナードローしています。
>>466 FATには実在するけどNTFSではntfs.sysがでっち上げてる。
たぶん"."と".."は存在するに決まってると決めつけているプログラムを
混乱させないため
>>476 素朴な疑問だけど、cygwinで表示されるiNodeNoとリンク数も実態を表していないと言うこと?
少なくとも見かけ上はリンクに見えるのだけど。
>>472 SPI_GETNONCLIENTMETRICSで
この前も言ったけどウェブ上のMSDNのAPIリファレンスが見れねえ! 同じ症状の人いねえ?
窓が無いとメッセージ受け取れないうんこ仕様
>>477 Cygwinのリンク数の表示はOSネイティブのものをさらにいじってる
ディレクトリのリンク数は中のファイル数を表すように見えるけど
実際には一切カウントされてないとか
>>483 はいはいあなた様の言うことがすべて100%完璧に正しいです
ディスクをダンプしてみた結果もntfs.sysの逆アセンブル結果もすべて幻です
これで満足しましたか
CreateDialogでダイアログベースの窓作ったんだけど WM_INITDIALOGじゃなくてWM_CREATEがくるのはなぜ?
>>484 >ディスクをダンプしてみた結果もntfs.sysの逆アセンブル結果もすべて幻です
>これで満足しましたか
頭悪いなぁ。
そこが嘘だと言ってるのではなく、
>>476 の「たぶん」以降が嘘だと言ってるのだ。
---dll側------- void HogeHoge(HWND hWnd) -------------- typedef void*(*FUNC)(HWND); hInstdll=LoadLibrary(dllへのフルパス); dllfunction=(FUNC)GetProcAddress(hInstdll,"HogeHoge"); dllfunction(hWnd); たぶんFUNCの定義が間違ってるのが原因だと思うのですが、何度試行錯誤してもうまくいきません へるぷみーorz
typedef void (*FUNC)(HWND);
SetTimer()でTIMERPROCを指定する時、コールバック関数はstaticにしないと いけませんよね?(理由はわからないのですが) そうすると、コールバック関数の中からコールバック関数の属するメンバに アクセスするにはメンバもstaticにしないとコンパイルが通りませんが、 それでは複数のインスタンスを生成して同時処理をする場合に各インスタンスに 別々の設定を渡すことが出来なくなります。 VC++なのでCWnd::OnTimer()という方法もありますが重くなりそうなので、 自作クラスで何とかしたいのですが何か良い方法はあるでしょうか? マルチスレッドならスレッドごとに独立して利用できるのかな?
>>490 API云々の前にC++を勉強しなおせ。
>>490 >SetTimer()でTIMERPROCを指定する時、コールバック関数はstaticにしないと
>いけませんよね?(理由はわからないのですが)
C++ならそう
Cならそんなことはない
シングルトンクラスにしとけ
>>491 具体的にはどの辺をやり直せば良いでしょうか?
>>493 シングルトンだと1個しか実体がないので複数のインスタンスで
別々の設定のタイマー処理ができないように思うのですが、
シングルトンでマルチスレッドならうまくいくのかな?
>>492 C++だけなんですか・・・なんでだー orz
この辺調べたほうがいいのかな?
マルチスレッドにした方が楽になると思う
498 :
366 :2006/07/25(火) 08:59:04
TimerProcっておまけの引数がないんだね。 グローバルにIDとオブジェクトを対応付けさせるしかないと思う。 と書こうとしたら、IDが使えると思いついた。このIDはUINT_PTR型だから大きさも問題ない。 class Hoge { public: UINT_PTR SetTimer(HWND hwnd, UINT elapse) { return SetTimer(hwnd, reinterpret_cast<UINT_PTR>(this), elapse, TimerEntry); } private: void TimerProc(HWND hwnd, UINT msg, UINT_PTR id, DWORD time); static void CALLBACK TimerEntry(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) { reinterpret_cast<Hoge*>(id)->TimerProc(hwnd, msg, id, time); } static std::map<UINT_PTR, Hoge*> TimerProcMap; };
ああ名前の366は間違いだ、すまん。
TimerProcMapも不要だ。
確かSetTimerの数に上限あるから気をつけてね マルチスレッドでも上限あるけど どっちがいいかな 場合によるかな
>>494 staticでないメンバ関数には、何らかの方法でthisを渡してやらなければならない(コンパイラが)
Win32 APIは、あらかじめ決められた呼び出し規約を使う。
メンバ関数と、APIの呼び出し規約は違う。
504 :
472 :2006/07/25(火) 11:48:31
タイマーつけたら動作不安定になったヽ(`Д´)ノ SetとKillを繰り返したらダメとかありますか?
506 :
デフォルトの名無しさん :2006/07/25(火) 17:00:18
質問があります。 インターネットエクスプロラーの画面で、ツールバーとその下のアドレス入力部分 の間に区切り線(横線)がはいってるのですが、どうやって表示しているのですか? 自分はラインを引いてそれっぽく見えるようにしたのですが・・・ どなたかよろしくお願いします。
>>506 CreateWindow TOOLBARCLASSNAME
ところでwinnyのUI右上あるBBSボタンとなりの▲はapiの機能?
>>507 たぶんVCLのTSpeedButton。
ウィンドウハンドル持たない(VCLによる)独自描画ボタン。
510 :
デフォルトの名無しさん :2006/07/25(火) 20:57:14
素敵なキーボードランチャを実現するのための スマートでエレガントな方法を教えてください。 精力は尽くしましたがわかったことは下記の通りです。お願いします。 ・任意のキーを使いたいのでRegisterHotKey()は役不足? ・SetWindowsHookEx?WH_KEYBOARD_LL?なにそれ ・AttachThreadInput?なんかほげほげって聞いたけど
役不足・・・
役不足w
DirectInput
おおむね >・SetWindowsHookEx?WH_KEYBOARD_LL?なにそれ で間に合うと思う。
役不足・・・(´・ω・`)・・・
ミディアムレア
517 :
506 :2006/07/26(水) 00:40:58
>>507 ありがとうございます
CreateToolbarEXでは境界線が表示できないということですか?
試しにあしたCreateWindow TOOLBARCLASSNAMEでやってみます。
_, ,_ ( ゚Д゚)
timeSetEvent関数のコールバック関数は割り込みと考えていいの? カウンタとか参照用変数を作った場合、同期オブジェクトでロックしなくておk?
523 :
510 :2006/07/26(水) 20:50:06
>>514 ありがとう愛してるよ
おおむね間に合ったけどなんかこえーよガタガタ
こわい?何が?
MessageBoxのウインドウ(クライアント領域)に、アプリ側からどこかに処理を滑り込ませて 描画する方法はありませんか? グローバルのメッセージループをフックするとか…(←適当言ってます) もし可能であればご教示ください。
ShellExecute()でmailtoを使いsubject等を指定してメール新規作成Windowを開くことはできますが、 添付ファイルを指定することはできないんでしょうか。
mailto に関連づけられたMUA次第じゃね?
OEでできればそれでいいんですが… やり方あったら教えてくださいませ
>>525 昔ある雑誌にMessageBoxの前でSetTimerつかって、
コールバック関数内でMessageBoxのウィンドウハンドル取得して
アイコンをセットしてるコードが載ってたなぁ。
Becky!だと引数にファイル渡せば、 添付ファイル付きで新規作成になるけど、OEはシラネ。
OEならIEのようにオートメーションでどうにでもできそうな気がする。
SMTP鯖と直接お話しすれば無問題
>>532 素POPはなんとかなるけど SMTP は少しめんどっちい
つか、そこまでいくと メールクライアントになれるじゃん
いまどきのSMTPはTLSだったり認証あったりするからなぁ
超初心者ですんません。 ほぼ最初の最初で、つまづいてます。 GetStockObject(WHITE_BRUSH); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); とかの関数を使ってMakeしようとすると undefined reference to `GetStockObject@4' undefined reference to `TextOutA@20 といわれてエラーになります・・・ もちろん<windows.h>はインクルードしていますし これらの関数を使わなければ CreateWindowとかShowWindowは問題なく通り ウインドウを表示させることはできます。なぜなんでしょ・・・?
>>535 開発環境を書こう
そのエラーはおそらくリンカの吐いてるエラー
gdi32.libをリンカに追加しる
>>536 コンパイラはMinGW+MSYS、環境はEclipseCDTです。
-lgdi32オプションつけてコンパイルしたらうまくいきました、ありがとうございました。
539 :
デフォルトの名無しさん :2006/07/27(木) 19:52:10
SendInput でマウスをドラッグして移動させる時に「MOUSEEVENTF_ABSOLUTE」というパラメータ を付けているのですが、これを使うと座標単位がピクセル単位ではないのでうまく移動ができません。 ピクセル単位でドラッグできる方法はありますでしょうか?
>>539 自前で変換しる。
でも、なんでマウスの移動の単位は、あんな単位なのだろう。
ピクセル単位だと、何か問題があるのかな。
実行時にウインドウと一緒にコマンドプロンプトみたいなのが表示されてかっこ悪いんだけど、表示させない方法とかある?
542 :
539 :2006/07/27(木) 20:03:33
変換する基準とかありますか? 65535を解像度で割ったりとかしたけどダメでした。
教えてくださいおながいします
>>544 環境がわからんし、どうやっているのかもわからんのでなんとも。
>>544 コマンドプロンプトのウインドウに壁紙の画像を貼り付ける
それだとちっちゃい壁紙画像が出てきてよけいに変な気が。
>>541 開発環境が分からないので何とも言えないが、コンソールプログラムから
ウィンドウの作成を行っているのかな?。
つまりスタートアップルーチンは、WinMain でななく main だとしたら、
スタートアップルーチンを main から WinMain に換えるのと makefile を
若干修正するだけでプロンプト画面は表示しなくなる。
>>539-540 入力デバイスのキャリブレーションを想定してるからじゃね?
(ペンデバイスや障害者用デバイスなどなど)
SystemParametersInfoになんかあった気がするが・・・
違うかな?
-mwindowsオプション付けてみたらなぜか消えたぜ、おまいらありがとう
WinMainの返り血って決まりとかあるですか?
>>551 cygwin|mingwかよ。環境書けやコルァ
>>525 自アプリなら素直にダイアログ作れ
そうじゃなければAdvanced Windows
>>551 ちなみに -mwindows 付けたなら -lgdi32 はいらないはずだ確か
ttp://ruffnex.oc.to/kenji/text/api_hook/ 例えば、user32.dllで定義されているMessageBox関数をフックしたい場合、
まずはHook_MessageBoxAとHook_MessageBoxWの2つの置き換え関数を作成します。
どこに作成してもよいのですが、ターゲットのプロセスに注入しないことには
フックできませんから、DLLとして作成しておきます。
そのDLLをターゲットプロセスへ注入すると、DLLは最初に
CreateToolhelp32Snapshotを使ってすべてのモジュールを探索します。
そして、そのモジュールひとつひとつに対してインポートセクションを持っているかどうかを調べ、
持っていたらMessageBoxAのアドレスをHook_MessageBoxAへ、
MessageBoxWのアドレスをHook_MessageBoxWへ書きかえます。
これでMessageBox関数が実行されたら、注入されたDLL内にある
Hook_MessageBoxAとHook_MessageBoxWが呼び出されることになり、
見事APIをフックすることができると考えられます
ダイアログプロシージャにはwindowsx.hの メッセージクラッカは使えないの?
DIBSectionでBMPの読み方そしえてくれまsんか?
>>558 サンクス
気軽に聞いちゃったけど
ググりを怠るといけませんね
561 :
デフォルトの名無しさん :2006/07/28(金) 18:33:33
自分のIPを取得するAPIを教えてください
GetMyIP();
563 :
デフォルトの名無しさん :2006/07/28(金) 18:41:51
あ、すみません。 グローバルIPです。ルーターを使っていても自分のグローバルIPを取得する方法を教えてください
GetGlobalIP();
>>563 UPnPで取れるはずだが、簡単で汎用的な方法は無い。
566 :
デフォルトの名無しさん :2006/07/28(金) 20:15:10
モニタの省電力周りの事を調べています。具体的には、 1・モニタ省電力モードへ切り替えるAPI(→画面が消え、モニタの電源ランプがスタンバイになる) 2・省電力モードから復帰するAPI(→モニタの電源が入り画面が表示される) 3・電源オプションのプロパティにある「モニタの電源を切る」の設定を変えるAPI 特に1番と2番の情報を教えて下さい。APIの名前だけでも結構です。 解る範囲で検索してもノートパソコンの新情報とかそういうユーザー視点の情報しか発見できませんでした。 2番については、省電力になった後SetCursorをランダム座標で呼び出すテストをやってみましたが案の定だめでしたw よろしくお願いします。
SC_MONITORPOWER をググってみてごらん
>>566
568 :
デフォルトの名無しさん :2006/07/28(金) 20:28:24
>>567 それぽいのが出てきました。これ専用のAPIなんて無かったのですね。ちょっと試験してみます。
ありがとうございました。
タスクバーのDesk Bandを表示/非表示させるAPIってないんでしょうか。 COMインターフェイスのメソッドでもいいです。 ツールバーのCLSIDを渡すような感じのものを想像してるんですが
修飾子"WINAPI"と"CALLBACK"は両方とも__stadcallと定義されていますが、 どのように使い分けるのでしょうか?
CALLBACKは自分が定義したOSから呼ばれる関数に付ける WINAPIはOSが定義した自分が呼び出す関数に付けるけど 関数ポインタでも使わない限り自分で書くことはないでしょ
DLL
WINAPIはDLLのエクスポート関数に付けてる、俺は。
575 :
デフォルトの名無しさん :2006/07/29(土) 09:41:35
fh=CreateFile(fnm,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); // ファイルオープン lpBuf=(LPBYTE)GlobalAlloc(GPTR,GetFileSize(fh,NULL)); // バッファ確保 ReadFile(fh,lpBuf,GetFileSize(fh,NULL),&dummy,NULL); CloseHandle(fh); //いろいろポインタ取得 lpInfo=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPFILEHEADER)); lpfh=(LPBITMAPFILEHEADER)lpBuf; lpBmpInfo=new BITMAPINFO; CopyMemory(lpBmpInfo,lpInfo,sizeof(BITMAPINFOHEADER)); width=lpInfo->bmiHeader.biWidth; height=lpInfo->bmiHeader.biHeight; lpPixel= new DWORD [width*height*3]; CopyMemory(lpPixel, &lpfh->bfOffBits ,sizeof(width*height*3)); //ファイルメモリ バイバイ GlobalFree(lpBuf); /* DIBSection作成 */ hbmpBMP = CreateDIBSection(NULL, lpBmpInfo, DIB_RGB_COLORS, (void **)(&lpPixel), NULL, 0); /* DIBSection用メモリデバイスコンテキスト作成 */ hdcBMP = CreateCompatibleDC(hdc); /* DIBSectionのHBITMAPをメモリデバイスコンテキストに選択 */ SelectObject(hdcBMP, hbmpBMP); うまくいかない・・・
lpPixelはCreateDIBSectionが確保する。だから、確保する必要ない。 (つーか、DWORD * width * height * 3って96bitビットマップかよ!) だから、CopyMemoryはCreateDIBSectionの後で。 lpfh->bfOffBitsは、ファイルの先頭からデータまでのバイト数だから、 &lpfh->bfOffBitsではなく、lpBuf+lpfh->bfOffBitsだね。 sizeof(width*height*3)って、width*height*3のsizeを求めてもしゃーないやろ。 それにビットマップは横1ラインが4バイト境界で有る必要がある。 計算式は('A`)マンドクセ
一部を白く
for (y=0;y<44;y++)
{
for (x=0;x<width;x++)
{
*( lpPixel+x*3+ y*width )=255;//B
*( lpPixel+x*3+1+y*width )=255;//G
*( lpPixel+x*3+2+y*width )=255;//R
}
}
<(T◇T)>わぁああああ!
http://gamdev.org/up/img/6849.gif
間違えた *( lpPixel+x*3+ y*width*3 )=255;//B *( lpPixel+x*3+1+y*width*3 )=255;//G *( lpPixel+x*3+2+y*width*3 )=255;//R
ビットマップは上下反転している。 lpPixelがLPDWORDのままでないかい? x*3+y*widthバイトではなく、(x*3+y*width)*sizeof(DWORD)バイト進んだ位置をさすことになるぞ。 代入もDWORD単位だから、255ということは0x000000FFが書き込まれる。 width*3ではなく、4バイト境界でそろえた数値をかける必要がある。
kita---------------------!!! LPDWORD lpPixel ↓ LPBYTE lpPixel に変更したら直りました さんきゅ〜!
CharNextWの存在価値を教えてください 普通に「++」でインクリメントしても、 今のところ期待するような結果が返ってきます
>>569 ですが、その後もいろいろ調べた結果、
不可能と判断しました。失礼しました〜
>>582 CharNextWが無かったら、CharNextを使ってるソースをUnicodeビルドできないじゃん。
いちいちインクリメントに書き直せとでも?
>>572 WinMainにはAPIENTRYという専用の修飾子がある
587 :
デフォルトの名無しさん :2006/07/29(土) 17:03:26
ちょっと教えて ウィンドウで「常に最前面に表示」と「常に最前面に表示を解除」の切り替えをやりたいのです。 @選択されたウィンドウが「常に最前面に表示」なら「常に最前面に表示を解除」 A選択されたウィンドウが「常に最前面に表示」でないなら「常に最前面に表示」 て感じ 設定するのはSetWindowPosでうまくいってるんだけど、 現在の状態(最前面?そうでない?)がどっちなのか判断できません。 どうやったらいいですか?
588 :
デフォルトの名無しさん :2006/07/29(土) 17:07:17
iReturnStatus = GetWindowLong(hWndBuf, GWL_EXSTYLE); if (iReturnStatus & WS_EX_TOPMOST) でできまちた ごめんちゃい
589 :
デフォルトの名無しさん :2006/07/29(土) 19:56:30
質問があります。 エディットコントロールで特定の入力だけを処理するには(例えばリターンのみ)ウィンドウのクラス化をすると 簡単にできたのですが、コンボボックスで同じことをやるにはどうすればよいですか?キー入力の横取りができません どなたか教えてください。
>>589 コンボボックスのエディットコントロールをサブクラス化する。
591 :
589 :2006/07/29(土) 20:40:14
>>590 GetComboBoxInfoを使用してエディットボックスのハンドルを収得
してエディットボックスのサブクラス化ですね。ありがとうございました
しかし、エディットコントロールとエディットボックスは同じと
考えて問題ないのでしょうか・・・
タスクバーにあるタスクリストに表示されている、特定の(自分以外のプロセスの)エントリーをタスクリストから消す方法というのは、あるのでしょうか? どなたか教えてください。
ITaskbarList
594 :
592 :2006/07/29(土) 21:36:28
よろしかったら教えて下さい。 よくゲームなどで情報を表示している小窓みたいなので (ネトゲのステータス表示してる子窓とかチャットウィンドウみたいなの) そういうのでスキンを使ったみたいに見た目をカスタマイズしてるのって どうやってやっているんですか? 自力で窓作るのも無駄な気がするし…
ゲームのGUIはほぼゼロから手作り DXUTのGUIはスキンサポートしてるみたいだけど
>>596 ゲーム作ってるわけじゃなかったのであまり深く考えていませんでしたが
ちょっとそっち方面で調べてみますありがとう
うぃんどうりーじょんのことがききたかったのかもしれん
>>595 ウィンドウ枠含め全て自前で描画し、WM_NCHITTESTを適切に処理してあげるとか?
>>598 htmlでメニュー作る感じに画像で作る、丸いとことかさ
エディットボックスに入力した文字をファイルに保存したり ファイルから読み込んだ文字をエディットボックスに表示したりしたいんだけど、どうすればいいの?
>>603 Edit_GetText, Edit_SetText
その前にWindowsプログラム関連の書籍か数多く出版されているので、
それらの本でプログラムの基礎を学ぶことをお勧めする。
>>604 ありがとう
今までDirectXとかゲームに近い方ばかりやってたからWinAPI本持ってないや
今度見てみる
速攻ゲーム開発かスゲー
ウィンドウを生成・管理するクラス作りたいんだけど、 そこにウィンドウプロシージャを埋め込むにはどうしたらいい?
ごめん言い方が悪かった ウィンドウを生成・管理するクラスWindowに メンバ関数としてウィンドウプロシージャを組み込むにはどうしたらいい? WNDCLASSEX構造体にプロシージャなメンバ関数WndProc()へのアドレスを設定しようとしてもエラーで入らない 宣言 (LRESULT CALLBACK) Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 問題箇所 WNDCLASSEX wcex; wcex.lpfnWndProc= this.WndProc; エラー内容 error C2228: '.WndProc' の左側はクラス、構造体、共用体でなければなりません 型は 'Window *const ' です。
C++の基本からやり直せ。
>>609 staticなウィンドウプロシージャから個々のクラスの
ウィンドウプロシージャを呼べばいい。
これは色んなところで議論されてるから
ググばすぐ見つかると思う。
ある数字配列を作製し、テキストで出力するプログラムを作っているのですが、 コンパイル後、実行すると「問題が発生したため・・・」のウィンドウが出てしまいます。 どうも次のレスに記述するソースの「問題の行」と示したところがまずいようなんです。 (そこの記述を消すとエラーが起こらない) なぜまずいのでしょうか??
615 :
614 :2006/07/30(日) 19:19:27
#include <windows.h> #include <math.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { int bittbl[ 1024 ]; int n; int n2; int n_harf; HANDLE hFile; DWORD dwWriteSize; PSTR header = TEXT( "int bittbl[] = {\n" ); PSTR bit; PSTR footer = TEXT( "};" ); hFile = CreateFile( "bittbl.h" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL ); WriteFile( hFile , header , lstrlen( header ) , &dwWriteSize , NULL ); //数列bittbl[n]作製 〜省略〜 //数列をテキストへ出力 for( n=0;n<1024;n++ ){ wsprintf( bit , "\t%d ,\n" , bittbl[ n ] ); ←問題の行 WriteFile( hFile , bit , lstrlen( bit ) , &dwWriteSize , NULL ); } WriteFile( hFile , footer , lstrlen( footer ) , &dwWriteSize , NULL ); CloseHandle( hFile ); return 0; }
bitのメモリはどこで確保してるんだ? APIより先にC言語の基本からやり直せ
物凄い初心者な質問なんだけど ウィンドプロシージャで最後にDefWindowProcに渡すようになってる所で switch文でdefault使って他はreturn 0とかやる場合とウィンドプロシージャの最後に直接returnでやる場合と 色々見かけるような気がするんですが、これはどっちでも変わらないんでしょうか? switch文の各処理が終わった後の処理が変わるような気がするんですが 違いとかあるんでしょうか?
MSDNに 「メッセージを処理したときは0を返せ」って書いてるだろ? 裏を返すとメッセージを処理しなかったときはDefWindowProcを返せってこと。 大半のメッセージについてはDefWindowProcも0を返すだけだから 違いが見えにくいかもしれないけど
620 :
614 :2006/07/30(日) 20:01:05
>>616 とくにメモリ確保しなくても同じようなことが他のプログラムではできたのですが・・・
仕方ないので、そのプログラムを改造して数列をテキスト出力しました。
>>618-619 各メッセージ処理が終わった後に0返さずさらにDefWindowProcしてるのが
あったような気がしたのでふと疑問に思ったのですが、勘違いかもしれないですね。
何か変に考えすぎていたのかも
でも、DefWindowProcが大抵0返すのなら、上記のような感じでも
無駄っぽい気はするけど、そんな問題ないって感じなのかな
ありがとうございました。
>>621 自分で処理した後デフォルト処理したい時もあるだろ
>>622 確かにそういわれれば…
疑問が解消されましたありがとう
>>620 >とくにメモリ確保しなくても同じようなことが他のプログラムではできたのですが・・・
こええなおいw 問題の行で確保してないメモリ領域に書き込んでるぞ。
625 :
614 :2006/07/30(日) 20:40:52
>>624 そのプログラム、ちょっといじると同様のエラーが起こるようになりました!
PSTR bit の宣言時に PSTR bit = TEXT( "\t%1024 ,\n" ) とすれば問題なくなりましたが、
ちょっとかっこわるい気がします。
他にメモリを確保する方法を教えてください。
えー
>>625 PSTR bit; を TCHAR bit[65536]; に書き換える。
そんなにいらないとか言われてもしらん。
そんなにいらない
>>628 > PSTR bit の宣言時に PSTR bit = TEXT( "\t%1024 ,\n" ) とすれば問題なくなりましたが、
> ちょっとかっこわるい気がします。
とかほざいてる奴に解決策だけ教えてもかえって有害な気がするけどなあ
631 :
614 :2006/07/30(日) 21:43:01
>>628 できました!
ありがとうございました!
既に子ウィンドウ(WS_CHILD)として作成してしまったウィンドウを、 親ウィンドウから切り離して、強制的にメインウィンドウにさせることは可能でしょうか?
633 :
632 :2006/07/30(日) 21:58:37
ワロス
614やばいよ、やばすぎるよ…。
>>632 SetParent(NULL)したらSetWindowLongでWS_CHILDを外してWS_POPUPを付けるようにとMSDNが言っている。
637 :
632 :2006/07/30(日) 23:10:41
>>636 できるんですか!?ものすごく裏技チックなので無理かと思ってました。
ありがとうございます。MSDNで公式に発表されてる処理だとは。ワロス
タスクトレイのアイコンにバルーンチップ出すようにしたんですけど このときポコっていう通知音が邪魔くさいんです。なんとか消すようにできませんか?
win2000,VC6です メモリの使用についてテストしたくて以下のコード書いたのですが 実行後タスクマネージャでメモリ使用量を確認しても640kbしか消費してません 60MB消費されると思っていたのですが どうしてですか? #include <windows.h> #include <cstdio> int main() { PVOID mem = VirtualAlloc(NULL,60000*1024,MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (mem != NULL) printf("ok"); scanf("%s",mem); }
>>639 VirtualAllocでぐぐったら一番上に出てきたが?
質問する前に自分で調べような。
641 :
639 :2006/07/31(月) 03:30:06
>>640 ごめん。そのページ読んでたんだけどよくわからなかったんだ
「
コミット済み このページには物理記憶域が割り当てられていて、
アクセス保護コードによってアクセスは制御されています。
このページの読み取りまたは書き込みを最初に試みた場合にのみ、
システムは各コミット済みページを初期化し、物理メモリへロードします。
」
つまり、コミットしてても実際にそこへ何か書き込まなければメモリは実際には
確保されないということですか?
642 :
639 :2006/07/31(月) 03:37:58
わかった!!ありがとう
>>640 以下のコードだとタスクマネージャのメモリ使用量は
636kbでした
PVOID mem = VirtualAlloc(NULL,60000*1024,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
これを以下にするとメモリ使用量は640kbになりました
PVOID mem = VirtualAlloc(NULL,60000*1024,MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
mem = "aiueo";
これはaiue0\0という6バイトの文字列がコミットした領域に書き込まれて、
その4kbのページングファイル一つがメモリに読み込まれたということですね
で、以下のようにすればちゃんとメモリ使用量が60MBになりました
PVOID mem = VirtualAlloc(NULL,60000*1024,MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
FillMemory(mem, 60000*1024,0);
やっと、寝れる
PVOID型の宣言を調べようと windef.hを見てたんだけど LPVOIDはあるけどPVOIDがありません PVOIDはどのヘッダファイルで定義されているのでしょうか?
つgrep
645 :
デフォルトの名無しさん :2006/07/31(月) 08:39:37
プログラム起動中に スクリーンセイバーを作動をさせないようにする関数はありますか?
647 :
643 :2006/07/31(月) 09:22:38
>>644 windef.hからインクルードされてる
winnt.hにありましたどうもです
きも
PCVOIDが用意されていないのが残念
652 :
645 :2006/07/31(月) 13:40:25
653 :
デフォルトの名無しさん :2006/07/31(月) 13:57:10
初めまして。 一つ聞きたいことがあったので、皆さんに質問させていただきます。 ダイアログボックス内のエディットボックスにおいて、例えばボタン1を押すとエディットボックス内に「OK」と表示されるとします。 次にボタン2を押したときに、前の「OK」を消さずに OK NG と改行して表示させたいのですが、どのようにすればよいのでしょうか? 普通にSetDlgItemTextでやると前のを上書きして消えてしまうし、かといって違う方法が思いつかなくて困っています。 ネットでもMFCでかかれたものはのっているのですが、APIで書かれているものがないのでこちらにて質問させていただきました。 お手数をおかけいたしますが、よろしくお願いいたします。
>>653 EM_SETSEL
EM_REPLACESEL
>>648 むむ、てことはシステム通知音をプログラム側でいじるようにすればいいのか。
おk−調べてみるぜ
>>653 GetWindowText
lstrcat
SetWindowText
SendMessage関数はプロシージャを直接呼び出し、処理を終えてから制御を返すとありますが、 送信先のウィンドウがアクティブのときは確かにそうなのですが、 送信先のウィンドウが非アクティブの時は処理をすることなく即座に制御が返ってきます。 これはなぜですか?
・どんなメッセージを送ったのか ・非アクティブの時処理をしてないことをどうやって確認したのか
660 :
658 :2006/07/31(月) 16:09:40
・どんなメッセージを送ったのか ユーザー定義メッセージ #define WM_USER_ESC_FLAG (WM_USER + 0) SendMessage(hMainWnd, WM_USER_ESC_FLAG, 0, 0); です。 ・非アクティブの時処理をしてないことをどうやって確認したのか ビープ音で確認しました。 switch (msg) { case WM_USER_ESC_FLAG: MessageBeep(-1);
661 :
658 :2006/07/31(月) 16:11:33
ああ、ちなみに送り主はフック.DLLです。
>>661 非アクティブなプロセスはMessageBeepで音を出せない。
とかいうことはないのか?
ファイルにデバッグログを出力してもう少し詳しくトレースしてみたら? MessageBeepとかちょttあやしい
WM_USER+n はコントロールメッセージとかぶるけど大丈夫?
使って良いのはWM_APP以降だわな
まぎらわしいねん
WM_APP以降ってコントロールメッセージとかぶることにMicrosoftが言い出してから 後付けで言い出したんだけどな
日本語でどうぞ。
先ほどスクリーンセイバーについて質問しました者ですが 勘違いをしていました。 事情があってスタンバイ等の設定ができないので プログラム起動中は スタンバイ || 休止状態を させないプログラムを作りたいのです。 しかしスクリーンセイバーを止めてもスタンバイ || 休止状態に入って しまいました。(無知でした) スタンバイ等を抑止する方法はあるのでしょうか? デスクトップ等に SendMessage 等でキーコードを送信したり マウスカーソルの位置を定期的に変えたりと試しましたがどれも 失敗です。今は電池をスペースキーに置いて席を離れています。
>>670 WM_POWERBROADCASTのPBT_APMQUERYSUSPENDに対してBROADCAST_QUERY_DENYを返す。
672 :
デフォルトの名無しさん :2006/08/01(火) 09:10:23
>今は電池をスペースキーに置いて席を離れています ワロス
ユーザーが任意の数だけビットマップを読み込めるプログラムを作成しているのですが その数だけメモリDCを増やさなければいけません。 いくつまで増やしていいものでしょうか? お願いします。
確保できなくなるまで
675 :
673 :2006/08/01(火) 11:09:09
>>674 メモリDCってかなり重いんじゃないですか?
途中で勝手に質問を変えるな
どこまでCPUに負担かけていいんですか?とか聞いてるようなもの
ユーザーが任意のテキストファイルを読み込めるプログラムを作成しているのですが その数だけメモリを増やさなければいけません。 いくつまで増やしていいものでしょうか? お願いします。
確保できなくなるまで
物理的な限界 論理的な限界 のいずれかに達するまで
681 :
673 :2006/08/01(火) 11:43:54
すみませんでしたつД`)
>>582 今更だけど、WCHARはUTF-16だから、
CharNextWはサロゲートペアのことも考えてくれるのではないか?
何にせよ内部実装を隠蔽してくれるという観点から 大いに意味アリだよね
質問です。 WinAPIで何かのキーを押したときに何か違うキーも押したことにするってできますか? Kを押したら一緒にF12も押したことにしてくれるみたいな。
Windows 2000くらいからはサロゲートを考慮してくれそう
分割ウィンドウを作ろうと思っているのですが、 どういう実装にするのが普通なんでしょうか? 自作は最後の手段として、ヘッダーコントロールで 代用しようと思ったら、その子にしたコントロール専用の 通知メッセージが届かなくなり、使い物になりませんでした。 やはりMFCのを使うのが無難なのかな・・・
わかるよそのMFC使いたくない気持ちつД`)
690 :
687 :2006/08/02(水) 08:20:13
>>688 やはりそれが普通ですか。
とりあえずWTLの方は未経験なので
使ってみたいと思います。
thxでした。
こんにちは。ちょっと質問させてください。 ある2つのプログラムをメンテナンスしています。 仮に「pg-1.exe」と「pg-2.exe」とします。 pg-1、pg-2は、ともにほぼ常時稼動するプログラムです。 pg-1はpg-2からCreateProcessで起動され、pg-1は起動された直後に ウィンドウのタイトルの文字列をファイルに記述します。 ユーザーはpg-2上のボタンを押すことでpg-1を再起動することができます。 pg-2はボタンが押されたら、ファイルに記述された文字列を元にFindWindowし、そのウィンドウに WM_CLOSEをPostします。終了したことを確認してから再度CreateProcessする仕組みです。 pg-1にバグが見つかって修正した場合、新しいpg-1.exeに入れ替える際の作業手順は次の形です。 1. 実行中のpg-1.exeのファイル名をpg-1-bk.exeに変更。 2. 新しいpg-1.exeを同じフォルダにコピー。 3. pg-2上のボタンを押して再起動。 この結果pg-1.exeは終了されるのですが、その後起動されるのがたまになぜかpg-1-bk.exeだったりします。 しかし、pg-2.exe内でのCreateProcessでは第一引数、第二引数で固定的に「pg-1.exe」を 指定しているのです。 私の頭で考えつくのは、システムのディスクキャッシュみたいなものがあって、 そこの内容が実際のファイル名の変更についていってなくて、新しいpg-1.exeを起動したつもりが 元のpg-1.exe(現pg-1-bk.exe)が起動されたのか?とかぐらいなんですが 入れ替えたpg-1.exeが起動されるようにするにはどうしたらいいんでしょうか? 普段はVB6erであんまり慣れてないので、お手柔らかにお願いします。m(_ _)m
>>691 > 1. 実行中のpg-1.exeのファイル名をpg-1-bk.exeに変更。
> 2. 新しいpg-1.exeを同じフォルダにコピー。
はどうやってるの?
pg-1.exeが動作中でファイルがロックされてて失敗してないか?
>>692 今のところエクスプローラ上でファイル名変更、コピー出来てます。
入れ替え後のファイルのプロパティを表示すると、バージョンも変わっているので、
入れ替わっていると思います。
694 :
658 :2006/08/02(水) 16:37:58
原因がわかりました 誤: #pragma data_seg(".sharedata") HHOOK g_hHookWnd_gm = 0; #pragma data_seg() HWND hMainWnd = 0; 正: #pragma data_seg(".sharedata") HHOOK g_hHookWnd_gm = 0; HWND hMainWnd = 0; #pragma data_seg() こういうオチでした… メッセージを送るときはWindowHandleも共用にしておかないとダメなんですね
ビットマップの左上の1ピクセルの色を取得したいのですが、 GetPixelじゃメモリ上にあるカラーを取得できません。 ピクセルビットを読み込む他の方法があれば教えてください。 お願いします。
DCをメモリ上のものにすれば良いのでは?
697 :
695 :2006/08/02(水) 21:14:10
あ、ホントだ。すみませんでした。ありがとうございます。
698 :
デフォルトの名無しさん :2006/08/03(木) 00:50:36
age
>>694 最新のMSDN(英語版)を見ると、CallNextHookExの第1引数はNULLを渡せばいいことになってる。
だから、g_hHookWnd_gmを共用にしなくてもいいかも。
仮想キーの自動入力プログラムってどんな感じでやればいいんですかね
キーダウンのメッセージを投げる
GetForegroundWindowでウインドウハンドルを取得して、 SetWindowPosでそのウインドウの"常に前面表示”を切り替えるプログラムを作ったんですが、 PhotoshopやLunascape等アプリのウインドウだとそのウインドウがアクティブになってる時しか利きません。 メモ帳だといつでも利くんですが、なんでですか?
質問です。 LoadLibraryでDLLをロードしてGetProcAddressで関数を呼び出しています。 この関数から呼出し元のプログラム中の別の関数を呼び出すことは可能ですか? コンパイラはMinGW(gcc)を使っています。 VC++なら可能、という回答でもありがたいです。 よろしくお願いいたします。
>>704 関数ポインタを渡せば出来そうだけど、
DLLが外部に依存したらDLLの意味がないだろ。
>>703 どうもありがとうございます。
NULLってなくなるってことですよね?解決策はありませんでしょうか?
708 :
704 :2006/08/04(金) 19:59:16
>>707 ご推察の通り、コールバックです。
問題のDLLは本体に対するプラグインでして、依存しても差し支えありません。
Unix/Linux では関数ポインタを使わなくても呼出し元のコールバック関数が
呼び出せているので、Windows でも同じようにできないかなと考えています。
引続きよろしくお願いいたします。
>>708 Unixの勝手は知らないが、Windowsは関数ポインタを渡すのが一番手っ取り早いだろ。
711 :
デフォルトの名無しさん :2006/08/04(金) 20:21:28
>>708 DLLにしろEXEモジュールにしろ、その中の各関数は本体モジュールの
ベースアドレスからの相対アドレスで管理されているから、エクスポート
されていない関数の場合は、その関数名からその関数が存在するアドレス
を求めるのは無理なので、コールバック呼び出しは無理だと思う。
"GetProcAddress" は、エクスポートテーブルからそのAPIの位置を特定
している訳だし。
メインソース内のサブルーチンをエクスポート宣言できれば、多分、その
モジュールのベースアドレスから関数のアドレス位置を特定できると思う。
>>708 Susieプラグインなんかはアプリ側からDLLへ関数ポインタ渡してる(画像展開の途中経過表示など)
普通はDLLにコールバック関数を登録するI/Fを入れとくもんだが
>>706 SetWindowPosしたいだけなら普通FindWindowを使ってハンドルを取得する
715 :
706 :2006/08/04(金) 22:04:53
>>714 レスありがとうございます。
FindWindow使い方がよく分からなかったのでGetForegroundWindowにしたんですが、
この二つで取得できるハンドルは同じウインドウでも違うものなんですか?
716 :
デフォルトの名無しさん :2006/08/04(金) 22:07:21
んなわきゃーない
717 :
704 :2006/08/04(金) 22:29:44
皆さんレスありがとうございます。
>>709 確かに。ただ、DLL側から呼びたい本体側のサブルーチンの数が多いのと、
Unixでは関数ポインタを使う必要がないので、より簡単な方法があれば
知りたいと考えました。
>>711 本体側のサブルーチンにエクスポート宣言を入れることは可能です。
しかし、得られるものが関数ポインタということは、やはりDLL側での
本体のサブルーチンの普通の関数呼出しの形では呼べないということですね。
どうやらDLL周りの設計をUnix版から大きく変えないといけないみたいです。
お騒がせしました。ありがとうございました。
718 :
704 :2006/08/04(金) 22:31:57
「DLL側では本体のサブルーチンを普通の関数呼出しの形で呼ぶことはできない」の誤りでした。
確かexeからエクスポートすることもできたはずだが HSPなんかが使ってたような
出来るよ。 DLLもEXEも大雑把に言えば、エントリポイントが違うだけで、同じモジュールなんだし。
Unixでは関数ポインタを使わなくてすむと言うのは、一体どういうことなのか気になる。
Windowsで言うなら
「exeからエクスポートした関数にインポートライブラリでDLLからリンクする」
みたいなことだと勝手にエスパーして
>>719 を書いてみたわけだが
OllyDbgでもプラグイン用に使ってるよ>Export
724 :
704 :2006/08/05(土) 10:06:15
内容:
>>719-720 ありがとうございます。「インポートライブラリ」という概念が分かっていませんでした。
本体側の関数をエクスポートしてインポートライブラリを作り、
プラグインの構築時にリンクすることで普通の関数呼び出しの形で呼び出せました。
試作したプログラムを添付してまとめに代えます。本当にありがとうございました。
/* 本体:gcc -o test1 test1.c -Wl,--out-implib,callback.a */
#include <windows.h>
#include <stdio.h>
const char *dlerror(void) {
static char last_error[1024];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), last_error, sizeof(last_error) / sizeof(char), NULL);
return last_error;
}
typedef int (*plugin_func_t)(int, int);
static int *x;
int main(int argc, char *argv[]){
HINSTANCE handle;
plugin_func_t func;
int a = 1, b = 2;
handle = LoadLibrary("foo.dll");
if (!handle) { printf("LoadLibrary: %s", dlerror()); return -1; }
func = (plugin_func_t)GetProcAddress(handle, "plugin_func");
if (!func) { printf("GetProcAddress: %s", dlerror()); return -1; }
x = (int *)malloc(sizeof(int));
printf("plugin_func(%d, %d) => %d\nx = %d\n", a, b, (*func)(a, b), *x);
return FreeLibrary(handle);
}
__declspec(dllexport) int /* __stdcall */ callback_func(int a, int b) { printf("callback_func: a = %d, b = %d\n", a, b); *x = a + b; return *x; } /* プラグイン:gcc -shared -Wl,--kill-at -o foo.dll foo.c callback.a */ __declspec(dllimport) int /* __stdcall */ callback_func(int, int); __declspec(dllexport) int /* __stdcall */ plugin_func(int a, int b) { printf("plugin_func: a = %d, b = %d\n", a, b); return callback_func(a, b); }
if (!GetMessageW(&msg, hWnd, 0, 0)) どうしてこのコードでWM_QUITか調べられるですか?
>>726 それはWM_QUITかどうかを判定してるわけじゃない。
GetMessageの説明をちゃんと読みましょう。
WM_QUITの値って0なのか? 分かりにくいからQUITで判定した方がいいと思うが
WM_QUIT メッセージを取得した場合、0 が返ります。
なるほど
>>726 そこhWndを引数にする必要はあるか?
732 :
デフォルトの名無しさん :2006/08/05(土) 12:03:00
SetWindowPosの解説に 「ウィンドウを最前面ウィンドウにするには、hWndInsertAfterパラメータで、 HWND_TOPMOSTフラグをセットしたうえでSWP_NOZORDERフラグをクリアするか…」 とあるんですが、SWP_NOZORDERフラグってどうやってクリアするんですか?
>>732 普通にSWP_SHOWWINDOW入れてSetForegroundWindowすればいいんじゃね
734 :
732 :2006/08/05(土) 12:26:06
>>733 他のウインドウで作業してる時に、
別のウインドウを非アクティブのまま操作したいんです。
それはSetWindowPosとなんか関係があるのか?
エスパーじゃないからどういう状況でどんな操作がしたいのかよくわからん
フラグの操作も知らんで今までよくやってこれたな
どうせネトゲのツールだろ
#include <wincrypt.h> してるのにその中で定義されてる HCRYPTPROV とかが未定義エラーになるのですが どうすれば良いのでしょうか?
wincrypt.hの中にif文みたいなのがあるだろ
741 :
732 :2006/08/05(土) 19:54:51
>>735-738 マウスを使わずにキーボードで非アクティブなウインドウを、
常に手前表示、解除して後ろに表示と切り替えたいんです。
プログラム作るの初めてなんでとっかかりでも教えてもらえると嬉しい。
743 :
tttttった :2006/08/05(土) 20:47:00
J#でAPIどうやって使うの? MIDIならしたいんだけど、VB.net ならわかるんだけど J#は 書き方がわからない。
744 :
732 :2006/08/05(土) 21:03:35
>>742 意地悪せずに教えて欲しいのです。ググりまくってここまでできたんですが、
repeat
p1_p = p1
getkey p1,120
if (p1=1) & (p1_p=0){ if a=0 {SetWindowPos hwndact,-1,0,0,0,0,1 or 2 or 16
a=1 }
else {SetWindowPos hwndact,-2,0,0,0,0,1 or 2 or 16
SetWindowPos hwndact,1,0,0,0,0,1 or 2 or 16
a=0}}
wait 2
loop
操作するウインドウがアクティブになってないと反応しません。
メモ帳のウインドウだと非アクティブでも反応するんですが…
ちなみにプログラム言語はHSPです。
747 :
tttttった :2006/08/05(土) 22:03:11
ぐぐったんだが わからんのだ。 J#のことがかかれてるいいHPないかな?
>>732 その質問はスレ違い。
ビット反転してAND取ればいいんだが、正直それが分からないレベルで
このスレに来られても非常に困る。
ビット反転してAND取るとオールクリアされちゃうんじゃw
でもなんにしても
>>732 はスレ違いだな。
750 :
デフォルトの名無しさん :2006/08/06(日) 00:04:51
>>744 こういう輩がHSPの評判をさげていくんだろうね。
俺の中では、既にHSPは厨房専用言語的な地位を占めているワケだけど。
753 :
デフォルトの名無しさん :2006/08/06(日) 00:22:32
問題はすぐには分からないが、誰がカスかはすぐに分かるからなw
755 :
749 :2006/08/06(日) 00:34:18
てっきり意地悪して今あるフラグをビット反転するように 言ってるのかと思ったんだよ、カスで悪かったなw
どっちにしろカスだけどな
757 :
デフォルトの名無しさん :2006/08/06(日) 02:42:30
BeginPaint と EndPaintについて質問があります WM_PAINTが来たときなどで BeginPaint() (文字列の描画処理) EndPaint() これだと上手く動くのですが BeginPaint() (文字列の一回目の描画処理) EndPaint() BeginPaint() (文字列の二回目描画処理) EndPaint() にしたら二回目が描画されません。BeginPaintとEndPaintは一回しか使用してはいけないのでしょうか? よろしくお願いします。
もっと言うと 「使用しなくても良い」 が正解
おれ毎日かかさず使ってたのに
MSDNのCB_ADDSTRINGメッセージでの返却値の説明に If insufficient space is available to store the new string, it is CB_ERRSPACE. とあるのですが、このinsufficient space(不十分な空白?)とは 何を指しているのでしょうか?
「バッファのサイズが不十分だった場合」
763 :
761 :2006/08/06(日) 09:49:55
>>762 ありがとうございます。
CB_ERRSPACEをググったら一番上に出てましたorz
764 :
757 :2006/08/06(日) 16:10:31
>>759 Validate??? を明示的に呼び出さないと、
不必要な WM_PAINT が、がんがんやって来るんじゃまいか?
実際のウィンドウのタイトル(左上に表示されているもの)と タスクバーに表示されているタイトルが違うアプリケーションがあるのですが あれはどのように実現しているのでしょうか?
>>767 ありがとうございました
なんとか実現できそうな感じです
770 :
デフォルトの名無しさん :2006/08/09(水) 11:35:48
リストビューに1000個アイテムを追加する時 描画が遅い感じがします。 追加した後に描画したいのですが可能でしょうか?
可能
仮想リストビューでぐぐれ
773 :
デフォルトの名無しさん :2006/08/09(水) 12:25:17
774 :
デフォルトの名無しさん :2006/08/09(水) 12:56:03
教えんよw
>>770 TListItems.BeginUpdate() / TListItems.EndUpdate()
>>770 最新のMSDN(英語版)を見ると、CallNextHookExの第1引数はNULLを渡せばいいことになってる。
だから、g_hHookWnd_gmを共用にしなくてもいいかも。
777 :
デフォルトの名無しさん :2006/08/09(水) 14:52:35
>>774 この手の馬鹿って、何を考えて生きてるんだろうね。
お前は俺か
お前は俺か
俺、俺だよ俺
自分のPCが共有している共有フォルダのローカルパスを知る方法がわからないので教えてください。 たとえば、\\local\hoge というUNCから c:\hage という共有元のフォルダ名を知りたいということです。
プログラムの2重起動禁止 で最も効率のいい方法って何かありますか? 方法は幾らかあると思うんですが、ここのスレに居る人のやり方を聞きたいです
起動するときにチェックするだけなんだから効率とかどうでもいい気もするが mutex
793 :
792 :2006/08/09(水) 18:29:59
orz
mutexばっかりか、ツマンネ じゃあ条件追加 重複時は先に起動してた方のウィンドウにフォーカスを合わせたいです
>>795 ググってもでてこないような裏技的な方法で頼む
HCBT_CREATEWNDをフックして殺す
MessageBox(NULL, _T("多重起動なら、先に起動した方のウィンドウにフォーカスを合わせてください"), _T("多重起動チェック"), MB_OK);
MutexとFindWindowを使う方法 Mutexとレジストリを使う方法 Mutexを使わないでファイルマッピングを使う方法 Windowsじゃなくて自分しか立ち上がらないようにして再起動する方法 (Win95時代のCD焼きソフトにこんなのがあった。) というわけで788もよろしくです。
・最強 ・超 ・裏技 ・絶対
・最強のアプリケーションが作りたいです!!! ・超簡単に作りたいので、 ・裏技を教えてください!!! ・絶対ありますよね!
>>788 net share 相当のことをAPIでやるってことですよね。
なんとなくWNetOpenEnum と WnetEnumResource で列挙すれば
良いような気がする。
>>794 ファイルマッピングにハンドルつっこんどけば?
>>多重起動防止 オレは、ウィンドウクラス名にユニークなものを付けて、起動時にFindWindowで チェック、見つけたら起動中止&見つけたウィンドウをアクティブにしてる。 (ウィンドウができないくらい)超短時間で二重起動されたらダメだが・・・・・
>>806 > 超短時間で二重起動
そんな感じで、二重起動できないソフトを二重起動させてしまったことがある。
スタートアップ中に待ちきれなくて、2度もそのソフトをスタートメニューから呼んだらそうなった。
>>807 ウィルス対策ソフトでリアルタイムスキャンなんかしてると頻発する
ウィルス対策ソフトを同時起動させれば効果2倍ですね!
いや、頻発するような二重起動チェックするなよw
ごもっとも
普通にMutexでいいじゃん
そういえばWin32Tipsサイトってみんな二重起動チェックあるけど 飽きないのかなあ
814 :
デフォルトの名無しさん :2006/08/09(水) 22:10:28
1バイトからメモリやOSが許す限界まで(可能なら4G↑) 動的にメモリの確保を行いたいんですが mallocやrealloc(重要)みたいなAPIはないですか? ヘルプ見る限り上記の仕様だとヒープ領域はよろしくないと感じたので どなたか知っていたら教えてください。
VirtualAllocはいかが?
>>815 ありがとうございます。ちなみにreallocに近い動作は出来るのでしょうか?
>>816 ヒープ管理がほしかったら、
そのまんまの名前、HeapCreate()からHeapAlloc(), HeapReAlloc()などがまさにそれ。
>>807 タスクマネージャが二重起動したことがある。
.,Å、 .r-‐i'''''''''''i''''‐-、 o| o! .o i o !o .|\__|`‐´`‐/|__/| |_, ─''''''''''''─ ,、 / _ / \ / / ヽ | ● ⌒) ● | ! 、__) ノ 丶_ ノ /´ ヽ` ̄ ー-゙:.、 おっぱい吸ってね i - 、 `ヽ_ l: 、.: ヽ ゙i" ! i ; n .:c.: ', _..ハ | ハ/ { _,..-ァノ 、r‐、>ー ヽ | ト./ ` ̄__,.:=彡 :.ヾ、ニ二 / . | |ノ -=< ゙=tラ'" | / ,-一'" ̄´ i |:/ / \:. ! | ' / ヽ:. :、 \ ゙、 ノ .i:. ` ヽ `ー' _:/__:. `ー---─ ''"´ ̄ ̄`` ー- 、 /´ `ヽ、. .: `ヽ、 / `ヽ、 ゙i i まんこも なめてね :; ,! ! ‐-、 :. ;: .:' / ヽ ヽ ; j:! " __..:-‐'"´ ̄ ̄` __ノ \ ! .:' 〃 ,..:---─‐'"´ __.. -──── ''"´ `ヽ、 ヽ、 ノ-く⌒ヾ:.:'ー--ァ'"´ `ヽ、 >:)..( );;;;;;}:/` ̄i
>>816 もちろんできる。
VirtualAllocの最初の引数かどこかに、割り当てたい位置へのポインタを指定するという引数があるだろ。
>>820 realloc()とは違うだろそれは。
ページサイズ単位でしか確保できないぞ。
realloc()と同じ用途で使うには不向き。
メモリをOSから「確保」するのは遅いし。
実行されるアプリケーションの情報を集めたいのですが、 可能でしょうか? 何かのアプリケーションが実行されるたびにメッセージが送られてくる みたいなAPIはないでしょうか?
SetCursorPos API でカーソルを移動するとそのウィンドウに WM_MOUSEMOVE メッセージが飛んできますが、 それを飛んでこないようにカーソルを移動できないでしょうか。 諸事情により、"マウスで"移動した場合の処理をしたいのです。
>>822 デバドラなら可能。
プロセス・スレッド起動時、プロセス・スレッド終了時
それぞれのイベントをトレース可能。
>>822 CreateProcessにグローバルフック掛ければ?
定期的にポーリングするのでよければ、CreateToolhelp32Snapshot()が簡単
APIフックとグローバルフックの違いを分かってて言ってるんだろうか
SendInputで渡した個々のINPUTのイベントを任意の間隔(ms)で 実行する方法ってある? 物凄いスピードで実行されるんでちょっと困ってる。 ki.timeとかmi.timeとか使えるかと思ったら全然関係ない見たい出汁
>>827 任意の間隔でSendInputすればいいじゃん
いや、他のイベントに干渉されずに一連の動作をしたいんだ。 せっかくまとめて送信できるのに1個ずつに分けるのも面倒だし・・・
SendInputをラッピングして、イベントを分割してSendInputしてくれるシーケンサースレッドを 作ってそれに渡す。
他のイベントに干渉されないようにSendInputを使うなら、 イベントを個別に分割すると意味が無いような。
wsprintfってbufferが1024バイト限界って書いてますが、 char buffer[3000]=""; wsprintf(buffer,"a='%s',b='%s',c='%s'.........",a,b,c,d.......); と70個くらい文字列を渡してSQL文を作ろうとしてるのですが、 どうもwsprintfのせいでうまくいきません。 同じように使える 代わりに使う関数のお勧めありますか?
>>829 任意の間隔舞っている間に、
他のプロセス、もしくはユーザが入力をするというのは考えられんのか。
あるいは、いかなる方法をもってしてもそんなことはさせたくないのか……。
スレッドの優先度をリアルタイムにs(ry
>>832 sprintf, std::stringstream, boost::format
普通に文字列連結させればいいんじゃ・・・
>>823 意味がわからん
マウスで移動した場合の処理がしたいならWM_MOUSEMOVEいるじゃねぇかとおもうのはおれだけか
837 :
823 :2006/08/10(木) 17:50:57
>>836 マウスで移動した場合は処理したいけど、
プログラム側で移動した場合は処理したくない。
だから SetCursorPos API で WM_MOUSEMOVE が発生するのはマズーなのです。
なんかいい方法ないでしょうか...
プログラム側で移動させるんならフラグでも立てて処理させなきゃいいじゃん
839 :
デフォルトの名無しさん :2006/08/10(木) 20:51:17
リストビューで ツールチップを表示している上(表示していない場合もあり)からダブルクリックした場合に ブラウザを起動する処理なのですが うまくメッセージが取れません。 ツールチップがある時はトリプルクリックで成功します。 そこで次のように書きました case WM_LBUTTONDOWN: EraseListViewTips(); return CallWindowProc(original_procedure, hWnd, message, wParam, lParam); case WM_LBUTTONDBLCLK: MessageBox(hWnd, "ダブルクリック", "debug", 0); EraseListViewTips()はツールチップを消す関数です。 これで成功するのですが一般的にはどうするのでしょうか? 欲を言うとツールチップを消さずにメッセージを取りたいのです
>>832 char buffer[0x8000];
buffer[0] = '\0';
//条件
if (略){
::lstrcat(buffer, "SELECT DB.A ");
}else
:
などなど
TextOutで文字列を描画したときの 各文字の正確な位置や幅を知る方法は無いでしょうか? GetTextExtentPoint32やGetCharABCWidthsを使うと MSゴシックではいいのですがCourier Newにするとずれてしまいます。
DrawText() の DT_CALCRECT でも駄目?
843 :
841 :2006/08/11(金) 01:09:45
自宅のWin2kで実行したところ、文字列自体がうまく表示できませんでした。 文字列に記号が混ざっており、会社のWinXPだとCourier Newでも うまく出たんですが、Win2kだと□になりました。 □になった状態だとGetTextExtentPoint32やDrawTextでうまくいきました。 (文字列:L"Δ∇Δ∇" WinXPで描画:Δ∇Δ∇ Win2kで描画:Δ□Δ□) XPのとき、フォントに含まれない文字も描画されるのはなぜなんでしょうか? そのときの表示幅を得るにはどうすればいいのでしょうか?
>>843 たぶんXPでうまく表示されるのは、フォントリンクが働いているためだと思う。
ちなみに2000でもフォントリンクは使える。
ただXPよりデフォルトで指定されているリンクの数は少なかったはず。
質問です。 自前でリストビューでツールチップを表示させているのですが 自動でできないのでしょうか?
846 :
デフォルトの名無しさん :2006/08/11(金) 11:42:14
できるよ クリエイトウィンドウの時に(ry
>>841 文字列の一部を枠で囲ったりマウスでのヒットテストをするために
各文字の位置を知りたいのなら GetTextExtentExPoint を使う。
指定した幅に収まる文字数も返してくれるので、
矩形内で折り返したりするものは自力で1行ずつ処理。
javaで作られたソフトのリストボックの各項目の左側(12mm?) の位置をクリック したいのです。 javaはリストボックスなどを自前で描画しているとの事です。(listview to CVS より) 調べたらWM_LBUTTONDOWNメッセージを送ればいいとの事ですがそれには 座標の計算?が必要だそうです。 質問はWinAPIで リストボックスの項目の数を取得 各項目の位置(座標)を取得 メッセージを送信 これはWinAPIで可能でしょうか?
>>848 SWT (Java のアプリで Win32 の各種コントロールを用いている)なら
多少のハックでできると思うけど、
PureJava だとかなりのハックをしないと出来ないんじゃないかな。
850 :
デフォルトの名無しさん :2006/08/11(金) 15:04:57
API の話ではないのですが、abc.dll の名前を xyz.dll に変えたい場合、 abc.lib をどのように編集して xyz.lib を作ればよいでしょうか。 abc.dll のソースは入手できないものとします。
>>850 abc.libをバイナリエディタで開いてabcと書かれているところをxyzに変更。
852 :
デフォルトの名無しさん :2006/08/11(金) 15:40:18
>>851 xyzuvw.dll に変更したかったら?
pexports, dlltool でインポートライブラリ作成できる
854 :
845 :2006/08/11(金) 17:17:36
>>846 自動 ツールチップ リストビュー
で検索しても見つかりません。
教えていただけませんでしょうか?
855 :
788 :2006/08/11(金) 17:25:01
>>839 TTM_SETTOOLINFOでTTF_TRANSPARENT 指定しているのに、
ダブルクリックが阻害されるという話ですか?
WH_KEYBOARDをグローバルフックしてると、SendInput()でキーストロークを 送信しても最初のイベントしか実行されないんだが何でだろう? フックを外すとSendInput()に渡したイベント全部実行されるんだけどフック してるとダメポ。 フックハンドラ内でCallNextHookEx()もしてるんだけど、どうしてもうまく行かない。 誰か知ってたら教えてください。お願いします。
>>857 フックハンドラが間違ってるんじゃない?
ソース晒さないと、それ以上はわからん
なんつうか最近入力をフックしたい人が多いねぇ 夏休みの宿題でキーロガー作れとかあるんだろうか
フック自体は働いてる(キーも取れるし他のアプリの邪魔もしない)し
keybd_event()やデータが1個しかないSendInput()だと同時に動くんだけど
と思ったら、フック外してもダメだ。
MOUSE_INPUTはフック無しで動いたから大丈夫と思ってたけど自分のミスっぽい。
ごめん自分で調べてみます。
>>859 自分のはそんな怪しいものでは無いです。
勉強がてら、ちょこちょこと手動操作の自動化をして自己満足に浸ってるだけw
俺も最近フックに興味もって色々調べだした 腕試しにネトゲの多重起動を実行ファイルをバイナリィエディタで弄らずに成功させる方法として APIファックを使おうと考えたわけだが…・ CreateMutexはまさにexeがメモリにマッピングされた瞬間くらいから呼ばれるわけで… まだ起動していないプロセスにどうやって寄生虫をファックさせるのかという壁にぶちあたった('A`)
>>861 CREATE_SUSPENDED API Hook でググれ。
他プロセスの「画像の保存ダイアログ」の 元ファイルのパスを取得するにはどうすればいいのでしょうか?
865 :
864 :2006/08/12(土) 17:21:32
いいから俺のちんこを最適化しろ
そのまえにデバッグしろ
よくある設定ダイアログで、 左のツリービューにカテゴリーがあって、 右側に各種項目が表示されるタイプのがありますが、 あれって、右側はどういうコントロールを使っているんでしょう?
よくあると言われてもどれの事やらよく判らん
>>868 tweak UIでもspy++で見てみればいいじゃん
>>868 チャイルド属性つきのダイアログ
それを左側の選択で、各項目毎のに張り替える
873 :
845 :2006/08/13(日) 14:39:54
875 :
845 :2006/08/13(日) 15:14:42
ツリービューは書いてますけどリストビューは書いてません
可能な限り調べました?
>>845 =873
そもそも、質問が曖昧。
リストビューのコントロールにたいして「りすとびゅー」てなツールチップを表示したいのか、
表示されているリストビューアイテム一つ一つに対して「あいてむ1」という感じにツールチップの内容を変えないと行けないのか、
はたまた、ぜんぜん違う事を考えているのか、
おまいさんの質問からは読み取れない。
878 :
845 :2006/08/13(日) 16:37:50
チンカスは黙ってろ 分かる方だけ返答をお願いします
…
これは醜い
>>878 既に2日経ってるのに
ここで返答が返ってこない限り何もしない気なの?
偽物にマジレスするのが流行ってるの?
884 :
845 :2006/08/14(月) 08:34:02
>>878 は偽者です。
FFFTPのソースを見ましたけど独自に描画しているのです。
ツリービューは横スクロールバーが付くときは
自動でツールチップが表示されますよね?
そういうのがリストビューには無いのですか?
>>884 過去レス見ずに一言。
リストビューはセルの幅が足りないときにはツールチップが出ますがそれのことではない?
こんな感じ
┼────┼
│ 幅の足...│
┼────┼
↓
┼┌────────┐
││ 幅の足りないセル│
┼└────────┘
886 :
デフォルトの名無しさん :2006/08/14(月) 09:59:42
WinXPでタスクバーでグループ化されたときのタスクバーボタンのキャプション設定方法しりませんか? SDKのタスクバー項を眺めてもそれらしい情報無しです。 Officeとかは設定できているみたいです。 設定しないと、exeの名称になっとる。
バージョン情報リソースの説明だと思われ つまり動的に設定はできない。
888 :
デフォルトの名無しさん :2006/08/14(月) 11:04:59
>>887 レスありがとう。ためしてみたけど、できるやつとできないやつがあります。
VC6, VB6で作ったexe → exe名が表示される
あと、manifest情報も、リソースで設定したり、manifestファイルで設定してみたけど、
exe名が表示されてしまいました。
>>885 それを出すのになにかスタイルが必要じゃないですか?
普通にやってもでないのですが?
使えないとは?英語読めないの?
非常にものぐさな意見で申し訳ないんだが、事前に要約してくれた 情報があると英文も読み易くなるので嬉しいかも。
894 :
891 :2006/08/14(月) 15:07:38
間違えたスマン 英語は読めんけど LABELね TOOLで検索してたw
>845 無い。自分で実装汁。もうしてるみたいだけど。
897 :
デフォルトの名無しさん :2006/08/15(火) 18:12:54
アプリを実行したユーザが誰かわかる方法ってありますか? UNIXでいえばgetuidみたいな奴
あるよ
899 :
897 :2006/08/15(火) 18:17:20
>>898 本当ですか?
できればメソッド名を教えていただきたいのですが。
だめ?
だめ
まずググレカス
知らなかったからググったら腐る程出てきたんだっつの
キーワード教えてよ〜
教えてよ〜
ググルがよい
教えてくれなきゃ何もできないよ〜
908 :
904 :2006/08/15(火) 19:59:05
909 :
901 :2006/08/15(火) 20:18:03
うっせーな。知りませんでしたよ、んなもん。 しるかっつーの!!
ぐぐれるだけマシだ
GetUserName でいいのかと思ってたら もっと高度な話だったのか・・・
914 :
904 :2006/08/16(水) 00:31:07
RunAs/Secondary Logonサービスが出来てから プロセスの実行権限が複雑になったらしい。 (トークンの概念はNT時代からあった。) Vistaはこれをさらに強化したとか。 いずれこの辺の面倒臭い技術は避けて通れなくなるかも。
猫でもできるプログラミングのメニュー付VS2005サンプルを実行して ウインドウ閉じたときにでる確認ボックスでいいえを選んだらもう一回 ボックスが出るんですけど何ででしょうか?
916 :
デフォルトの名無しさん :2006/08/16(水) 01:28:23
ちんちんかゆい
ウィンドウのクライアント領域に、ファイルをドラッグした時の ファイル名の取得はどうすればいいんでしょうか?
DragQueryFile
RegisterDragDropでもできる テキストやらビットマップやら各種OLEデータも受け付ける場合はこっち
920 :
デフォルトの名無しさん :2006/08/16(水) 14:52:06
メモ帳風エジタを作ろうとして、とりあえずメインウィンドウのクライアント領域に 複数行エジットコントロール(自動スクロールバー付き)を貼り付けてみました。 ところが、垂直スクロールバーの方は、行がウィンドウの高さ以上になればちゃんと自動で出て来くるし、 ウィンドウ内に納まる状態になれば、きちんと使用不可状態になるんですが、 水平スクロールバーが、文字列の長さがウィンドウ以上になった後、 改行してはみ出さなくしても、そのまま、前にはみ出したところまで スクロールできるままの状態になり、戻りません。 これを直すにはどうしたらいいでしょうか? ちなみに、メモ帳(本物)でもそうなっているようです。
エジタとかエジットとか猫プロの中の人ですか? ちなみにディはDHIで出せます
ふと思ったんですが、 FindFirstFile( "*.*", ... と FindFirstFile( "*", ... って、 列挙結果に違いあるんですかね? (そもそも *.* としたときに . を含まないファイルやフォルダにマッチするのは、何故?)
DOS時代の変な仕様をいまだに引きずっているわけだ。
>>922 仕様らしい。
救いなのは*.*で全取得が可能な事。
おれはFindFirstFileに*.*を指定して全取得して、
自分で納得いくマッチ処理でフィルタリングしてる。
自分でマッチ処理を書くのが面倒ならPathMatchSpecというAPIがある。
このAPIは聞いた話だとFindFirstFileよりはマシらしい。
*.*で . を含まないファイルにマッチするのは紛れもなくDOSとの互換性のためだぞ
DOSじゃなくてFATでしょ
「.」と「..」も取得するのとかもかなりいらない仕様だよな
たまにプログラムの最初で DefWindowProc(NULL, 0, 0, 0) とやってるのがありますが、どういう効果があるんでしょうか
UNICOW's… 日本人がコメントに”うにコード”とか書くようなモンか
stlってwindows.hをインクルードすると使えないんですか? GUIとc++のライブラリ使いたいんで・・・
んなこたーない。
〜_sとか新しい関数が出てきて混乱してるんだけど その辺を網羅した参考書って出てる?
は?
Cランタイムのことならスレ違い
>>933 UNICOWSはMSLUの別名。
>>934 <algorithm>のstd::max, std::min関数と
<windows.h>の中のどこかのヘッダにあるmax, minマクロで、名前がかぶっているのがまずい。
<windows.h>がインクルードされるより前にNOMINMAXを定義(#define)して、
maxとminのマクロが定義されないようにする必要があるはず。
VC++って普段は(ぶいしーぷらぷら)って読んでるんですが、 フォーマルな読み方はありますか?
Cスレじゃねーんだよアホ共
ヴィスィープラスプラス
現在選択しているフォントに含まれない文字が フォントリンクによってTextOutで描画される場合の 描画幅を得るにはどうすればいいんでしょうか?
98でもAnimateWindow使えるのですか?
>>945 使えるんですね。ありがとうございました。
シャットダウンの処理について質問させてください。 WM_QUERYENDSESSIONでシャットダウンを検知した後、 全ウィンドウの後始末処理をさせるためPostQuitMessage(0)を実行して、 後始末が完了するまでまで待つ。という処理を行っているのですが、 WM_QUERYENDSESSIONが通知された後にPostQuitMessage(0)を実行した場合、 GetMessageがブロッキングしたまま終了してくれず、後始末完了まち状態で固まってしまいます。 GetMessageがブロッキングしたまま固まるのは仕様なのでしょうか?
948 :
947 :2006/08/18(金) 00:17:45
つまりは、PostQuitMessageによって全ウィンドウに WM_QUITが伝わってほしいのですが、WM_QUERYENDSESSION後だと伝わらないので困っています。
> PostQuitMessageによって全ウィンドウに > WM_QUITが伝わってほしいのですが PostQuitMessageについて激しく勘違いしてる悪寒
Lunaスタイル適用したら、コンボボックスのドロップダウンがびろ〜ん伸びるねん。 スタイル外すとちゃんと設定した大きさで表示される。 なんでですか?
こういうコードは良いんですか?コールバックとか登録してないけど #include <windows.h> #include <iostream.h> #include <fstream.h> int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { char buf[512]; // ifstreamのインスタンスを作る // C言語のfopenと同じ ifstream ifs( "input.txt" ) ; // ofstreamのインスタンスを作る // C言語のfopenと同じ ofstream ofs( "output.txt" ) ; // ifstreamのインスタンス(ifs)から1行読み込みbufに入れる。 while( ifs.getline( buf, sizeof(buf) )) // ofstreamのインスタンス(ofs)を利用して読み込んだ内容を書き込む ofs << buf << endl; return 0; }
>>951 「コールバックとか登録」って何?
あと <iostream.h> <fstream.h> は古いからやめなさい。
<iostream> <fstream>を使え。
WNDCLASSEXとか LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) とかです、よく考えるとあれはシステムに詠んで貰うためだから、 コンソールみたいな上から下に向かって順序良く進む場合はいらないんですか? もし #include <windows.h> #include <iostream> #include <fstream> とした場合下のようなのが出て error C2065: 'ifstream' : 定義されていない識別子です。c:\win32\win32\main.cpp 13 #include <windows.h> #include <iostream> #include <fstream.h> とおくと fstream.hは開けませんと出て STLportで #include <windows.h> #include <iostream> #include <fstream> とおくと、下のように出て error C2065: 'ifstream' : 定義されていない識別子です。c:\win32\win32\main.cpp #include <windows.h> #include <iostream> #include <fstream.h> とおくと、コンパイルできるんですorz設定を間違ってるのかな・・・
>>951 WinMainなプログラムでウィンドウを開かず、必要な処理だけしてすぐに終了しても構わんし、
逆にmainなプログラムでウィンドウを開いてもよい。
956 :
947 :2006/08/18(金) 10:52:38
>>949 まぢですか。
とりあえず、GetMessageのブロッキングが解除されてほしいのですが…。
WM_QUERYENDSESSION後だとなにやってもメインループのGetMessageが制御を返してくれません…。
>>955 あ・・・・・・そういえばそんなのがありましたね、忘れてました。
958 :
947 :2006/08/18(金) 11:20:30
あっ、ごめんなさい。 なんか勘違いしてたかも。 質問は無視しちゃってください。
959 :
950 :2006/08/18(金) 11:44:34
No Integral HeightのプロパティがFALSEになってたよいつの間にか! あほか!
タブコントロールのタブがある行の余白の部分だけ(AA参照)を、標準色とは違う色で 描画したい(最終目的は親ダイアログに貼られているビットマップを 透過しているように見せかける)。 ┌────┐──────┐ │ タブ1 │ タブ2 │ここの余白の色を変えたい │ └──────┴───────────┐ 調べた限りでは、オーナードローをするしかないのかな?と思うんだけど、 オーナードローだと、タブの部分もちまちま描くのがマンドクセだし、さらに XPのVisual Styleにも対応しなきゃいけないので、さらにマンドクセ('A`)('A`) 他に簡単にできる方法があれば教えてください。
マスク処理したグループボックスの上にでものせてお茶を濁すのが吉
>>961 早速作ってみたです。
バッチリです。これなら普通の人にはバレないくらいにちゃんとできてるです。
ありがとうございました。
やっぱPGに一番必要なのは、関数を覚えることよりもやわらかアタマだねぇ。
と毎度のことながら痛感させられました。
963 :
デフォルトの名無しさん :2006/08/18(金) 19:49:04
>>961 , 962
目からうろこ。詳しくお願いします。
API でネットワーク接続の有効/無効を切り替える方法を調べているんですが、 どの API を使えば良いのでしょうか。 Vista であれば WMI を使って切り替えられるのは分かったのですが、2000/2003/XP では WMI を使って切り替えることは出来ないようで。
>>965 どもです。
netsh の dump/exec を使ってみましたが、ネットワーク接続の有効/無効を
切り替えることは出来ないようです。
>>961-962 すまん、オレも知りたい。
WM_PAINT の時に子コントロールの画像をマスクするわけか?
というか、タブの形をどうやって知ったんだ?
ハンドルを返す関数が失敗してNULLを返した時は、 DleteObject() で開放しなくてもいいんですよね
最後のタブの隣に適当なコントロールを置いて、
そいつにDrawItemでタブの下に隠れた背景を描画するようにしたらどうだろう?
いずれにせよ
>>961-962 の解答待ちw
複数のコンボボックスがあってある特定のコンボボックスの選択項目が 変更された時のみ更新をかけるっていう事やりたいんですけど単純に if(HIWORD(wParam) == CBN_SELCHANGE) 処理; とかでやるとすべてのコンボボックスが対象になってしまうと思うんですけど これを回避するにはどうすればいいんでしょうか?
972 :
971 :2006/08/19(土) 11:57:57
デバッグで見たところlParamが変わってたからそれどうにかすればいいのかな
973 :
971 :2006/08/19(土) 12:02:32
lParamとコントロールのハンドル比較でできました。 if(HIWORD(wParam) == CBN_SELCHANGE && lParam == HWND) 処理; ちなみにこの場合、HIWORDとLOWORDに分けなくていいんでしょうか?
975 :
971 :2006/08/19(土) 12:53:55
>>ところでよくキャスト無しでLPARAM型とHWND型の値を比較できるな。 すいません(´・ω・`)
>>969 何も得られてないのに、何を解放しようというのだ。
例えば、デスクトップからごみ箱を開くと、 ファイル名を指定して個別にファイルを完全削除が行えますが、 GUI を使わずに、ごみ箱内のファイルリストを得たり、 ごみ箱ないのファイルに操作を行なうには、どうしたら良いのでしょうか? SHEmptyRecycleBin と SHQueryRecycleBin では期待していることができなさそうです。
ルートにRECYCLERってSystem, Hiddenフォルダがあるから そん中を思う存分漁るといい
979 :
977 :2006/08/20(日) 05:30:16
ちゃんとやりたいならシェルネームスペース周りから攻めた方が良い
981 :
977 :2006/08/20(日) 07:22:21
>>980 どうもです。
検索してみたんですが、使い方に関する情報が無いですね...
>>981 たしかに、シェル回りことで日本語の情報は少ないよ。
983 :
デフォルトの名無しさん :2006/08/20(日) 08:19:27
IShellFolder とか PIDL でググれば結構出てくる
ageちったゴメn
質問があるのですが int _tmain(int argc, _TCHAR* argv[]) { ::MessageBox(NULL, "aaa", "bbb", MB_OK); return 0; } このプログラムをビルドすると error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [4]' to 'LPCWSTR' というエラーが出るのですが、そんな事はどうでも良くて 埋め
確かに、そんなFAQどうでもいいわな。
UNICOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOODE
UNCODE
↑ VERY COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL!
うにこぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉど
うにもぐ、て車あったね
うにっくす
梅子
梅方梅朗
996
オーナー描画ボタンにbmp貼り付けることは出来ますか?
出来ません
マジすか orz な、なら何かのボタンにbmp貼り付けは…? それも出来ないとしたら、ボタンぽいのを自分で書くしかないんですかね
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。