1 :
デフォルトの名無しさん :
2010/05/27(木) 17:42:14
5 :
1 :2010/05/27(木) 17:45:32
自分で張っといて何だけど、過去スレリンクもう要らないんじゃない?
>>1 の前スレリンクあれば過去スレはたどれるんだし、ピンポイントであの過去スレが読みたい
なんて人いないでしょ?
wikiにも過去スレのリンクあるしね。 無くてもいいとは思う
そういう事は前スレで提案しなさいよ!
8 :
1 :2010/05/27(木) 18:03:27
プッシュボタンを押すapiはありますか? 例えば push(A);でAボタンが押されるみたいな
ありますん
12 :
デフォルトの名無しさん :2010/05/28(金) 21:50:30
findwindowを使ってウインドウハンドルを取得しているんですが、 タイトルバーのないウインドウハンドルを取得するにはどうしたらいんでしょうか?
>>13 特定のソフトにしかないと思ってたんですが、
クラス名を調べられるソフトがあるんですね。ありがとうございます
SPY++ってのがあってだな。
二次関数みたいな散布図のグラフを描画したいのですが SetPixel関数だと小数や負の値に対応できず困っています こういったグラフを描画する場合にはどのような手法が 一般的に用いられているのでしょうか?
-100〜100を0〜200にするとか 0〜100.00を0〜10000にするなどあるだろ。
ヘッダーファイルに以下のプロトタイプ宣言を記述したいのですが void start(HWND hwnd); 'HWND' : 定義されていない識別子です。と出てきてしまいます。 これはどうすればコンパイルできるようになりますか?
typedef HWND int
そういう問題じゃないような気がするがどうでもいいか
windows.h をインクルード。
>>19-21 ありがとうございます
windows.hをヘッダーにインクルードすると
.obj で定義されています。というエラーが出てしまいました・・・
23 :
22 :2010/05/29(土) 10:12:35
解決しました みなさんありがとうございました
>>15 そんなツールがあったんですね。
ありがとうございます!
指定したファイルがリネーム可能な状態かどうかの判定ってできるかな?
>>25 if(MoveFile("a","a")){
}
なんと!
CreateProcessする時の環境変数を、親プロセスから引き継がずに自前で用意しようとしています。 その中身として、システムのプロパティの詳細設定で設定したものを使いたいのですが、 Win32APIやShell32あたりで取得する方法はないでしょうか? または、システムのプロパティの環境変数の設定が行われたら即座に親プロセス側の環境変数を 連動して変更するようにすることは可能でしょうか?
>>28 前者はSetEnvironmentVariable
後者は変更してくれというメッセージを親プロセスに送る
乗り遅れたけど全スレのRichEditの問題って解決した? RICHED20Aに対してEM_GETLINEやるとどうも尻切れする。 len = SendMessage(handle, EM_GETLINE で返されるlenがどうも常にUnicodeの文字数になる。マニュアルにはTCHARs copiedって書いてあるんだが。 EM_LINELENGTHでも同じ。
>>30 RichEditは知らないが、通常のエディットボックスでビジュアルスタイルを使うと
ANSI版だろうが、Unicode版の動作するという問題あるよな。
32 :
30 :2010/05/30(日) 09:20:26
おお、ありがとう。ビジュアルスタイルについて調べてみます。
32x32より大きいアイコンをexeやdllから抽出するにはどうすればいいですか?
>>29 ありがとうございます。ちょっとやりたかったことと違いましたが、後者はWM_SETTINGCHANGEだとわかりました。
その後の調査でRegenerateUserEnvironment という未公開APIを見つけたのでこれを使うことにしました。
メニューバーの名前で(&文字)と書くことでAlt+文字を押すことでメニューを開けると思うのですが、 一般的なプログラムのように同時に押せば開くようにするにはどのようにすればいいのでしょうか? 現状ではAltキーをいったん話してメニューにフォーカスが合ってからでしか動作しません。
timeBeginPeriod() で設定した値はシステム全体に影響するようなのですが、 今いくつに設定されているのかを知る方法はありますか ? また、どのプロセスが設定しているのかを知る方法はありますか ? 教えて下さい。
40 :
デフォルトの名無しさん :2010/05/31(月) 18:03:04
('д`)えー
現在ShellExecuteでURLを起動しているのですが、これをCreateProcessに置き換えなければいけなくなりました そこで、既定のブラウザで起動できるようにURL形式の文字列をブラウザのパス(および引数)にしたいのですが、そんなAPIはありませんか?
ShellExecute
44 :
デフォルトの名無しさん :2010/05/31(月) 19:05:01
Windows7だと何かGetKeyStateが正しく返ってこない それかキーの認識が異常に遅いんだが・・・ これに変わって押されてるキーを識別するAPI教えてください
>>45 ありがとうございます。
ですが、知りたいのはメニューバー内にあるコマンドのアクセレータではなく、
メニューでファイル(&F)となっている時にAltと同時にFを押すことによってドロップダウンさせる方法です
くだらない質問なのですが、 DLL_PROCESS_ATTACHにてアタッチされた際に GetProcessHeap()を呼ぶとエラーが返されてしまうのですが、 上記が発生してしまう原因と回避方法を教えていただきたいです。 よろしくお願いします。
>>46 エディットコントロールにフォーカス入ってると Alt+F がエディット側に喰われて親に届いてないくさい
Alt↓ ↑ F で親のメニュー側にフォーカスされて 配送されてるっぽいが…
フォーカスを掴んでるコントロール次第じゃねーかな? (親に送ってるかどうか?)
ウインドウ作成中のウインドウメッセージはWM_CREATEですが、 ウインドウ作成後のウインドウメッセージなんてものはあるのでしょうか。 また、無ければ代替案を教えてください。
WM_CREATEは作成後だろ。 単にAPIから戻る前に投げられるというだけで。
クライアント領域が無いという意味では WM_NCCREATE のほうが先に届く もっと先には WM_GETMINMAXINFO が飛んできたり… サブクラス化するにしても(WM_CREATEが実質来ないということに注意する程度で) あまり気にしたことはないが、CreateWindow(Ex) 帰還後、真っ先に届くのはケースバイケースかなぁ
色々来てたような気はするが、ウィンドウプロシージャの先頭に TRACEでも置いておけば何が来てるかくらい調べられると思うが
WM_CREATEハンドラからWM_APPをポストする。
>>44 WM_KEYDOWNとWM_KEYUPを監視して自分で管理
IMEを利用して100文字くらい入力続けていると 入力途中でもWM_IME_COMPOSITIONが送られてしまうのですが仕様でしょうか
>>55 メモ帳で試してみたら、むしろ一文字入力毎に送られてきたのだが。
環境はx64Win7+OfficeIME2010。
入力途中に送られてくるのが普通、位に考えておけば良いんじゃないか?
すみません説明不足でした 入力途中にもかかわらず(確定していない)のに GCS_RESULTSTRが含まれているんです。
リソースでメニューバーを作成したときに ウィンドウのリサイズすると、ちらつくのはどう対処すればいいの?
>>57 MS-IMEには、ある程度以上長く入力すると、
操作とは無関係に初めの方から自動的に確定していく仕様があるのだが、
それじゃないか?
60 :
デフォルトの名無しさん :2010/06/02(水) 10:50:47
Windows7だとGetPixelがすんごい遅いんですが XPみたいにサクサクGetPixelする方法を教えてください
Aeroを切る
62 :
デフォルトの名無しさん :2010/06/02(水) 14:27:19
なあブタ共、ウィンドウハンドルから直接GetPixelする方法ってないか? あったら教えろよブタ共
直接という意味がDCを経由しないということなら無理
64 :
デフォルトの名無しさん :2010/06/02(水) 16:00:47
そうですかありがとうございましたブタ野郎
GUIプログラムになれていなんですけど 子ウインドウとかダイアログってマネージャークラスみたいなのが生成と破棄を管理すべき?
66 :
デフォルトの名無しさん :2010/06/02(水) 18:22:45
ん
ごめんなさいスレ違いっぽいですね、皆様気にしないで下さい
68 :
デフォルトの名無しさん :2010/06/02(水) 18:42:39
いや許さん
MDIで、フレームウインドウを非表示、子ウインドウを表示と言った事は可能でしょうか。
無理 親が非表示だと子も非表示なるよ
回答有難うございます。
やりたいこと: ・JNIを用いてWindows7のマルチタッチメッセージをJavaで拾いたい →とりあえずJavaのFrameクラスへのWM_TOUCH/WM_GESTUREメッセージを拾いたい 試したこと: JavaのFrameクラスのハンドルに対してRegisterTouchWindowを行い ・WH_CALLWNDPROCRET ・WH_GETMESSAGE ・WM_MOUSE_LL あたりをSetWindowsHookExでフック 結果: WM_TOUCH/WM_GESTUREメッセージが拾えない (マウスUP/DOWNメッセージやWM_PAINT/WM_NCHITTESTなんかは拾えている) 調べてみたら、RegisterTouchWindowの戻りがFALSEになってて GetLastErrorでERROR_ACCESS_DENIEDが返ってきていた (RegisterTouchWindowに渡すハンドルが正しいことは確認済み) →困った ……んなわけで、Windows7マルチタッチメッセージのフック方法が知りたいのです お解りの方教えてください
まず、Javaじゃない普通のウィンドウにやってみればいいじゃん。
The function fails with ERROR_ACCESS_DENIED if the calling thread does not own the specified window. だってさ。
WH_MOUSE_LLでマウスフックを試みている者です。 コールバック関数MouseHookProc()でwParamがWM_MOUSEMOVEだった場合、 メインウインドウにPostMessage()し、そこで座標などを計算し、 MessageBox()が表示される段階まで着ました。 が、MessageBox()を表示する処理が大変遅く感じられます。 改善策があれば教えてください。
結果的に何がしたいの?
>>76 SetCursorPos()でのカーソルの移動です。
PostMessageは止めるべきだな。回数が多すぎる。 WH_MOUSE_LLの呼び出しコンテキストは SetWindowsHookExの呼び出し元になるから、 とりあえずデータをメモリにため込んでいけばいいかと。 MessageBoxを表示するタイミングはよく判らないが、 そのタイミングでPostMessageを使って通知してやれば良いんじゃないか?
>>78 >とりあえずデータをメモリにため込んでいけばいいかと。
この箇所を詳しくお願いできるでしょうか。
>>77 それとMessageBoxはどう関係あるの?
何をしたいのかまったく分からん
OKボタンの上にカーソル持っていきたいとかなら CBTフック使えばいいんじゃね
82 :
デフォルトの名無しさん :2010/06/03(木) 09:42:47
タスクマネージャで優先度を設定できますが それをAPIでやる方法を教えてください
83 :
デフォルトの名無しさん :2010/06/03(木) 09:57:20
できた。 おまえらってほんと糞の役にもたたねーゴミだなw
SetPriorityClassとかなかったっけ
85 :
デフォルトの名無しさん :2010/06/03(木) 10:58:05
非アクティブなウィンドウにキーを送る方法を教えてくれ
sendmessage + WM_KEYDOWN
87 :
デフォルトの名無しさん :2010/06/03(木) 11:31:32
>>86 それメモ帳で試してみたけど送れなかった、以下ソース
HWND handle = ::FindWindow( "Notepad", "無題 - メモ帳" );
::SendMessage( handle, WM_KEYDOWN, VK_F1, 0);
::SendMessage( handle, WM_KEYUP, VK_F1, 0);
何がダメか教えろ
notepad.exe
89 :
デフォルトの名無しさん :2010/06/03(木) 11:45:03
('д`)えーまじっすか
ファイルハンドルやらプリンターハンドルからアプリ名を取得する方法はないかなぁー 最悪、アプリが保持してるハンドルの列挙からマッチングかけてもいいのだが
92 :
デフォルトの名無しさん :2010/06/03(木) 13:58:51
('A`)マンドクセ
>>80 きちんとフックが機能しているか確認する為にMessageBox()しています。
94 :
デフォルトの名無しさん :2010/06/03(木) 17:19:05
なっとう
もし素直にSpy++でメッセージを監視していればF1は として処理されていると確認でき 対応法も自ずとわかっただろうに
96 :
デフォルトの名無しさん :2010/06/03(木) 17:38:22
( ゚д゚)ポカーン
>>93 フックプロージャー内でOutputDebugStringすれば十分では?
>>93 LRESULT MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){
if(nCode==HC_ACTION && wParam==WM_MOUSEMOVE){
MOUSEHOOKSTRUCT* mhs = (MOUSEHOOKSTRUCT*)lParam;
if( ... ){
SetCursorPos(x,y);
return TRUE;
}
}
return CallNextHookEx(hhk, nCode, wParam, lParam)
}
とか
#define WM_HKMOUSEMOVE WM_USER+0x100
LRESULT MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){
BOOL skip=FALSE;
if(nCode==HC_ACTION && wParam==WM_MOUSEMOVE){
MOUSEHOOKSTRUCT* mhs = (MOUSEHOOKSTRUCT*)lParam;
skip=SendMessage(g_hwnd,WM_HKMOUSEMOVE,0,MAKELPARAM(mhs->pt.x,mhs->pt.y));
}
return (skip ? TRUE : CallNextHookEx(hhk, nCode, wParam, lParam));
}
MainProc
case WM_HKMOUSEMOVE:
{ int x=(short)LOWORD(lParam);
int y=(short)HIWORD(lParam);
if( ... ){
SetCursorPos(x,y);
return TRUE;
}
return FALSE;
}
>>87 トップレベルのウインドウに投げても駄目だよ。
それはメモ帳の枠の部分にキーを入力してることになる。
メモ帳は枠+エディットコントロールのような構成だから
エディットコントロールにメッセージを送らないと駄目。
あと、WM_KEYDOWNはTranslateMessageに処理させないといけないので
SendではなくPostする。
メニューバーを持ってるウィンドウで、メニューを操作中(カーソルキーでメニュー選択中) かどうかを判断する方法はないですか。 フォーカスも変わらないしどうにも行き詰まってしまいました。 調べるほどメニューってどういうものなのかがわからなくなっていく。。。
Spy++でメッセージ見てみればいいじゃん。
103 :
101 :2010/06/03(木) 23:11:01
補足ですが、 メニュー操作中というか、ALTを押してメニューを開いてる状態と言いますか、 メニューが開いているのでキーを押してもメッセージがウィンドウに通知されない 状態かどうかの判断です。 キーボードフックのコールバックからアクティブなウィンドウの状態を調べたいのです。
他の方法もありそうだけど WM_ENTERMENULOOP WM_EXITMENULOOP でフラグでも立てとけば?
なんか勘違いしてるな。
106 :
101 :2010/06/03(木) 23:25:09
>> 104 試しにSendMessageをフックして共有メモリにメニュー表示中のウィンドウを保持してみます。 ありがとうございます。
はいはい。がんばってね。
108 :
101 :2010/06/03(木) 23:41:50
ありがとう、いけました。
109 :
デフォルトの名無しさん :2010/06/04(金) 07:53:07
ママ「Windowsとは何か。それは可食体か。」
110 :
デフォルトの名無しさん :2010/06/04(金) 14:11:09
>>100 ありがとう参考になった。
ぶっちゃけキーを送りたいのは他のソフトだったんだけど
とりあえずメモ帳で試してみようとおもって。
メモ帳でやるならハンドルから更にExとかでエディットのハンドルを取ってやればいいのかな。
111 :
デフォルトの名無しさん :2010/06/04(金) 14:57:30
HDCから幅と高さを取得する方法教えて
112 :
デフォルトの名無しさん :2010/06/04(金) 15:06:39
かかってこい
GetDeviceCaps(hdc,HORZRES) GetDeviceCaps(hdc,VERTRES)
114 :
デフォルトの名無しさん :2010/06/04(金) 16:30:20
指定されたモジュールは見つかりませんって出るんですが、 これはどうやれば原因がわかるんでしょうか? 使ってるAPIはSHGetFileInfoです。
あきらめろ。
windowsマシンでsjisの文字列をEUC-JPにC++から変換するAPIはありませんか? WideCharToMultiByteは駄目でした。
mlang.dll の ConvertINetString()
WideCharToMultiByteでEUC-JPのコードページ番号を指定しても無理とな?
GetLastError()の返り値に手がかりがあるかもしれん
>>121 EUC-JPのコードページは「20932」と「51932」のどっちを使った?
51932です
コードさらせよ。
パクるんですね、わかります。
WideCharToMultiByte MultiByteToWideChar は51932は使えんかった気が… とりあえず、おいらは 上記のを使ってみて失敗したら mlang.dll の ConvertINetUnicodeToMultiByte ConvertINetMultiByteToUnicode を使うようにしてる。
TextOutでint型の変数の値を表示するにはどうすればできますか?
数値を文字列に変換することから始めましょう
TextOutにint方の数値を表示するにはどのようにすればよいですか?
wsprintf stringstream
誰かプロパティシートを画面中央に表示させる方法を教えてもらえないでしょうか? 開始時のコールバックでSetWindowPosしてみたら、 一瞬OS規定の場所に表示されてから画面中央へ移動するので見苦しいのです。
とりあえずソース張れ WM_CREATEのときとかで動かしてるか?
キーボード入力をフックで奪ったら IMEにキー入力がいかなくなっちゃんだけどどうすればいい? ごく一部のキーだけIMEから奪うようにしたい 奪った後にPostMessageでWM_KEYDOWNとWM_KEYUPを投げてるんだけどIMEは拾ってくれない
コンテキストメニューにも種類がありますか? メニューアイテムにアイコンを描画したんですが、メニューアイテムが小さすぎて16x16が半分位しか表示されません。 エクスプローラーのようなコンテキストメニューにするにはどうしたらいいんでしょうか?
>>133 規制食らってて、携帯からなのでソース貼るのはちとしんどいです。
後から自分のソース見直したら、
PROPSHEETHEADER::pfnCallbackに渡したコールバックのタイミングで動かそうとしても動かなかったみたいです。
最初に表示されるページのWM_INITDIALOGのタイミングだと移動する事はするけど、一瞬本来の位置に表示されてからなのです。
(されずにすむときもある)
まず服を脱ぎます
音量を調整するapiを探しています。 waveOutSetVolumeではwave出力の音量を変更するかと思いますが、 一番左の主音量を変更するAPIはないでしょうか?
>>135 自力で描画する場合は高さを指定できたはず
141 :
デフォルトの名無しさん :2010/06/07(月) 21:47:26
スレ違いかもしれんが教えてください Windowsでファイル保存したときの日本語ファイル名って ・FAT32のLFNならばUTF-16LE ・FAT16/FAT32のSFNならばShift-JIS(CP932) という理解でOK?
たぶんNG
>>140 SetMenuItemBitmapsを使ってるんですが、引数にそれらしいものはないんですが・・・
他にもAPIがあるんでしょうか?
>>141 システムロケールも影響するからそうはならないはず
CreateProcess で外部プログラムを起動するときに 隠しウィンドウで起動させたいのですが それらしいオプションが見当たりません どこをどうすればよいでしょう?
>>145 STARTUP_INFO 構造体のメンバを見直してみ。
ちょっと前にも見たなこの話題
>>134 奪わないキーはCallNextHookEx呼べ
>>141 日本語Windows上で日本語使っているならば、その通り
rundll32.exe *.dll,* の形式で使いたいのですが、 任意のファイルを、関連付けされていない任意のアプリで開く つまりファイルドロップや送るを再現するようなDLLはあるのでしょうか? rundll32.exe url.dll,FileProtocolHandler は 関連付けされているアプリで開くことしかできませんでした
APIの尻にあるAとかWってAが32BitでWが64Bitで使われてるという理解でいいんでしょうか?
Aがshift_jisでWがunicode文字列を引数に取ります
ANSI(A)とUnicode(W)
>>143 WM_MEASUREITEM とかは送られてきてない?知らないけど
リストビューで、32x32のアイコンと文字列を列挙しました。 次に同じリストビューで、アイコン無しの文字列を列挙する為、 ListView_DeleteAllItems()とListView_DeleteColumn()で項目を削除し、 maskをLVIF_TEXTのみで行ったのですが、 高さ32が保持されたままになってしまいます。 削除し足りない部分や、加えるべき動作を教えてください。
>>143 そのAPIだと、チェックマーク代わりに使うビットマップを指定しているだけだろ。
MENUITEMINFO.hbmpItemに指定する方法でやれば良い。
>>156 オーナードローをしてないのなら
ListViewと関連付けてるImageListの影響を受けてるはず。
>>151 後学のためになぜそういう理解に至ったのか400字以内で教えてくれないか
Windows9x系を知らないからじゃね? そこら辺の歴史的経緯を知らないと、 ANSI/Unicodeで分かれている事を理解し辛いと思う。
161 :
156 :2010/06/08(火) 22:38:16
>>158 ImageList_Destroy()やImageList_RemoveAll()を試してみましたが、変化は見られませんでした。
>>161 おそらく32x32でListView_SetImageList()したときのが残ってるんだろう。
なので、ListView_SetImageList(hwnd,NULL,LVSIL_SMALL);して
それでもダメなら、ダミーの小さいアイコンのImageListをCreate()してSetImageList()してやればいい。
163 :
156 :2010/06/08(火) 23:16:17
>>161 後者の方法で、
himl=ImageList_Create(1,1,ILC_COLOR,0,0);
ListView_SetImageList(hList,himl,LVSIL_SMALL);
の様にする事で解決しました。
ありがとうございます。
164 :
141 :2010/06/09(水) 04:04:21
【改】 スレ違いかもしれんが教えてください Windowsでファイル保存したときのファイル名って ・FAT32ならばUTF-16LE ・FAT16ならば言語依存(2バイト文字ならばシフトJIS等) という理解でOK?
逆に聞きたいんだが なぜファイル名の文字コードなんて気にするんだ?
>>164 先にFAT16とVFATとFAT32の仕様を自分で調べてくる事を勧める。
その仕様に従って記録されるだけだ。
>>159 >>160 今使ってるのがXpの64Bitなんで。
てっきりWの方を使われてるのはその所為だと思ってました。
素人でx64版XP使っている奴なんているんだな。 何という茨の道……
>>154 教えていただいてありがとうございました
この解釈は正しいのでしょうか?
rundll32.exeはdll各種を実行できる
shell32.dllのAPI関数の一つにShellExecuteがある
ShellExecuteはファイルドロップや送るに相当する動作を再現する
"rundll32.exe shell32.dll,ShellExecute 引数" の書式である
2000、XPにてファイル名を指定して実行、またはバッチファイルから実行で
書式を変えながら試行錯誤してましたが結局うまくいきませんでした
以下は全滅でした ------------------------------- rundll32.exe shell32.dll,ShellExecute (handle "open" test_ShellExecute.txt NULL NULL SW_SHOWNORMAL) rundll32.exe shell32.dll,ShellExecute handle "open" test_ShellExecute.txt NULL NULL SW_SHOWNORMAL rundll32.exe shell32.dll,ShellExecute handle, "open", test_ShellExecute.txt, NULL, NULL, SW_SHOWNORMAL rundll32.exe shell32.dll,ShellExecute (handle, "open", test_ShellExecute.txt, NULL, NULL, SW_SHOWNORMAL) rundll32.exe shell32.dll,ShellExecute (handle, "open", test_ShellExecute.txt, NULL, NULL, SW_SHOWNORMAL); rundll32.exe shell32.dll,ShellExecute test_ShellExecute.txt rundll32.exe shell32.dll,ShellExecute wordpad.exe rundll32.exe shell32.dll,ShellExecute rundll32.exe shell32.dll,ShellExecuteEX rundll32.exe shell32.dll,ShellExecuteEXA 以下は動作しました(比較のために実験) ------------------------------- マウスのプロパティのダイアログが現れる rundll32.exe shell32.dll,Control_RunDLL main.cpl ファイルを開くアプリケーションの選択 のダイアログが現れる rundll32.exe shell32.dll,OpenAs_RunDLL 関連付けされているアプリからファイルが開く rundll32.exe url,FileProtocolHandler test_ShellExecute.txt ワードパッド起動 rundll32.exe url,FileProtocolHandler wordpad.exe
>>169 思考錯誤するのではなくドキュメントを読みましょう。
ShellExecuteの第一引数はHWND
>>171 MSのプロジェクトなんてドキュメント読んでその通りいかないことも多いからな
結局試行錯誤はつきまとうんだよ
試行錯誤はドキュメント通りにやってうまくいかないときにやれよ 最初にドキュメント読まないのは問題外だろ…
ワロタ
>>172 それは日本語ドキュメントだけ読んでるからだよ。日本語版読むなとは言わないけど、
英語版との併読は必須。
176 :
150 :2010/06/09(水) 10:50:56
exeを暗号化して置いておいて違うプログラムで読み込んで戻し そのままexeとして起動する事ってできるでしょうか? それとも戻した所で一度書き出してCreateProcessみたいな感じにしかできませんか?
179 :
デフォルトの名無しさん :2010/06/09(水) 15:16:08
>>177 ファイルに書き出さずに実行することは技術的には可能。
ただし、当然ながらそんなものはAPIに用意されていないので、やるなら自分で
メモリ上に実行可能なイメージを構築する必要がある。
近いものに、実行ファイルを圧縮しておいて実行時に展開するソフトがある。
オープンソースでUPXとかあるから、参考になるかと。
ただし、UPXはウイルス等にもよく使われるので、UPXを使っているだけで
ウイルスと誤認されやすい。
>>169 rundllについては
http://support.microsoft.com/kb/164787/ja ここ読めば理解できるでしょ
> 2000、XPにてファイル名を指定して実行、またはバッチファイルから実行で
という事ならShellExecuteは必要ない
ShellExecuteはShellでコマンドを実行してくれるもの。
>ファイル名を指定して実行、またはバッチファイルから実行
はShellから直接実行しているのと同じなのでそのままコマンドを書けばいい
"C:\Program Files\Windows NT\Accessories\wordpad.exe" "filepath"
個人サイトとMSDNのどっちを信用するんだ?
185 :
183 :2010/06/09(水) 19:26:45
PlaySound() でwavファイルを再生させていいるのですが、 Windowsのバージョンで、音が鳴らないとかありますか? 64bit環境で音がならないと言われたので、調査しているのですがビットレートとか関係するのでしょうか?
あります。 ビットレートは関係ありません。
>>177 createprocess自体をフックしといとて、そのEXE名が来た時に解凍して実行
>>177 createprocessフックが嫌なら、エミュレートつくれ
190 :
デフォルトの名無しさん :2010/06/10(木) 16:03:04
きえろぶっとばされんうちにな
win7 64bitだけどアプリは32で作ってるからいいよね? MCIをAPIレベルで使おうとしたらcoredll.dllもmmsystem.dllも無いんだけど 無くなったってこと?仕様が変わって別のものになったとか? リアルタイムで音声の波形を取りたいから生のデータが欲しいんだけど どうやればいいんだろう
winmm.dllか、勘違いしてた
とりあえずDirectSoundCapture使っとけば間違いない。
MCIは変なデーター取りこぼしあるから、 DirectSound使った方がいいよ。
XAudio2 はキャプチャに対応してないからなあ。
インターネットが一般に普及されてなかった頃って、センパイPGはどうやって勉強したの? 書籍が主なんだろうけれども、それこそ何十冊も読み漁るような毎日だったのでせうか?
今だってネットにはろくな情報がない
APIが数メガのヘルプファイルに収まる時代だったしな。
本にも嘘はあったけどな とりあえずそれっぽく書いてバグ出しまくればわからない所はわかるからなんとかなる
201 :
デフォルトの名無しさん :2010/06/11(金) 21:03:40
教えてください エディットボックスの入力カーソルの座標を取得したいんですが、 拾うことは可能ですか?
うん。
203 :
201 :2010/06/11(金) 21:12:21
>>200 勉強になります。とにかく書いて書いて書きまくってみます。
VisualC++4.0付属のIDE上で参照可能な Win32APIマニュアルが物凄く役立ったな。 俺はエロじゃなくてAPIマニュアルで英語を覚えたよ。
大体、C MAGAZINE
208 :
201 :2010/06/11(金) 22:55:39
>>202 すいません、語弊がありました。
入力カーソルのエディットボックス上の描画座標が知りたいです。
カーソル位置にツールチップウィンドウを表示させたいんです。
RECTになるのかは分からないのですが、取得するAPIを教えてください。
EM_POSFROMCHAR
210 :
デフォルトの名無しさん :2010/06/11(金) 23:17:16
思ったんですけど ネットがない時代に10年15年かけて学んだセンパイには悪いんですが、 この時代、10年かけた知識が半年もあれば充分手に入ります そこで質問です。あなたが現役なら今後、やはりJAVAに移行したほうが得策と思いますか?
いや全然。
はい
移行とかいう言葉が出てくる不思議。全部やればいいじゃない。
キャパシティ的に一杯一杯なんじゃないの?
10年15年の知識なりが半年で学べるんなら、 この業界、初心者ばっかりのはずだけどなw
現役なら言われるまでもなくJava使えるから 下らんことほざくな
ネットは20年ぐらい前からあったでしょ
Win32APIスレでJavaかよ JNIでもやりたいのか?
>10年かけた知識が半年もあれば充分手に入ります 知っているということと、実際に身に付いているということは別物 身に付けるためにはそれなりの年数や場数がいると思うけどな >やはりJAVAに移行したほうが得策と思いますか その開発にJAVAが向いていると思えばJAVAになる 客がJAVAでお願いと言ったら、もちろんJAVAになる 要は、自分がJAVAが得意であってもそれで開発できるとは限らんから JAVAを学ぶことが適切であるとは一概には言えない ただ、VCとJAVAの開発どちらが多いかと聞かれると、おそらくJAVA だから、VCよりJAVAを学んだほうが仕事の面では多少有利かもしれない
貴重な意見ありがとうございました こんな半端な小僧がでかい口聞いてすいませんでした
くだらんこと聞くなよほんとに
GetTickCountってどっかのメモリの内容をコピーしてるだけの軽い関数って考えていいの? それとももっといろいろやってる重い関数なんだろうか。
_GetTickCount@0: 7C80934A BA 00 00 FE 7F mov edx,7FFE0000h 7C80934F 8B 02 mov eax,dword ptr [edx] 7C809351 F7 62 04 mul eax,dword ptr [edx+4] 7C809354 0F AC D0 18 shrd eax,edx,18h 7C809358 C3 ret
>>225 規格で決まっているわけではないので、なんとも言えない。
とりあえず今の実装では、GetTickCountはむちゃくちゃ速い。
>>226 これはひどい。乗算にシフトまでやってる無駄の多い関数だ。
GetCurrentProcessを見習うべき。
760c5f85: 83c8 ff OR EAX, -0x1
760c5f88: c3 RET
そのうちGetCurrentFiberのようにマクロにされるんじゃね
ChooseColor()で取得したrgbResultを、それぞれR、G、Bに分けるにはどのようにすれば良いでしょうか。
GetRValue GetGValue GetBValue
JAVAで作ったソフトよりAPIで作ったソフトのほうが速いね でも汎用性悪すぎだし、これから学ぶものでもなさそうだな 過疎ってるところ見るとそんなの常識だろって言われそうだけど
VC++で最近リソースを使い始めた者なのですが、 MAKEINTRESOURCE(IDR_GAME_SOUND_01001) はIDR_GAME_SOUND_01001という整数値からリソース文字列へのポインタを 取得するマクロですが、IDR_GAME_SOUND_01001という整数値からでななくて、 "IDR_GAME_SOUND_01001"という文字列から、リソース文字列へのポインタを 取得する方法はございますでしょうか。 ググっても方法を発見できず困っております。 ご存知の方がいましたら、教えていただけないでしょうか。 よろしくお願いします。
リソースIDを数値じゃなく文字列で定義すればいいだけじゃね?
236 :
234 :2010/06/13(日) 08:03:09
>>235 すみません。初歩的なことかも知れないのですが、
リソースIDを文字列で定義する方法がわかりません。
▼▼▼
【proc.rc】
// WAVE
//
IDR_GAME_SOUND_01001 WAVE "K:\\41_開発\\wav_play_test\\wav\\rush_crash.wav"
【resource.h】
#define IDR_GAME_SOUND_01001 131
【ソース】
HRSRC hResource = FindResource(
NULL,
MAKEINTRESOURCE(IDR_GAME_SOUND_01001),
"WAVE"); // リソースを探す
HGLOBAL hWavResource = LoadResource(NULL, hResource );
LPVOID lpWav = LockResource( hWavResource );
PlaySound( (LPCTSTR)lpWav, NULL, SND_MEMORY | SND_ASYNC | SND_LOOP);
▲▲▲
上記のソースで期待した動きをするのですが、「MAKEINTRESOURCE(IDR_GAME_SOUND_01001)」を
リソースID直打ちではなくて、文字型の変数を使いたいです。
>>236 何が不満なのか理解不能だが
#define IDR_GAME_SOUND_01001 131
をコメントアウトして
"IDR_GAME_SOUND_01001"とか
_T("IDR_GAME_SOUND_01001")で呼べばいけんじゃないかな
238 :
234 :2010/06/13(日) 10:04:22
>>237 ありがとうございます。
おかげさまで解決しました。
resource.h の #define IDR_GAME_SOUND_01001 131 をコメントアウトして、
ソースの
HRSRC hResource = FindResource(
NULL,
MAKEINTRESOURCE(IDR_GAME_SOUND_01001),
"WAVE"); // リソースを探す
の MAKEINTRESOURCE(IDR_GAME_SOUND_01001) を "IDR_GAME_SOUND_01001" に
変更すると理屈はよくわかりませんが上手く動きました。
VSの統合開発環境で、リソースにwavファイルを普通にインポートした後に、
resource.h に自動に作成される #define 文を削除しなければいけないのは
正直、気持ち悪いです。このやり方が一般的なんでしょうか。
IDE上のリソースIDを定義する箇所で、 ダブルクォートで囲んだ文字列を指定できるだろ。 ちなみに、一般的にはリソースIDにわざわざ文字列なんか使わない。
たまにリソースIDは16ビットと決めつけてるプログラムがあるんだよな。
当方windows7環境ですが、多くのアプリケーションのウィンドウは外枠が5ドット程度ありますが、 時々1ドット程度の非常に細い外枠を見ることがあります こういうウィンドウを作りたいんですが、CreateWindowのウィンドウスタイルで変えられるんでしょうか? いろいろ試したんですが今のところ太い外枠にしかなりません
WM_NCCALCSIZEとDwmExtendFrameIntoClientAreaで あともう一寸だけ頑張る、って感じだったかと。 クライアント領域にフレームの描画を持ち込むだけだから、 WM_NCHITTESTとかも対応しないと駄目なんだろうなあ。
vb.netから非アクティブなウィンドウを操作しようとして Call sendMessage(web.Handle, WM_KEYDOWN, Keys.Tab, Keys.Tab) Call sendMessage(web.Handle, WM_KEYDOWN, Keys.Tab, Keys.Tab) Call sendMessage(web.Handle, WM_KEYDOWN, Keys.Enter, Keys.Enter) と2つある入力領域をタブで飛ばして3つ目にあるボタンを押そうとしたら タブはうまく動いているようですが、エンターキーが押せませんでした。 vb.netのsendkeyで画面をアクティブにしてやってみるとボタンは押せます。 sendmessageの代わりにpostmessageでもダメでした。 入力領域、ボタンはhtmlで作成し、webブラウザで読み込んでテスト しています。 原因は何にあるのでしょうか。enterの代わりに入力領域に文字を送ってみても 送信されませんでした。
Enterはシステムが横取りしてIDOKに変換してんだろ
ブラウザの方でアクティブ・非アクティブ時の動作が違うだけじゃないのか?
誤爆スマソorz
PostMessageAのWM_CLOSEって中はどんな処理してんの?
ノミ spy++
AllocConsole()の終了処理は何もしなくてもよいのでつか? 例えば、プログラム終了時にFreeConsole()を呼ぶ必要はありませぬか?
250 :
243 :2010/06/13(日) 16:31:54
>>244 ,
>>245 さんありがとうございます。
と、いうことはsendmessageを用いて非アクティブ状態のウィンドウに対して
エンターキーを押す。という動作は実現できないということでしょうか?orz
実際に操作したいのはflash上に乗ってるボタンでして、アクティブになってる
時にはキーボードからタブキー、エンターキーで操作できたので、何らかの
方法でエンターキーを押せると思ったのですが、無理なのでしょうか。
一瞬ウィンドウをアクティブにして、sendkeyで対応するしかないのかなぁ。
>>250 Flashかよ。それはFlashの仕様にもよるだろうな。
あとさ、キーボードの操作はDOWNだけじゃないだろ
DOWN→CHAR→UPとくるでしょSpy++とか使ってみた?
252 :
243 :2010/06/14(月) 12:24:30
>>251 さんありがとうございます。
vs2008expressなんでspy++がなくて、uispyも
探してみたのですが見つからず、暗闇の中を
手探り状態ですorz
ボタンを押すだけならスペースキーでも飛ばせば?
VC++でテキストファイル「script.txt」をリソースに組み込んで、 ファイルにアクセスするかのように読み出したい(例えば:fgets関数) のですが、何かよい関数(方法)は、ございますでしょうか。 【テキストファイル】script.txt 【リソースに組み込み】"IDR_GAME_SCRIPT" それとも下記のように先頭ポインタを取得して fgetsを自作するしかないのでしょうか。 ---------------- HRSRC hRsrc = FindResource( NULL, "IDR_GAME_SCRIPT", "TXT"); // リソースを探す HGLOBAL hGlobal = LoadResource(NULL, hRsrc); // リソースのロード void *ptr = LockResource(hGlobal); // データへのポインタ取得 //SizeofResource(NULL, hRsrc) ---------------- よろしくお願いします。
STLのstringに突っ込んで改行で分割でもしてろカス
テンポラリを作ってそこから読み出せば?
257 :
254 :2010/06/15(火) 00:49:32
>>255-256 ありがとうございます。
結局、fgets関数に似たものを自作してfgetsを置き換えました。
テンポラリファイルに書き出す方法は、ゲームなので一瞬でも
ユーザーが見える場所にファイルを置けないため、採用しませんでした。
ユーザーに弄らせたくないならリソースファイルに格納してる時点でダメだろ。
259 :
254 :2010/06/15(火) 01:18:53
>>258 普通のユーザーはリソースを見ないと思います。(私の古い偏見。)
コアなユーザーには見られてもしかたないと思っています。
exeからどうやってリソースファイル見れるの?
261 :
254 :2010/06/15(火) 01:32:35
>>260 visual studioでexeファイルを開けば、普通に見れます。(画像とか音声ファイルとか)
有料でもいいからexeファイルごと実行可能の状態のままで暗号化するソフトはないのかな?
ライトユーザーから隠すだけなら、データを全ビット反転するだけでも十分に暗号化したことになる。 この程度ならマシンパワーも必要ないし、すぐ自作できるだろ。
>>261 うあはw丸見えじゃないすかw
リソースファイル化すれば安全だと思って改造のしやすさという利便性を捨ててまで
リソース化頑張ってたのにマジ意味ねーwもうリソースファイル使わねえw
何かいきなり低レベルな話始まっててワロス
API関係ないし
266 :
デフォルトの名無しさん :2010/06/15(火) 09:13:31
>>261 >有料でもいいからexeファイルごと実行可能の状態のままで暗号化するソフトはないのかな?
それやるとセキュリティソフトにウィルス扱いされることが多々あるけど、
それでも良ければUPXとかある
ライトユーザー対策ならzlibで圧縮でもしとけば一石二鳥じゃん。
ライトユーザー対策なら何もしなくていいよw
リソースに埋め込むのか、コードに埋め込んでも変わらんような気がしないでもない
普通にXORするだけで一般の人は読めなくなる。
一般向けのプロテクトならファイルの拡張子を独自の物にするだけで十分すぎる
VS2005使ってます。 デバッグ時にDLLのシンボルが読み込まれないんですけど、なぜでしょうか? dllの中身をみてもpdbファイルのパスは合っていて問題は無いように思われます。
ExtractIconExで取得したアイコンを描画すると、絵の周りに黒ずみができるんですが、 これってどうやればきえるんでしょうか?
そのこさんに美白のアドバイスを受ける
背景を白にする
メインウィンドウに関連付けたツールチップを表示すると 既に表示してるモードレスダイアログの下に表示されてしまうんだが、解決策ないかな?
>>276 予めSetWindowPosでHWND_TOPMOSTにしておくのを忘れている、とか?
>>277 ツールチップをTOPMOSTにするって事かな?
試して見ます
279 :
デフォルトの名無しさん :2010/06/20(日) 16:27:47
SetWindowPosを別のスレッドから呼びたいんですけど、 送りつける先でまだ準備が出来ていないらしいので、この関数を直呼びじゃなくて、 PostMessageしたいと思います。 このときに送るメッセージってなんでしょうか? WM_SIZEとか?
Spy++
アプリ内で完結するメッセージなんだから、好きなメッセージを使えばいい。 WM_APP〜0xBFFF辺りを適当に割り当てておけば問題ないだろ。
準備できてるかどうかイベントでも使って通知しておけば?
スレッド間で通信す(ry
284 :
デフォルトの名無しさん :2010/06/21(月) 12:47:28
外部プロセスのスレッドを指定して例外を起こしたいです 今はSetThreadContextを使ってeipを0にして例外を発生させてるのですが ほかに方法はありますか?
285 :
デフォルトの名無しさん :2010/06/21(月) 12:57:55
Vista以降のOSでIMEがTSFかIMM32かを区別する方法はありますか?
287 :
284 :2010/06/22(火) 17:31:33
それだと自スレッドにしか例外起こせません
288 :
デフォルトの名無しさん :2010/06/22(火) 21:53:15
int ErrorNo = 0; HFONT hFOnt; hFont = (HFONT)SendMessage(hMain, WM_GETFONT, 0, 0); ErrorNo = GetLastError(); とやると ・hFontにはなにも帰ってこない ・ErrorNoには120 が返ってくるのですが、どのあたりをしらべたらよいか、 またはどのようにして調べたらよいか、手掛かりをください。。。
サブウィンドウをモードレスダイアログに変えたら 再描画する度に、画面のちらつきが酷くなったんだけど ダイアログだと、WM_ERASEBKGND以外にも何か背景を初期化するメッセージとか来る?
291 :
デフォルトの名無しさん :2010/06/23(水) 00:40:57
>> 289 どうもです。 hFont = (HFONT)SendMessage(GetDlgItem(hMain,IDC_EDIT1), WM_GETFONT, 0, 0); とやっても結果は同じなんですが、これは トップウィンドウだけでなく、トップウィンドウ上のコントロールも ハンドラを自分で書く必要がある、ということでしょうか?
>>288 そもそも「何も返ってこない」ってことはありえない。
0が返ってるというんだったら、その意味はちゃんと書いてある。
The return value is ... or NULL if the control is using the system font.
そもそも普通の実装だと、WM_GETFONTってのは単に
WM_SETFONTされたものを返すだけ。
どういう目的でGETFONTしようとしてるわけ?
293 :
デフォルトの名無しさん :2010/06/23(水) 10:28:41
>> 292 根元的な問い掛けありがとうございます。すっかり目的を忘れてました。 もともとは次のようなソースを書いて、システムフォントを取得したかったのです。 ところがこれもErrorNoが120返ってきたので、WM_GETFONT使ってみたのでした。 int ErrorNo = 0; HFONT hFOnt; hFont = (HFONT)GetStockObject(SYSTEM_FONT); ErrorNo = GetLastError(); 根本原因は同じな気がしますが、何かヒントをいただければ幸いです。。。
俺は良く GeyStockObject(DEFAULT_GUI_FONT) を使ってるが… SYSTEM_FONT と微妙に違うんだろうな
120ってnot support? どんな環境何だろう
この場合、成否に関係なくGetLastErrorを見ること自体が間違っている、じゃね。 GetStockObjectとか失敗してもGetLastErrorでエラーコードが取得できるってMSDNに書いてないし。
GetStockObjectが失敗してるなら呼んでる場所に問題ありそうだねぇ、どこだ?吐け!
Vista以降でDEFAULT_GUI_FONT使っても、メイリオが返ってこないんだよな。 SystemParametersInfo(SPI_GETNONCLIENTMETRICS)を使うんだっけ。
300 :
デフォルトの名無しさん :2010/06/23(水) 23:40:35
みなさま、いろいろありがとうございます。 >> 295 後だしじゃんけんでもうしわけない。 WindowsMobile(5.0,6.0) SDKです。 ただ、これらの関数がサポートされていることは確認済みなのです。。。 >> 296 ソースの通り、直前でGetLastErrorの戻り値を入れる変数を、 0にしているので、おそらく問題ないと思っています。 >> 297 上記のとおり、「何か」は取得できたようです。 それが正しい値になっているかどうか、は不明ですが。。。 >> 298 「呼んでる場所」とは具体的にどういうことでしょうか? 現在は、DlgProc()のなかで呼んでいます。そういうことでなくて?
とりあえず、アンカーのつけかたくらい覚えろよ
>>300 >「呼んでる場所」とは具体的にどういうことでしょうか?
どのメッセージ来たときに呼んでるの、の意で
>>300 > ソースの通り、直前でGetLastErrorの戻り値を入れる変数を、
> 0にしているので、おそらく問題ないと思っています。
もうちょっとC/C++の勉強をした方がいい。
変数を0初期化していてもGetLastError()の戻り値で上書きされるから、受け変数の0初期化は全く意味が無い。
意図する動作を求めるなら、するべき事はSetLastError(0)だ。
304 :
297 :2010/06/24(木) 00:06:10
Mobileか。MobileのほうはGetStockObjectはGetLastErrorでエラー情報が取れるって書いてるな。
>>297 は取り消し。
>>300 > 上記のとおり、「何か」は取得できたようです。
それはどうでもいいからさっさとhFontが何だったか教えろ
GetLastErrorはあくまで「エラーがあった」ことを確認してから見るものだ
Mobileかー エミュレーターと実機で同じ?
TouchDiamondだと何も問題はないな TCHAR buf[1024];HFONT hfont[2];LOGFONT lf; hfont[0] = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0); hfont[1] = (HFONT)GetStockObject(SYSTEM_FONT); for (int i = 0; i < 2; i++){ wsprintf(buf, TEXT("HFONT:%08x\n"), hfont[i]);OutputDebugString(buf); if (!hfont[i]) continue; if (GetObject(hfont[i], sizeof(lf), &lf)) { wsprintf(buf, TEXT("FACENAME:%s\n"), lf.lfFaceName);OutputDebugString(buf); wsprintf(buf, TEXT("HEIGHT:%d\n"), lf.lfHeight);OutputDebugString(buf); } } S21HTでの結果 HFONT:00000000 HFONT:00000011 FACENAME:Tahoma HEIGHT:-24
308 :
254 :2010/06/24(木) 16:51:30
>>262 ありがとうございます。
全ビット反転で実装しました。
>>266 ご教示ありがとうございます。
ウィルス扱いされるのは嫌ですね。
>>267 ゲームを作って販売するので、ライセンスの問題が面倒かも。
>>271 wavデータの全ビット反転で時間が掛かっているようです。
最悪、拡張子だけ独自にしたいと思います。
VC++にてリソース機能を使い1データ数十MByteあるリソースデータを 「データ1個をメモリにロード → 使用 → 開放」して、 使用していないときはメモリにリソースを常駐させない設計を考えていました。 しかし、LoadResourceにてメモリに常駐したデータをFreeResourceで 開放できると思ったのですが開放されませんでした。 hRsrc = FindResource( NULL, res_nm, "DATA"); // リソースを探す hGlobal = LoadResource(NULL, hRsrc); // リソースをグローバルメモリにロード ptr = LockResource(hGlobal); // データへのポインタ取得 FreeResource(hGlobal); // リソースが開放されない ヘルプにはWin32の場合は、 「ロードしたモジュールがアンロードされると自動的に解放されます。」 とあるのですが、ロードモジュールをアンロードする前に用が済めば さっさと開放したいのです。 ロードモジュールをアンロードする前に強制的にメモリにロードされた リソースを開放する方法をご存知の方がいらっしゃれば、 教えていただけないでしょうか。よろしくお願いします。
どうせメモリマッピングで割り当てられてるだけだから 気にするだけ無駄
文字列リテラルをfreeしたい、に近いぐらい気にすることが無駄
初歩的な質問ですが、 CreateProcessでコンソールアプリを起動させたとき、 コマンドプロンプトの画面を表示させたうえで起動させることは可能でしょうか?
CREATE_NEW_CONSOLE
cmd.exe呼ぶだけじゃないの わざわざ/cとかつけない限りは窓が残るはずだけど
316 :
254 :2010/06/25(金) 15:35:59
>>309 ありがとうございます。
@PNG(画像)ファイルは最初の8Byteのビットを反転する
AWAV(音声)ファイルは最初の12Byteのビットを反転する
で実装したいと思います。
ただ反転するんじゃなくてXORテーブルを複数持って XORするとレベルが少し上がる。
318 :
310 :2010/06/25(金) 15:46:25
>>311-312 >気にすることが無駄
絶対に気にしなければいけません。無視することはできません。
ゲームを作成しているのですが、絵と音のデータはリソースに登録しています。
リソースをLoadResourceした時点で、実メモリを消費します。
絵を一通り表示し音を一通り鳴らせば、全リソースはメモリに常駐し、
プロセスのメモリ使用量は250MByteに膨れあがります。
かなり低スペックのパソコンまで動作対象にするため、
ユーザーに空きメモリ250MByteなんてスペックは要求できません。
リソースを開放できれば、プロセスのメモリ使用量を25MByte程度に
抑えることができます。もし、リソースが開放できない場合は、
最終手段として、ゲーム中の絵と音をexeファイルとは別に持たなくてはいけません。
リソースは、LoadResourceするまで実メモリを消費しないという一見便利に
見えますが、使い終わったら開放できるという機能を併せ持たないと
使い物にならないもののように思います。
ロードモジュールをアンロードする前に強制的にメモリにロードされた
リソースを開放する方法をお伺いしておりますが、もしかして、
「不可能」というご回答なのでしょうか。
>>318 >>311-312 の意味理解してるか?
exeにリソースを埋め込んで実行した時点で
メモリ上にロードされるわけで…
メモリ上にロードしたくないっていうんならあんたの言う最終手段とやらを使わないと無理だよ
だから、そこら辺はOSが勝手に管理するから無視しろって事。 実メモリが128MBでも各プロセスには4GBのメモリ空間が割り当てられるだろ。
321 :
310 :2010/06/25(金) 16:34:42
>>319 >exeにリソースを埋め込んで実行した時点で
>メモリ上にロードされるわけで…
僕も最初はロードモジュール(リソース付き)のロード時には、
exeファイルが丸ごとそのままメモリにロードされると思っていましたが、
実際にやってみると違う挙動をしました。
実際にはロードしてみると、リソース部はロードされませんでした。
LoadResourceの時点で初めてメモリにロードされました。
>メモリ上にロードしたくないっていうんならあんたの言う最終手段と
>やらを使わないと無理だよ
そんな気がしてきました。exeと同じフォルダにdataファルダを
作るというダサいことをしないといけないような気がしました。
dataファルダを隠蔽するためにインストーラーも使用しないといけないかも。
>
>>311-312 の意味理解してるか?
>>311 は、リソースはロードモジュールのロード時には、メモリに上がっており、
実メモリのリソースの先頭アドレスを返してくるだけと僕は解釈しました。
>>312 は、リソースサイズが微小なものは、開放しなくていいじゃんと言っている
ように僕は解釈しました。
意味を理解してなかったらすみません。
322 :
310 :2010/06/25(金) 16:36:41
>>320 >そこら辺はOSが勝手に管理するから
残りメモリが少なくなった場合はOSが勝手に、リソースを開放してくれる
という認識であっていますでしょうか。開放されるタイミングが
わからないのは、かなり不気味なのですが。
323 :
254 :2010/06/25(金) 16:40:12
>>317 ありがとうございます。
PNG,WAVの他にテキストファイルがあって、
テキストファイルはファイル全体を暗号化します。
8ByteのXORテーブルを作って、繰り返し使い
暗号化したいと思います。
PNG,WAVもヘッダだけじゃなくて先頭から
何kByteか程暗号化したほうが安全かも。
>>321 リソース部がロードされないってどうやって確認したんだ?
みるのはコミットサイズの方だぞ
325 :
310 :2010/06/25(金) 18:08:51
>>324 メモリ管理について、あまり詳しくないのですが、先ほど検証させていただきました。
コミットサイズというのは、Windowsタスクマネージャのコミットチャージ合計を見ればよかったのでしょうか。
用意したロードモジュール
@ロードモジュールサイズ 21.5MByte リソース20MByte LoadResourceでリソース10MByteをロード
Aロードモジュールサイズ 21.5MByte リソース20MByte リソースのロードはなし
Bロードモジュールサイズ 1.6MByte リソースなし
Windowsタスクマネージャにて
【ロードモジュール実行前】
PF使用量 457MB コミットチャージ合計 468668
【ロードモジュール実行時】
@PF使用量 485MB コミットチャージ合計 497544
APF使用量 473MB コミットチャージ合計 484888
BPF使用量 473MB コミットチャージ合計 484732
AとBの違いはロードモジュールサイズの違い。(リソースの有無)
ロードモジュールロード時の[PF使用量][コミットチャージ合計]は一緒。
@とAの違いはLoadResource実行の有無。
@のLoadResource実行時にはPF使用量は12MB増加、
コミットチャージ合計は13MB増加となり、
LoadResourceでロードした10MByteと整合性が取れます。
>>325 タスクマネージャーなら
表示→列の選択でコミットサイズにチェック入れればプロセス個別に見れるでしょ
ブレークポイントでも張ってこの前後でのコミットのサイズみてみろよ
HRSRC hrs = FindResource(NULL, MAKEINTRESOURCE(IDR_TEST1), _T("TEST"));
HGLOBAL hg = LoadResource(NULL, hrs);
1011 0101 (1011 xor 0101) (1011) 1110 1011 1110 1011 (1011) (1110 xor 1011) 1011 0101
>>321 だからお前はメモリマッピングを理解してねえんだっつーの
329 :
310 :2010/06/25(金) 20:57:42
>>326 コミットサイズの意味がわからず調べました。
⇒コミットサイズとはアプリの正確なメモリ使用量
とのことでした。
>>325 はWinXP SP2で計測しています。
開発環境はWinXP SP2にしか入っていませんし、
デバッグモードは実際の環境ではないのでリリースモードで計測しました。
下記タスクマネージャーにコミットサイズのあるWin7で計測した結果です。
@メモリ−プライベートワーキングセット 20,488k メモリ−コミットサイズ 35,096k
Aメモリ−プライベートワーキングセット 9,220k メモリ−コミットサイズ 19,472k
Bメモリ−プライベートワーキングセット 9,196k メモリ−コミットサイズ 19,416k
>コミットのサイズみてみろよ
結果から
1.ロードモジュールのロードの時はリソースはロードされない。
2.LoadResourceの時に初めてリソースがロードされる。
ということを実証したことになると思います。
>>326 は何をおっしゃりたいのでしょうか。
>>329 いいから開発環境でLoadResourceの前後にブレークポイント張ってみろ
メモリは1bitたりとも増えないから
>>325 でコミットチャージの差を見ればメモリ上にexe全部ロードされてるって分かるだろ…
なぜこんなに理解力が無いんだ…
331 :
310 :2010/06/25(金) 21:19:26
>>330 ブレークポイントを置くデバッグ環境は特殊な環境で実環境とは異なるので
デバッグ環境の結果を鵜呑みにするのは危険だと思います。
>
>>325 でコミットチャージの差を見ればメモリ上にexe全部ロードされてるって分かるだろ…
何を言っているのかわかりません。
>>325 の結果は
Aロードモジュールサイズ 21.5MByte リソース20MByte リソースのロードはなし
Bロードモジュールサイズ 1.6MByte リソースなし
で、コミットチャージ合計に”違いが無い”ということが証明されています。
もし、ロードモジュールのロード時にリソースがロードされるのなら、
Aのコミットチャージ合計は、484888ではなくて+10MBの497544と表示されるはずです。
リソースの対応するアドレス領域を調べて、 そこにVirtualFreeのMEM_DECOMMITをかけてやれば、 一応直ぐに実メモリを解放してやれるんじゃないか? 意味があるかどうかは知らないけど。
>>331 はLoadResource時にメモリに読み込んでもらわないと困るんだな…
もうそれでいいよバカに説明するのは疲れた…
334 :
310 :2010/06/25(金) 21:30:51
>>328 理解していません。よろしければ教えてくださらないでしょうか。
メモリマッピングでググってみると
「仮想アドレス空間を物理アドレス空間に対応づけることをメモリマッピングという」
と出てきました。
LoadResourceのヘルプを見ると
「指定されたリソースをグローバルメモリにロードします。」と書いてあります。
これは、グローバルメモリを確保してリソースからロードするという動きのことだと思います。
メモリマッピングだから何なのでしょうか。すみませんが、難しいと思いますが、
もう少し噛み砕いて説明していただけると幸いです。
>>332 ためしにやってみたら失敗したな
アプリケーションが確保したメモリじゃないから当たり前だが
>>334 だから、気にしなくて良いって言ってんだろ。
Win32以降ではLoadResourceでロードしたリソースは実メモリが足りなくなったら
自動的に解放される。FreeResourceする必要すらない。
337 :
310 :2010/06/25(金) 23:20:28
皆様大変失礼しました。 余計なソースコードが悪さをしていました。 ▼▼ 01: HRSRC hResource = FindResource( 02: NULL, 03: "IDR_GAME_SOUND_01001", 04: "GAME_DATA"); 05: HGLOBAL hWavResource = LoadResource(NULL, hResource ); 06: LPVOID lpWav = LockResource( hWavResource ); 07: 08: unsigned int i; 09: char *p; 10: p = (char *)lpWav; 11: for(i=0; i<SizeofResource(NULL, hResource); i++) 12: { 13: p[i] = ~p[i]; 14: } ▲▲ 11〜14行目にてリソースデータを書き換える処理を入れていた為、 (どうやらやってはいけない処理だったみたい)書き換えたByte分 (10MByte)、OSが勝手にメモリを確保するという予想外の 動きをしていました。 ご迷惑をお掛けしたことを謹んでお詫び申し上げます。 また、教えていただいた「コミットチャージ合計」の測定によると やはり、ロードモジュールのロード時はリソースはロードされないみたいです。 リソースが実メモリを圧迫しないみたいなので、当初の予定通りリソースを 中心にしてプログラムを作成していきます。 ありがとうございました。
その11行目の書き方は駄目すぎる。 それだと、ループ毎にSizeofResource呼び出しする素敵仕様だぞ。 あとビット単位の反転だけなら、せめて4か8バイト単位でまとめて処理した方が良い。
>>338 いいんだよ
>>337 はメモリさえ消費しなければ
CPUがいくらぶんまわろうがどうでもいいんだよ
SetProcessWorkingSetSizeで(SIZE_T)-1を指定して無理やり追い出すとかはどうだろう
こうやって凄腕プログラマが苦労して実装したメモリ管理を無駄にしていくのであった。 まぁ、若干お茶目な凄腕プログラマなんだろうけども。
ゲームプログラムの画像や音声って何十〜何百MBytesにもなると思うんだが
それを
>>310 はexeのリソースに入れようとしてるのか
修正パッチ配布しなきゃならなくなったときどうするつもりなんだろうね?
>>341 そんなAPIがあったのかいいこと聞いた
大きいデータはSQLにBLOBで突っ込む俺
>>341 CoWして確保されたメモリはページアウト対象になる
リストビューのスクロールバーを削除する為に、 ShowScrollBar(hList,SB_BOTH,FALSE); としたのですが、スクロールバー表示用かと思われるの末尾一行が残ってしまいます。 スクロールバーと一緒にこれも削除する方法をお願いします。
>>348 普通にウィンドウスタイルからWS_VSCROLLとかを削除すりゃいいんじゃないの?
350 :
348 :2010/06/26(土) 16:56:46
>>349 lpStyle=GetWindowLongPtr(hList,GWL_STYLE);
lpStyle^=WS_HSCROLL;
SetWindowLongPtr(hList,GWL_STYLE,lpStyle);
SetWindowPos(hList,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED);
としたのですが、末尾一行どころか、スクロールバーさえも消えてくれませんでした。
>>350 >lpStyle^=WS_HSCROLL;
これは
lpStyle &= ~WS_HSCROLL;
こうしないと消えないんじゃないかな
352 :
348 :2010/06/26(土) 20:07:54
>>352 DWORD dwStyle = ::GetWindowLong(hList, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~WS_VSCROLL);
::SetWindowLong(hList, GWL_STYLE, dwNewStyle);
::SetWindowPos(hList, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME);
ためしにやってみたら消えたけど
スクロールするとかってにWS_VSCROLLが復活するな
WM_NCCALCSIZE
355 :
348 :2010/06/26(土) 22:49:09
>>355 ListViewに、 LVS_NOSCROLL という独自のスタイルがある。
SetWindowLong()で適用してみたらスクロールバーは消えたよ。
でも、矢印キー、Endキー、PageDownキーを使って選択はできてるようだけど、
中身のスクロールができなくなる。
LVM_ENSUREVISIBLEも効かない。
こんなの何に使うんだろ?
デスクトップ表示用なんじゃないか? アイコンとか表示するのにListViewを使っているし。
EnableScrollBar()はいかがか?
プログラム上からCreateService()でインストールしたサービスプログラムを、 手動で削除(レジストリの箇所)しようとしてます。 この場合、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services のキーを削除するだけで、完全に消したことになりますか?
その方法だと再起動必要
361 :
デフォルトの名無しさん :2010/06/28(月) 16:17:58
>> 360 net stop でサービス停止後に削除します。 レジストリ関係のゴミが残らないのかが心配で質問しました。
キャッシュしているだけじゃね?
364 :
デフォルトの名無しさん :2010/06/28(月) 18:55:44
黙れブタ
>>361 なぜDeleteServiceを使わない
366 :
362 :2010/06/28(月) 20:44:31
>>363 試しに2種類の文字列を交互に連続して処理させてみたところメモリ使用量は安定しました
仰るとおりキャッシュしているようですね
ご指摘ありがとうございます
しかし30MB以上もキャッシュするというのはちょっと頂けない・・・
手動でキャッシュをクリアする方法はあるのでしょうか?
367 :
361 :2010/06/29(火) 12:25:48
>>365 過去に作ったプログラムで登録されたサービスを削除したいだけです。
後は、興味でCreateService()で作成したサービスは、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services のみに書き込みをするのか
知りたいです。
ウイルス制作者
>CreateService()で作成したサービスは、 >HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services のみに書き込みをするのか とは限らないが サービス自体はそのレジストリが無くなれば無くなる DeleteService 使うのが普通 リソキの instsrv.exe を使ってもよい
370 :
デフォルトの名無しさん :2010/06/29(火) 14:19:38
黙れ
どうした?w
Visual Studio 2005で Win32APIを使用して、サービスプログラムを作成していたのですが、 参考になる書籍、ホームページなどがあったら、教えてください。 よろしくお願いします。
373 :
372 :2010/06/30(水) 19:08:55
>>372 汚してすいません m(_ _)m
× 作成していた
○ 作成したい
現在ログオンしているユーザーのWindowsユーザー名とパスワードを取得したいの ですがどうすればいいでしょうか?パスワードを取得なんてセキュリティ上そんな APIってやっぱ存在しない?
376 :
372 :2010/07/01(木) 14:14:39
>>374 助かりました、ありがとうございました m(_ _)m
またハッキングツールか!!!
ハッキングツールではないまともな目的なので知っていたらお願いします。
>>378 まともな目的でも、ここに書くことによって悪用される可能性はわからない?
そんなことできたらパスワードの意味ないだろ アホか
パスワードって、入力された文字列そのままで保管されてるんじゃなくて、 MD5なりなんなりでハッシュ値算出して、それを保管してるんじゃなかったっけ?
普通プレーンテキストや可逆文字列で保存はしないわな
Ophcrackとか見るに辞書アタックとかで総当たりするくらいしかないだろう
>>375 スクリーン乗っ取って、ログオンダイアログ出せば、ユーザーが教えてくれる。
>>381-382 生パスワードが必要な認証方式は普通にある。
その場合は可逆的な保存をする。
ん? 不可逆な保存でも大丈夫っしょ
POP3での USER/PASS認証とか? <生パスワード 鯖側はおいといて、メーラーは POP鯖に繋ぐ際に生パスを生成できないとまずいので 可逆保存でないと都合が悪いと
Windowsの認証の話から、何故脱線したことを話し出す馬鹿が出てくるんだろう?
>>388 メーラーが生パスを持っててPOP3で鯖にに生パス送ってるってことか?
けしからんな
メーラーのアカウントに記録されているパスワードが分からなくなった時に、 Wiresharkでパケットの中身を覗いて確認したことがあったなw
あの、Janeみたいにスプリッタウインドウの中の子ウインドウ(ペイン)に ツールバーを付けたいのですが、どうやったらいいかわかりません。 教えてください。お願いします。
リバーの子としてツールバーを作って表示すればいいよ
おまいらいつまでガンプラの話してんだ
>>378 そのまともな目的って何?
まともならほかの解決策があるんじゃね?言ってごらん。
port135でプロミスキャスモードでデータ拾うにはどんなWin32APIを使えばよいですか?
ドライバを挟み込まないと無理かと。 自分で作るよりWinPcapを使った方が現実的。
スイッチはモニタポート持ってないと意味ないよ
BitbltでCPU使用率上がっちゃうんだよ。 俺は今どう考えても256色以上使わないアプリ作ってるんだよ。 Bitbltに8bitモードとか無いのかな? 色のテーブルを別に持っといてそのテーブルのインデックスの羅列を転送するみたいなの。 助けてください。
>>400 8bitのCompatibleBitmap/CompatibleDC使えばいい
>BitbltでCPU使用率上がっちゃうんだよ。 きちんとDDBを使わないから。
>>401 .402
よくわかんないけど調べて頑張ってみます。ありがとうございました。
BitBltを細切れの範囲で呼び出していないか? 一部分だけ書き換えるときは直接DIBの中身を弄った方が速いぞ。 内部フレームバッファの内容を実画面へ転送する時位しか、今時のOSだと出番は無いかと。 昔は、DDBとかでVRAM内で完結させて高速化とかあったのだろうけど。
>>404 後出しで悪いんですが、楽譜エディタみたいなのを作ってるんです。
五線譜の背景の上に、クリックで音符を置いたり移動したり消したりできるように
しようと思ってるんですが、音符を置く毎に背景を再描画するのは無駄なので、
メモリバッファを2枚用意して、背景をbmpbkgndに、背景+音符をbmplayerに、
そしてWM_PAINTでは実画面にbmplayerを転送するだけという感じで、
例えば音符の位置に変更があった場合、bmpbkgndをbmplayerにBitbltしてから
音符をbmplayerに書き込むことで、背景(五線譜)を描画する手間をスキップしています。
こんな風にするのは無駄でしょうか。よろしければご意見聞かせてください。
人間がたまにクリックする程度の頻度の描画でCPU使用率が問題になるなどあり得ない。 そもそも根本的な部分で間違いを犯しているんだろう。 それ以上はソースを晒せとしか言いようがない。
正直、CPU使用率が上がるような処理には見えないなあ。 楽譜全体をバッファで保持しても今のPCなら問題無さそうだし。 bmplayer中の表示範囲に入っていない部分は更新後回し、とかそんなところ?
APIで学ぶWindowsプログラミング って本どうですか? 以前、APIで学ぶ Windows徹底理解―できるプログラマになるための (日経BPパソコンベストムック) 安室 浩和 は購入しましたが、メモリ管理あたりはかなり解説が難しかったです。 Part1のアプリケーションの構造を理解する ぐらいしか分かりやすい解説はなかったのですが、新しいAPIで学ぶWindowsプログラミングはどうでしょうか?
>>405 そんなことするのは無駄だから
今すぐギターを抱えて街に出ろ
>>406 ,407
レスありがとうございます。
仰る通りクリックするときの描画はBitbltを2回呼ぶだけなのでそう問題ないんですけど、
背景をスクロールするとCPU使用率が20%くらい行ってしまうんです。
これはメモリバッファからデバイスへの転送が遅いのかなと考え、
8bitのビットマップとかあればいいのにと質問させてもらいました。
しかし良く考えてみたらスクロールってのはアニメーションと一緒ですから
それくらいCPU使用しても仕方ないのかもしれませんね。
専ブラJane Doe Styleを使ってるけど、 スクロールバードラッグして上下にスクロールさせたら 100%近く行った件。 ま、そんなもんだろ。
.NETが普及している今の時代、APIは需要あるの? APIだけを用いて開発してる所ってある?
Win32APIのことね
.netはWin32API使ってないとでも?
.NETでWin32APIを呼び出すことがあることは知っているが、 今でも完全にWin32APIだけを用いて開発されてたりするの? Windowsアプリケーションを作るためにWin32APIを学ぼうと思っているんだが、 こんなことを考えてたらモチベーションが上がらなくて…
つゲーム それかMFCを学ぶとか。ほぼAPIとおんなじだし
普通wrapper書くなり既存のライブラリ使うなりするだろう
今は.net一色なのか、その方が驚きだ フリーソフトなんかで.netのなんか全然見かけないんだが
たまたま視界に入ってないだけでは
受託開発の世界なんかはすっかり入れ替わってるね。
MFCはおわってる
MFCの方が見慣れた部品が揃ってるから落ち着くんだけどなあ
warning LNK4254: セクション 'ATL' (50000040) は '.rdata' (40000040) に異なる属性を伴ってマージされています ↑って放置しておいても大丈夫な警告ですか?
IMAGE_SCN_MEM_SHARED属性が消えただけだ気にするな 読み取り専用セクションはCoWしない限り元々共有される
>>424 内容は難しくて理解できませんでしたが
大丈夫そうなのでそのまま使うことにします
ありがとうございました
やっぱりWindowsアプリケーション作るなら C++ + Win32API が1番自由度(?)高いの?(出来ることが多いの?)
そりゃまあ、Win上で動作するものはどれも最終的にはAPI呼んでるからなあ
じゃあWin32APIを使う欠点と言えば、その生産性くらい?
意味不明
すまん、言い換えると Win32APIを使う欠点は、アプリケーションを開発する時に大変ってことくらい?
大変も何も使わないとそもそも開発できない。
他の開発環境(C# + .NET 等)と比較してってことだろ お前も分かれよ
C#からでもAPIは直接呼べるし.NETのライブラリは間接的にAPIを利用してる つまりできることに違いは無い 違うのはパフォーマンスと生産性
では総合的に考えると C# + .NET > C++ + Win32API だということ?
両方やってみて使い分けるのがいいと思うよ
win32api直の方が必要な知識は少なくて自分で好きにできるじゃん。MFCとかだと使い方を調べるのに時間かかった上に細かいカスタマイズとかできなかったりするじゃん。
適材適所
構造体のたくさんの変数に代入して関数呼ぶの繰り返し 結局ラッパー組むことになる
Qt4 とか wxWidgets に慣れるともう MFC は二度と使いたくなくなる
>>434 C# + C++/CLI + .NET + Win32 > C# + .NET <> C++ + Win32
>>436 >win32api直の方が必要な知識は少なくて
これには同意しかねるが、MFCとWin32APIはどちらか一つやってれば
もう一方も理解しやすいから、MFC使って融通が利きづらいところは直接API呼べばおk
Edit Controlの右クリックのメニューの 項目を追加したり削除したりする事は可能ですか?
やめておけ 危険だ
>>408 その本のことはよく知らないけど、メモリのことならAdvanced Windowsが分りやすいと思う。
というか、APIで学ぶWindowsプログラミングってかなり最近の本なんだな。
>>437 だな。
ちょっとマニアックな質問になりますが・・・ CreateFileというAPIでdwFlagsAndAttributesフラグに FILE_FLAG_WRITE_THROUGHとFILE_FLAG_NO_BUFFERINGを指定すると バッファ、キャッシュを使わずにファイルを開けるとあります。 この場合、ハードディスク内部のキャッシュも使わないということなのでしょうか? それとも、ディスク内のキャッシュを使用有無を制御するのは不可能なのでしょうか? この当たりについて詳しく調べたいので、ディスクキャッシュの利用状況を見れるような APIも教えてもらえると助かります。
WindowsからすればHDD内部で何をどう処理していようが、あるいはそれが実はHDDですらなく SSDだった、なんてことはどうでもいいというか、どうにもならない。そこにキャッシュがあるのか、 キャッシュが効いているのかも。というかそういうパーツ内部のレベルまでWindowsが管理してると いう発想はどこから来るのか。
>>447 、448
レスありがとうございます。
ハードディスクがサポートしていれば、書き込み操作でキャッシュを
スルーしてディスクに直接書くみたいですね。
SQL Serverはデータベースファイルを操作する際に
FILE_FLAG_WRITE_THROUGHとFILE_FLAG_NO_BUFFERINGを
指定するという話を聞いたので少し気になったのです。
でも、ハードディスクが内部キャッシュのライトスルーをサポートしているとなると
上記フラグを指定をした際に、書き込みが遅くなってしまう可能性もあるような
気がしてきました。
>>448 さんのページも、まだ怪しい翻訳しかできてないので
もう少し調べてみます。
ありがとうございました。
□□□□ → □□□□
□■■□ → □■■□
□■■□ → □■☆☆
□□□□ → □□☆☆
□ SRCPAINTで作った白色
■ SRCPAINTで作った青色
☆ FillRectで塗りつぶした白色
上の画像を白色を透過して表示したいのですが、そのまま表示されます。
ただ、FillRectで一部を白色で塗ると、その部分だけ透過されます。
見た目は同じ白、GetPixelでもちゃんと白が返ってきますが、
同じ色なのにデータ上違う事とかはありえるのでしょうか。
(透過はここのサイトのような感じのやり方です)
ttp://homepage2.nifty.com/rleez/program_old/winapi/bmpmask2.html (SRCPAINTで作ったというのは、元の画像の1色だけの色を変え、他を白にした画像)
(画像の1色だけを色を変えながら透過表示したいため)
>>452 何を言ってるのか分からん。
まぁ、他人に分かるようにちゃんと説明できたら、質問なんてしないで
自己解決するんだろうけど。
まず、マスク画像はどうしちゃったんだ?
黄黄黄黄 → 緑緑緑緑 + 白白白白 → 白白白白 黄青青黄 → 緑緑緑緑 + 白黒黒白 → 白緑緑白 黄赤赤黄 → 緑緑緑緑 + 白白白白 → 白白白白 黄黄黄黄 → 緑緑緑緑 + 白白白白 → 白白白白 元画像 → fillHBmp +(SRCPAINT) maskHBmp → fillHBmp 色を変えながら透過(青を緑に変え)はこんな感じです。 fillHBmpとmaskHBmpはCreateCompatibleBitmapで作っています。 最後にできた白と緑の画像を白を透過して表示したいのですが、 透過されずそのまま表示されてしまいます。 一部を白でFillRectすると、その部分だけ透過できます。
>>453 ありがとうございます、分かりにくくてすいません。
マスク画像は、処理を行う関数で作っています。
ウィンドウに表示して確認していますが、意図した画像にはなっています。
(
>>454 の3番目の図のような)
白 := 透過 で 元絵A 背景 合成後 白白白白 黒黒黒黒 黒黒黒黒 白青青白 黒黒黒黒 黒青青黒 白赤赤白 黒黒黒黒 ⇒ 黒赤赤黒 白白白白 黒黒黒黒 黒黒黒黒 ここまではできてて 元絵Aに対し FillRectで加工 白白白白 黒黒黒黒 黒黒黒黒 白青青白 黒黒黒黒 黒青青黒 白赤白白 黒黒黒黒 ⇒ 黒赤白白 白白白白 黒黒黒黒 黒黒白白 こうなってしまった こういうことか? 元絵の色空間の都合で(8bit?) マスク生成段で FillRectで塗った白 が "白" とならなかったんでない?
>>456 ありがとうございます。
FillRectで加工しない場合は、透過できずにそのまま表示されます。
白白白白 黒黒黒黒 白白白白
白青青白 黒黒黒黒 白青青白
白赤赤白 黒黒黒黒 ⇒ 白赤赤白
白白白白 黒黒黒黒 白白白白
FillRectで加工した場合は、加工した部分だけ透過されます
白白白白 黒黒黒黒 白白白白
白青青白 黒黒黒黒 白青青白
白赤白白 黒黒黒黒 ⇒ 白赤黒黒
白白白白 黒黒黒黒 白白黒黒
元絵は24bitで、LoadImageでロードしています。
デスクトップのbitも24bitです。
透過するかどうかは、マスク画像で決めるんだから マスク画像の生成に問題があるんでしょ。
なぜか、LoadImageで作ったHBITMAP(最初の画像)に
透過に使いたい最終画像(
>>457 の4番目)をSRCCOPYして、
それを透過表示させた所うまくいきました。
LoadImageと、CreateBitmapやCreateCompatibleBitmap
で作るHBITMAPでは、描画速度に差があったりしますが、
同じようにHBITMAPのタイプ?の違いによる物かもしれません。
>>458 ありがとうございます。
途中で作る画像をウィンドウに表示して確認していますが、
見た目では意図したのが表示されています。
460 :
デフォルトの名無しさん :2010/07/07(水) 07:41:54
「連投」の仕方を教えてください。
●でも買えば
462 :
デフォルトの名無しさん :2010/07/07(水) 11:16:26
>>461 もうちょっと詳しく教えてくれませんか?
ド素人なのでよく分からないんです。
マウスメッセージやキーボードメッセージを別のウインドウに転送したくて WndProc内で該当メッセージを受け取った時に別のウインドウにPostMessageする処理を書いたら WindowsXPではちゃんと動いたんですが Windows7でAeroをオンにしていると動かなくなります
465 :
464 :2010/07/08(木) 00:16:45
(書きかけで送信してしまった) Aeroがオンの時って別の(PostMessageを送るアプリが管理していない)ウインドウに PostMessageできないんでしょうか? ChangeWindowMessageFilterでメッセージをMSGFLT_ADDしてやらないと駄目なのかとも思いましたが 試してみてもメッセージは飛んできてないようです
WS_TRANSPARENT だったかな
467 :
464 :2010/07/08(木) 00:35:12
>>466 ありがとうございます
WS_EX_TRANSPARENTも試してみたのですが
メッセージを無条件で転送してしまうので使えないのかなと思ってました
「右クリックのみは転送せず自分で処理する」みたいなことをやりたいのです
ごめんなさい説明足らずでマジ申し訳ないです
基本的なプロセス間通信の手段なんだから、送れないわけないだろう。 っていうか、メッセージが届いてるかくらい自分で簡単に確認できるだろう。 届いた後の処理に問題があるんじゃないの?
すみません。質問です。
win32アプリケーションウィザードによって自動的に作成されたウィンドウにて
マウスカーソルの表示/非表示の制御をおこないたいのですが上手くいきません。
ウィンドウの白枠の中ではマウスカーソルを非表示、ウィンドウの白枠以外
(メニューやタイトルバーの上)ではマウスカーソルを表示したいです。
http://jishinkuma.aa0.netvolante.jp/etc/mouse_cursor.png どういうイベントとwin32 APIの組み合わせで実現できますでしょうか。
WM_MOUSEMOVEイベントは白枠の中でのマウスカーソル移動しか拾わない為、
白枠の中とメニューの境界線をまたぐときの判定が取れません。
また、マウスカーソルの表示/非表示は、ShowCursor(TRUE)/ShowCursor(FALSE)を
使うということであっていますでしょうか。
以上、よろしくお願いします。
WM_SETCURSOR
469の質問の回答お願いします。
他スレの質問?
473 :
469 :2010/07/10(土) 08:44:56
>>470 お教えいただきありがとうございます。
下記機能を実装したソースを記載します。
変な実装方法をしていないか見ていただけると幸いです。
▼▼▼
case WM_SETCURSOR:
GetCursorPos(&mos_pos); // マウス座標を取得(スクリーン座標)
ScreenToClient(hWnd, &mos_pos); // マウス座標を変換(クライアント座標へ)
SetRect(&rect, 0, 0, MAX_SCREEN_WIDTH, MAX_SCREEN_HIGHT); // ウィンドウの白枠の大きさ
if( PtInRect(&rect, mos_pos) == 0 )
{
// メニューやタイトルバーの上(ウィンドウの白枠の中以外)の場合
hCursor = LoadCursor(NULL, IDC_ARROW); // 標準のマウスカーソルを表示
SetCursor(hCursor);
}
else
{
// ウィンドウの白枠の中の場合
SetCursor(NULL); // マウスカーソルを消去
}
break;
▲▲▲
RECT rect; GetClientRect(hWnd,&rect); ... case WM_MOUSEMOVE: { static bool b=false; long x = (long)LOWORD(lParam); long y = (long)HIWORD(lParam); if(rect.left<=x && x<rect.right && rect.top<=y && y<rect.bottom){ if(!b){ b=true; SetCapture(hWnd); while(!ShowCursor(0)){} } } if(!(rect.left<=x && x<rect.right && rect.top<=y && y<rect.bottom)){ if(b){ b=false; while(ShowCursor(1)){} ReleaseCapture(); } } } break;
>>473 1.LOWORD(LPARAM)でウィンドウのどの領域か判定可能。
HTCLIENTが入っていたらクライアント領域
2.クライアント領域の時だけSetCursorしてTRUEを返せば十分。
それ以外の時はDefWindowProcにそのまま流せば良いかと。
476 :
469 :2010/07/10(土) 10:50:27
>>474 レスありがとうございます。
>>475 ありがとうございます。
おかげで処理がすっきりしました。
あのーーー、初めてのDLLなんですが DLLから輸出する関数は普通 stdcall、cdeclのどちらの規約にするんですか? で、fastcallは使っちゃだめなの? ついでに、_kansuu@Xとか出てくるんですけど、@Xの Xの数字は何を意味するんですか?
普通は__stdcall。@の後ろは、引数のサイズだっけか?
__fastcallは仕様の明確な規定が無かった所為で、 コンパイラ間で互換性が保障されなくなっているので使えない。 ちなみに、x64は呼び出し規約が一つに統一されたので考える必要は無くなった。
__rapidcallとか__ultrahighspeedcallとか__ohmygodとかあったら俺は間違いなく使うぞ
_pascal ってなかった?
現在適用されている壁紙を調べる方法ってレジストリを見る以外にないかな?
>>482 SystemParametersInfo()で取れそうだよ
>>483 有難う!
SPI_GETDESKWALLPAPERで取れるとの事だけど、MSDN見るとWin2000しか使えないようですが
9x系で指定すると、何も返ってこないのでしょうか?
今時9x系って・・・
ありとがう
アガリ糖
490 :
名無しさん@そうだ選挙に行こう :2010/07/11(日) 03:10:42
タブコントロールでタブをクリックしたときに、 そのタブが前に来ないようにするのってどうやんの?
サブクラス化でもすれば
>>484 手元にWin9x系がないから確認できないけど、アクティブデスクトップが有効なら
COMのIActiveDesktop使えばいけると思うよ
アクティブデスクトップなんか誰も使ってなかっただろ
>>479 x64は最初の4引数がレジスタ渡しされてビビったな
IE4.0以降がインストールされていれば、 使用・未使用に関わらずとりあえず機能するんじゃないか? といっても今更確認する気にもならないが。 x64Win7ですら現役の機能だし、まあ大丈夫だろ。
PCに接続されているけど、 無効になっているモニタの情報を取得したり、有効にするには どうすればいいでしょうか?
497 :
496 :2010/07/11(日) 22:20:08
WMIとかいうものでなんとかなりそうです。 失礼しました。
すみません。質問です。(正しい用語を知らないので上手く説明できないかも知れません。)
win32アプリケーションウィザードによって自動的に作成されたウィンドウにて以下の2点のタイミングを捕らえることが目的です。
(1)ウインドウ内でクライアント領域から制御が離れるタイミング
(2)ウインドウ内でクライアント領域に制御が戻るタイミング
目的を実現するには、どういうイベントを使えばよいのでしょうか。
↓↓↓上記の質問だけだと何を言っているのかわからないと思いますので以下に試してみたことや図説を書きます。
クライアント領域から制御が離れたときの制御の遷移は以下の@Aのみしかありえないと考える場合
(@A以外にありえる場合は、以下の方法は目的の達成に意味をなしません。)
@現在のウインドウの「メニューバー」に制御が移る
([Alt]や[F10]([Alt]+Fなど)押下などのキー操作やウインドウのメニューバーを左クリックなどのマウス操作を実施)
A現在のウインドウの「コントロールメニュー(プルダウンメニュー?)」に制御が移る
([Alt]+[Space]押下などのキー操作やウインドウのタイトルバーのアイコンを左クリック、
『(A)ウインドウのタイトルバーのアイコンを右クリック、(B)ウインドウのタイトルバーを右クリック』などのマウス操作を実施)
図説
http://jishinkuma.aa0.netvolante.jp/etc/seigyo.png (「制御」の文字がにじんで読みにくくて申し訳ないです)
〜〜〜
>>499 に続きます 〜〜〜
え?
500 :
498 :2010/07/12(月) 00:00:15
〜〜〜
>>498 の続き 〜〜〜
WM_MENUSELECTイベントを使うと『クライアント領域から制御が離れたタイミングとクライアント領域に制御が戻るタイミング』を
捕らえることができると思いました。しかし、(A)(B)の操作をしたときにクライアント領域から制御が離れたにも関わらず
WM_MENUSELECTイベントが発生しないため、WM_MENUSELECTイベントでは『クライアント領域から制御が離れるタイミング』を
捕らえることができませんでした。『クライアント領域に制御が戻るタイミング』は「@のメニューバーから制御が離れる」ときと
「Aのコントロールメニューから制御が離れる」ときにWM_MENUSELECTイベントが発生するため捕らえることができます。
case WM_MENUSELECT:
// @のメニューバーやAのコントロールメニューがクローズされた場合
if( (HIWORD(wParam) == 0xFFFF) && (lParam == NULL)){
XXXXXXXX
}
return DefWindowProc(hWnd, message, wParam, lParam);
break;
説明が大変わかりにくくて申し訳ありません。目的を実現するのに有効なイベントを知っている人がいらっしゃれば、
お教えしていただけないでしょうか。よろしくお願いします。
>>498 SetCapture / ReleaseCapture 使え
キャプションやらなんやらは、WM_NCHITTESTで取れる。
そもそもクライアント領域の制御ってどういうことを意味してるんだろうね。 単にキーボードフォーカスとマウスカーソルの位置だけでいいのか、 それともクライアント領域に作成した子ウインドウのウインドウメッセージ処理全般を指してるのか。
504 :
498 :2010/07/12(月) 02:40:41
>>501-503 レスをいただきありがとうございます。
ただいま体調不良の為、体調が回復したらお教えいただいた方法を試させていただきます。
>>503 >そもそもクライアント領域の制御ってどういうことを意味してるんだろうね。
スレ違いだと言われそうなので書かなかったのですが、DirectXを使用しています。
クライアント領域はDirectXの描画領域となっており秒間60コマで表示更新され続けています。
私の表現で『クライアント領域に制御がある』とは、クライアント領域がDirectXにより、表示更新され
続けている状態のことを指します。『クライアント領域に制御がない』とは、DirectXの表示更新が、
▼
[Alt]や[F10]や[Alt]+F押下などのキー操作やウインドウのメニューバーを左クリックなどのマウス操作、
[Alt]+[Space]押下などのキー操作やウインドウのタイトルバーのアイコンを左クリック、ウインドウの
タイトルバーのアイコンを右クリック、ウインドウのタイトルバーを右クリックなどのマウス操作
▲
によりメニューバーやプルダウンメニューにフォーカスが移ってクライアント領域のDirectXの表示更新が
ピタッと止まってしまう状態のことを指します。
505 :
498 :2010/07/12(月) 02:44:30
>>503 〜〜〜
>>504 の続き〜〜〜
検証に使っているパソコンのマウスカーソルが、どうやらハードカーソルではないらしく、DirectXで
表示更新され続けているクライアント領域にマウスカーソルを持っていくと、DirectXの描画と
マウスカーソルの描画が競合してマウスカーソルがちらついて表示されてしまいます。その問題を
解決するために、マウス座標がクライアント領域にある場合は、標準のマウスカーソルを消去し、
代わりにDirectXのグラフィックでマウスカーソルの絵を描画するようにしました。しかし、クライアント領域に
マウスカーソルの絵が表示されているときに、▼▲の操作を行うと、DirectXの表示更新がピタッと止まり、
マウスカーソルの代わりの絵がクライアント領域の▼▲の操作を行う直前の位置に張り付いたままの状態で、
標準のマウスカーソルが表示されてしまいます。(マウスカーソルが2つ表示されて気持ち悪いです。)
対処法として「クライアント領域から制御が離れるタイミング」(標準のマウスカーソルが表示されるタイミング)で、
マウスカーソルの代わりの絵を消去し「クライアント領域に制御が戻るタイミング」(標準のマウスカーソルを
消去するタイミング)でマウスカーソルの代わりの絵を描画するという処理を実装しようとしています。
上記理由から
(1)ウインドウ内でクライアント領域から制御が離れるタイミング
(2)ウインドウ内でクライアント領域に制御が戻るタイミング
を検出したいのです。
止まるのは自分でアイドル以外で描画してないからだろ
WM_NCHITTEST、WM_NCMOUSELEAVE、GetCursorPos()で毎回マウスカーソルの位置を拾って 自分で描画を制御するしかないかなぁ…。
508 :
498 :2010/07/12(月) 14:02:44
>>506-507 レスありがとうございます。
自分自身の複雑な発想を改め単純に考えてみると
下記コーディングにて無事機能を実装できました。
▼▼▼
case WM_SETCURSOR:
if(LOWORD(lParam) == HTCLIENT)
{
SetCursor(NULL); // 標準マウスカーソル非表示
g_mousecursor.SetDispFlag(1); // スプライトマウスカーソル表示
return TRUE;
}
else
{
// 標準マウスカーソル表示
g_mousecursor.SetDispFlag(0); // スプライトマウスカーソル非表示
if( Render() < 0 ) // DirectXの描画
{
DestroyWindow(g_hwnd);
}
}
return DefWindowProc(hWnd, message, wParam, lParam);
break;
▲▲▲
ご指導ありがとうございました。
他プロセスのEM_REPLACESELをフックしてメッセージを破棄したいのですが、 WH_CALLWNDPROCではメッセージ自体を変更することができないようで困っています。 何か方法があれば教えてください。
その他プロセスに入り込んで直接フックしろ
エディトボックスの上でキーを押しても文字が入力されないのですが、 何の原因が考えられるでしょうか。 右クリックの貼り付けとかはできます。 メッセージループにはWM_KEYFIRSTが来ていますが、 コールバックにはWM_COMMANDが来ていないみたいです。 (MessageBeepとifでどのWM_の時に音が鳴るかで調べました)
TranslateMessage
>>512 ありがとうございます。
試してみます。
窓辺ななみのデスクトップマスコットみたいな輪郭のくり抜きって SetWindowRgn使ってると思うのですが、 その際アンチエイリアス処理は無理でしょうか?
親がWS_POPUPである、サブクラス化したリストビューにて、 ListView_DeleteColumn()しても、中身は削除されるようですが、コラム自体は残ってしまいます。 又、SetWindowPos()でその部分を隠そうかとも思いましたが、どうも変更されません。 何方かご教授お願いします。
SVNみたいなファイル/フォルダのオーバーレイ表示ってどうやんの?
おもしろそうだな。自分もやってみたいけどこれといったネタがないw
Explorerフックされるのが嫌で、TortoiseSVN使うの止めますた どうかそういうソフトは作らないで下さい
フックじゃなくてシェル拡張でしょ
>>520 オプションで切るという発想がないのがすごい
>>523 間違いを指摘されて怒ったのか?
牛乳飲めよ煮干し食えよ
残念だなあ。 君は何か勘違いしている様だけど、聞いて揚げ足取りをしたいんじゃなくて、 単純に君の意見が面白そうだから聞いてみたかっただけなんだよ。 もっとまともなレスを期待してたんだけど。ごめんね。 ちなみに君は揚げ足を取られる事を恐れているようだけど、それは違うと思う。 揚げ足を取られるのは、君に隙があるから。 隙だらけの人間ってのはそうやって余計な所でつまらない恥をかく事になるもんだよ。 他人につっこまれる事は、自身の知識をより客観的で多角的なものとする為に 有益な指針となるものだと思うな。
少なくともお前は面白くない
>>526 面白くないと死んじゃうのか?
牛乳飲めよ
その返しにウィットが効いてると思ってるの?
間違ってるとしたら俺なんだけど 間をとってシェルフックって事で手を打たないか?
どっちにしろフックじゃない シェル拡張作ったことあるか知らんが単純なプラグイン機構だ
プラグインみたいにロードできる事は分かるが、単純ではないと思うけどなぁ
この場合は プラグイン=フック
シェル拡張の多くはフック的仕組みではあるが シェルフックは別にWH_SHELLやIShellExecuteHookがあるから紛らわしい
本当にAPIと関係の無い話題で盛り上がるのが好きだな
SendInputでFキーやEscキーは送れるのですがカーソルキーが送れません ← の場合 wScan = MapVirtualKey(0x25, 0) としているのですが、何故送れないのですか?
>>535 RegisterRawInputDevicesでスキャンコードを取り出してみたら、
「←」押下で42,75、「←」を離した時点で75,42と来てるなあ。
操作的には左シフトを押しながらNUMPAD4を押して、逆順で戻すって感じか。
家のはPS/2キーボードだからUSBだと違うのかもしれないが、
一応これと同じように送ってやればいいんじゃないか?
スキャンコードと仮想キーコードって全然違うくない?
申し訳ありません、非常に幼稚な質問かと思うのですが尋ねさせてください
ttp://www.geocities.jp/ky_webid/win32c/028.html http://www4.plala.or.jp/tamo/vc/HowToVS/HowToVS.html これらのページを参考にVisual Studio 2008 Professional Editionで
プログラムを作っています
しかし、現在ウィンドウにメニューを表示させたいのですが
表示させることができず困っている状態です
win32APIのプロジェクトにおいて
VSに付属のリソースエディタでxxx.rcを作成し
その中にリソースの追加を行いMenuを新規作成しました
そのMenuのIDはIDR_MENU1になっているので
参照しているURLの上の方のリンクの最初にある
サンプルプログラムをコピーして
// メニューリソースをロードする
hMenu = LoadMenu( NULL, _T("IDR_MENU") );
// ウィンドウにメニューリソースを割り当てる
この中段の部分の IDR_MENU を IDR_MENU1 に変更し
一応includeファイルにもresource.hを足しておりますが
ビルドはできても、実行するとメニューのない
ウィンドウしかでてこないのです
原因の分かる方いらっしゃいましたら
できれば教えていただきたいと思います
よろしくお願いします
普通に Win32プロジェクトを開始して、Windowsアプリケーションを選べば、 メニュー付きのウィンドウが出るよ。
ソースの下のLoadMenuの説明をちゃんと読みましたか?
ありがとうございます 空のプロジェクトでやってましたが、気付かなかったです これでメニューのでたウインドウのコードと比較してみて 何が差異としてあるか見てみようと思います 助かりました
>>540 こちらもありがとうございます
おかげさまで無事に表示することができました
ついでに質問させてもらっていいでしょうか
ページ最初の XN Resource Editor上での作成 という項目の最後辺りにある
>ここまで終わったら、メニューバー自体にも名前を付けます。
>左側のツリービューから、「Language Neutral」の部分を右クリックし、
>「プロパティ」を選択します。
>するとダイアログボックスが出てくるので、
>「名前」に「IDR_MENU」と入力します。
この部分ですが、VSのリソースエディタでリソース中の
メニューのプロパティを見ても、Nameという部分は
グレーで選択できない状態になっていますよね
こうなっているということは、必ずVSではMAKEINTRESOURCEを使う必要が
あるということでしょうか
リソースのID指定と文字列指定を勘違いするなよ。
>>542 プロパティのIDを""で囲ってやれば文字列形式になる
"で囲まない(通常) -> ID が .h に定義される -> リソースIDになる
"で囲む -> ID が .hに定義されない -> 文字列形式になる
これだけの話、.rc, .h を直接編集してやってもいい
まぁ普通はリソースIDを使うと思うけど
>>543-544 なるほど、良く分かりました
要領が悪くもうしわけございません
私はリソースの文字列形式というものの
理解がそもそも足りておらなかったですね
しかし非常に助かりました、ありがとうございます
>>545 最初はみんな理解が足りないんだから気にしないで。
なんていうか、一旦川を渡った人が初めて川を渡る人に川の渡り方を
説明するのに、まともなものは稀なもの。んで、同じ轍を踏む。
既に川に橋が架かってる時代に わざわざ川の中泳いで渡ろうという奇特な人のために だれも助け船なんて出そうと思わないのと一緒
頭の足りない人たちが作ったAPIを理解できないのは当たり前。 同じように足りなければ相性がいいってだけで理解できないから劣っているわけではない。 頭の悪さに慣れるしかない。気にするな。
Win32 APIよりましなAPIセットなり、フレームワークなりを 作ってからじゃないと、全然説得力ないな。
野党時代の民主党みたいなもの。 無責任に言うだけ言って、与党になったら何も出来ないのが露呈する。
551 :
546 :2010/07/21(水) 08:16:45
独り相撲そのものだか、 SetclipboardData() で渡すハンドルには GMEM_DDESHARE の属性がないと 失敗するようだ。551 に上げたページにはジェンジェン触れてないよ。喝
553 :
552-546 :2010/07/21(水) 17:37:58
やりたいことは出来たけど、ちょっと疑問。教えて下さい。 GMEM_DDESHARE を使うっていうと、ハンドルは GlobalAlloc() で取る だけになりますよね。GlobalAlloc() は古いから HeapAlloc() を勧め るって聞いたような気がするけど、これはどう考えるのでしょうか。 (HEAP_DDESHARE って用語はぐぐっても出てこない。)
>>553 Win16の頃にGlobal/Local系でやり取りする取り決めにしたAPIは、
Win32になったからといって急に変更すると移植に手間がかかってしまう為、
そのままになっている。
APIによる制限が無い使い方なら、Global/Local系を使う理由は無い。
556 :
デフォルトの名無しさん :2010/07/22(木) 04:03:00
いいからAPI出せや
>>554 SetclipboardData() を使おうと思ったから過去に引き戻されたわけね。
>>555 激励感謝。アテにしてないから他も見て解決。551 は 545 への応援も
あったと思ってね。
いいからAPI出せや
559 :
デフォルトの名無しさん :2010/07/24(土) 10:58:07
Yield()笑
Yieldの精神はUmsThreadYieldに受け継がれているのだ。
561 :
デフォルトの名無しさん :2010/07/24(土) 12:18:16
そのAPIは?
x64版のWin7か2008R2なら使えるよ。
563 :
デフォルトの名無しさん :2010/07/24(土) 12:51:35
何故 WinMain の返り値を msg.wParam にするの? 0を返すのとどう違うの?
WinMainの返り値(終了コード)はGetExitCodeProcessで取得できる。
>>563 PostQuitMessageの引数に終了コードを入れておくと、
WM_QUITのWPARAMにそのコードが入っているから。
566 :
デフォルトの名無しさん :2010/07/24(土) 13:17:08
じゃあウィンドウプロシージャの中に PostQuitMessage(0); と書いたら、msg.wParam の値は 0 ってこと?
yes
サンクス
569 :
デフォルトの名無しさん :2010/07/24(土) 19:28:13
APIってきもいよね^^
米国石油協会に喧嘩を吹っかけるとな
だって石油だぜwwww きもすぎるwwwww
車はガソリンで走るのです ってCMあった気がする
573 :
デフォルトの名無しさん :2010/07/25(日) 10:44:37
ウィンドウを画面中央に表示させたいときは HWND hDeskWnd = GetDesktopWindow(); HDC hDeskDC = GetDC(hDeskWnd); を書いた後に、CreateWindow() の引数で x座標に GetDeviceCaps(hDeskDC, HORZRES)/2 - WIDTH/2 y座標に GetDeviceCaps(hDeskDC, VERTRES)/2 - HEIGHT/2 (WIDTH, HEIGHT はウィンドウの幅, 高さ) を指定してあげる方法でOK?
574 :
デフォルトの名無しさん :2010/07/25(日) 10:46:55
モニタ2台あったらどうするつもりだ
/2が一回無駄
は?
引いてから割った方がエコ。
実装する時は()付けるべきだろうけど これくらいならコンパイラがやってくれそうな気もする。
結果が違う場合があるのにやるわけない
確かに/2は1回で出来たな、サンクス
>>574 のような場合も含め
多くの環境に対応させるには、具体的にどのように書いたらいいの?
足し算と間違った
分母が2、分子が整数であれば、結果が異なる場合はないんじゃね?
> 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね? > 分母が2、分子が整数であれば、結果が異なる場合はないんじゃね?
何が言いたいのか分からない
>>582 GetDeviceCaps(hDeskDC, HORZRES) == 1001、WIDTH == 501 の時、さあどうなる?
もっともこの場合、割り算が少ない方が正しい結果になるけどな
ディスプレイで奇数ドット数なやつ見てみたいわ
マルチモニタだとモニタとモニタの間に来ちゃうんじゃなかったかな?このやり方だと。
>>585 キャスト入れないと同じになると思うんだけど
int x = 1001/2 - 501/2;
int x2 = (1001 - 501) / 2;
ans. x==250, x2==250
キャストっていうか、結果か
int GetDeviceCaps(); どうやって、コンパイラが最適化すんだよ。
>>591 こんな風にならんのかな?
x = GetDeviceCaps(hDeskDC, HORZRES)/2 - WIDTH/2
↓
x = (int)/2 - (int)/2
↓
x = ((int)-(int)) / 2
頑張って最適化しても、APIより先には手が出せない しかもホットスポットがAPIの中そのものだったりする
ダメだこりゃ。
いかりやさん…
>>588 そうなのか、サンクス
マルチモニタの場合を考えなければ
/2の部分を修正した
>>573 の方法でOK?
>>587 そんなのないと思うでしょ。
MS Virtual PCのような仮想マシンで動かせば簡単に作れる。
大抵、仮想マシン側の画面解像度をホスト側のウィンドウ(のクライアント領域)の
大きさに合わせる機能が備わっているため。
まぁどうでもいいけどな 実際はないんだから
>>587 自由に解像度が設定できる(仮想含む)グラフィックボードとか、
あるいはウィンドウモードで動作する仮想PC使ったこと無いの?
Win32APIはWinFXとなり新しく生まれ変わります。
しかし、この大胆な計画はまったく賛同を得られずマイクロソフトは撤回した。
そして、周囲に中核を失って残骸となったサブシステムが残った・・・ そして後日、小出しに公開
そしてWin32API派と.NET派の戦いが始まった…
.NET派なんて中にAPI派を抱えてるから簡単に… いやなんでもないです
奴らを寝返らせるのは簡単ってかw
>>573 こんな感じの実装になると思われ。(間違っていたらごめん。)
DWORD g_window_style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
rect2.top = 0;
rect2.left = 0;
rect2.right = MAX_SCREEN_WIDTH; // クライアント領域の幅
rect2.bottom = MAX_SCREEN_HIGHT; // クライアント領域の高さ
AdjustWindowRect(&rect2, g_window_style, TRUE);
rect.left = ( GetSystemMetrics(SM_CXSCREEN) - (rect2.right - rect2.left) ) / 2;
rect.top = ( GetSystemMetrics(SM_CYSCREEN) - (rect2.bottom - rect2.top) ) / 2;
rect.right = rect2.right - rect2.left;
rect.bottom = rect2.bottom - rect2.top;
CreateWindow関数にg_window_styleとrectを渡す
rect.left // ウィンドウの横方向の位置
rect.top // ウィンドウの縦方向の位置
rect.right // ウィンドウの幅
rect.bottom // ウィンドウの高さ
WM_CREATEの中でSetWindowPosしないと、 どのモニタで起動しようとしたのか把握できない気がする。 後は、MonitorFromWindowで対象モニタの情報を取って、 作業領域の中央に配置するように計算すれば良い。
AutoHotkey で Win32API を使っています。
ノート PC の電源状態を取得する目的で、以下のスクリプトを使用しています。
; stat はモニター電源が On なら 1、Off なら 0 を返す
LCDPowerState() {
hDisp := DllCall("CreateFile", "Str", "\\.\LCD", "UInt", 0xC0000000, "UInt", 3, "UInt", 0, "UInt", 3, "UInt", 0, "UInt", 0, "Ptr")
DllCall("GetDevicePowerState", "UInt", hDisp, "IntP", stat)
DllCall("CloseHandle", "UInt", hDisp)
Return, stat
}
しかし本スクリプトは内蔵モニターと外部モニターを区別しないようで、
特に外部モニターを外した後、常に 0 または 1 を返し続けることがあります。
内蔵モニターだけを監視するには、どのようにハンドルを取得すべきなのでしょうか。
関連がありそうなリンクを以下に列記します。
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/c83373d7-20de-4042-9804-6aabe0a93d5f/ http://homepage1.nifty.com/MADIA/vc/vc_bbs/200411/200411_04110001.html 宜しくお願いします。
>>606 ,607
サンクス
とても勉強になりました
子プロセスから親プロセスが所有するWindowにウィンドウメッセージを送りたいのですが、 ウィンドウハンドルはどのように渡せば良いでしょうか? HWNDをポインタとして数値表記をコマンドラインで渡す方法がよくつかわれているようですが、 HANDLEはポインタと互換であることが保証されているのでしょうか? なお、親になるプロセスは複数インスタンスが同時に実行される可能性があり、かつ、 送信先のWindowのタイトルもユニークではないので探して送るはうまくありません。
>>610 ヘッダのtypedefくらい見ろよクズ
typedef void *HANDLE
となってます
まんまポインタです
それは現在の実装がそうなっているというだけで、保証されているとは言いませんね。
じゃあ保証されてないからそのまま死ねば?
知らないなら黙っててください
はぁ手前が黙れ
それを言い出したらずーっとWindowsである保証もねーよな。
アホな人が質問するのは良いですがアホな人が回答するのは控えてください
>>617 アホはいいですけど低知能な質問はお断りです
>>617 そもそもAPIの質問じゃないじゃん。
スレタイも読めない奴は小学校から出直せよ。
で保証されてんですか?
ID出ないからやりたい放題だなオイ
保証されてるか聞いてんのにヘッダー見ろとかw
>>627 じゃあMSに電話して聞けよ
アーキテクチャーが正しいかどうかなんて部外者には分かんねーぞ
本だって「書いた時点ではそうなってる」以上のことは言えないんだから
UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
じゃあ最初から「MSに電話しろ」って答えるか、黙ってれば?w
夏だなあ
質問も汲み取れないから仕様書いつも読み違えてバグばっかりなんだよお前らはw
いんさまーばけーしょん
まぁでも保証してるのかどうか聞いてるのは痛すぎると思うわw
保証が必要じゃAPIなんか使えないからな 怖くて
まだ続くの?
俺はもう飽きたからいい
WindowsSDKのドキュメントにも書かれている以上 一応信用して使っておいても問題無いんじゃないかな。 まあ、Win64の話が出てきたと思ったら DialogProcの戻り値がBOOLからINT_PTRに変わったなんて事もあるし、 諦めも肝心だったりするw
>>645 あー、それそれ。やっとまともな回答者が現れた。
Windows Data Typesに書かれてますね。
>>624 スレタイ読めなくて消えるべきはキミのようだ。www
ああ、まだやってたの? 暇だね
sizeof(int *) <= sizeof(int) であれば問題ない
> DialogProcの戻り値がBOOLからINT_PTRに変わったなんて事もあるし、 それのどこに問題があるの? result==TRUEやresult!=TRUEでチェック入れてた人は困るかもしれないけど そんな人って存在するの?
悪あがきw
リファレンスにBOOLと書いてあった以上居るんじゃあねえのか
DialogProcを書くやつがGetMessageの件を知らんとは思えん
このスレにはそれを知らない自称回答者が沢山いる。バカなんだから黙ってりゃいいのに。
バカなくせにしゃしゃり出ておまけに逆切れまでしてすいませんでした
GetMessageなんて定型で使ってる奴多いだろ Mainにコピペで済ませてるだけなら知らなくても不思議ではない
夜分遅くまでたのしそうっすね
INT_PTRはポインタじゃなくてポインタサイズの整数じゃ! と何度も言う必要があるな。ひどい名前付けてくれたもんだぜ
誰だよその酷い記事書いたのはw
つまり_PTR追加しときゃ間違いないってことだ
APIがどんどんカオスになってくる
整数型にアドレスぶっこむ奴らの気が知れない そんな奴は頼むからプログラム書くな いつか飛行機が墜ちる
ポインタに演算なぞ以ての外 Cの使用は法律で禁止すべき OSもPascalで書け
Adaがあるだろ
キチガイ語り場!
Jhon、、、Ada、、、、
しまったJohnだった
Jホンェ・・・
>>649 BOOLに対して、result==TRUEやresult!=TRUEは禁止だろうけど、result!=FALSEはありだし互換性はあるな。
Windowsフォトビューアーでzipファイル内の画像をダブルクリックして開いたあと、 左右矢印のボタンを押すとzipファイル内の別の画像を表示できますが、 これはどうやったら実現できるのでしょうか? 普通に関連付けただけでは、1個だけ画像が展開された一時フォルダのパスが 渡されるので、元のzipファイルには他にどんな画像が含まれていたのか 知ることができません。
>>672 zipファイルのパスがわかれば自分で開いて読むのですが、
一時フォルダのパスしかわからないのです…
apiとどういう関係が?
パスってフォルダのことか。パスワードのことかと思った。
>>674 Windowsフォトビューアーがzipファイルのフルパスを取り寄せる方法は
APIとして公開されているのでしょうか?
レジストリのHKCRでjpegfile/shell/open/DropTargetとか 登録されているのが何か怪しい。BMPとかPNGとかも似たような感じだし。 ShellNamespace系のインターフェースで受け取れたりとかするんじゃないか? 試すの面倒そうだから後は知らないけど。
C言語は読めるが日本語が読めないので
>>672 は読めない
自己解決しました。 COMローカルサーバーを作成してIDropTargetとIObjectWithSiteを実装 →IObjectWithSite::SetSite()で設定されたpUnkSiteからIServiceProviderをQI →IServiceProvider::QueryService()でIShellBrowserを取得 →IShellBrowser::QueryActiveShellView()でIShellViewを取得 →QIでIFolderViewを取得 →IFolderView::GetFocusedItem()とIFolderView::Item()でPIDLを取得 →IFolderView::GetFolder()でIShellFolderを取得 で、zipファイルを表すIShellFolderとダブルクリックした画像のPIDLに到達できました。 一時フォルダに無意味に画像ファイルが展開されてしまうようなのですが、 Windowsフォトビューアーでもそうなるので仕様なのだと思います。お騒がせしました。
あ、更新する前に書き込んでしまった
>>677 おっしゃる通りDropTargetキーとShell Namespaceが鍵でした。ありがとうございます。
よく判ったな シェル関係とか関わりたくねえ
文字列・・だと・・?
言葉足らずで申し訳ないです。 文字列とは、Ctrl+Q,Shift+Ctrl+Eといったもののことです。
そんなAPIないだろ
MapVirtualKeyExの逆という意味なら、VkKeyScanExとかか?
>>684 ホットキーのプレビュー表示用(スペース入りだけど)はそんな感じだし
ByIdに対するByNameだから普通にありそうな気もするけど
俺ならとりあえず
std::map<std::string,WORD>
とかで変換用のテーブル作っちゃうかな
IDEの進歩のおかげでリファクタリングも容易ですし
VBのSendKeysみたいなやつか?
689 :
デフォルトの名無しさん :2010/08/02(月) 00:39:58
WinTab.dllを用いずに、ペンタブ筆圧を取得する方法ってありませんか? Win7+.Net4+Silverlightとかで普通に取得できる事をXPとかじゃできそうになくて。 WinTabのソースコードでも公開されてれば自分で解析するんですが…。 ご存知の方はご教示宜しくお願い致します。
あ、それから 知らない人は黙っていてください。
そうはいきませんよ(ニヤリ
XPだと、Win32 APIでは無理。 ということで、スレ違いだな。
The Linux Wacom Project でソース後悔されてないの?
自力で通信すれば可能だけど知らない人は黙ってろっていうから 詳しくは書かないでおくわ
いい心がけ
XPのGetPrivateProfileSectionNamesで、存在しないセクション名が取得されることってあるんですか? なんか、ほかの人のところで動かしたら、そんな状態らしいんです
レジストリにマッピングしてるとか?
ノートPCでバッテリーが何%まで減ったらバッテリー切れの警告が出るか、調べるAPIを教えてください OSはXPです
>>698 CallNtPowerInformation
>>699 ありがとうございます
なんとかなりそうです
コントロール(CScrollWindowを継承)に、DrawTextやら何やらで、WM_Paint時に描画したのですが、 スクロールさせると、文字が潰れるというか、表示がめちゃくちゃになってしまいます。 ブラウザやテキストエディタのように、スクロールさせても整然と表示させるには、 どういった処理をすればよいのでしょうか?
全く実装内容が不明なCScrollWindowが怪しい。
リストビューのアイコンにイメージリストを使わずにHICONを直接出すには オーナードローで実装するほかにないでしょうか
カスタムドローでもいけるヨ
サービスプログラムからログインユーザの権限でGUIアプリを起動させることは可能でしょうか?
可能 がんがれ
低水準キーボードフックをするdllを書いたんですけど DirectX利用のフルスクリーンのものを起動している状態だと機能しません DirectInputよりも低水準キーフックのほうが先に受け取れると聞いたのですが これは妨げられていると考えていいのでしょうか windows 7 64
DirectX利用のフルスクリーンのものを起動したあとに キーボードフックする
709 :
703 :2010/08/07(土) 20:16:16
カスタムドローでやってみたところ出来ました ただ、アイコンを描画するための余白を空けるために イメージリストは必要(空白のアイコンを1つ入れるだけ)でしたが
事故解決
とんだアクシデントでしたね
拡張子以外でEXEかSCR(スクリーンセーバー)か見分ける方法ってありますか? 自分で見た限りではスクリーンセーバーと普通のEXEには、全く違いを見つけることはできませんでした。
>>712 カスタムドローの通知メッセージの時に使う
構造体を探してもHICONを入れるところが見つからないですが‥‥
くだスレでもよかったんですが、ここでオナガイシマス インスタンスハンドル型のデータを表す、HINSTANCE これってなんて読んだらいいのぉ?
インスタンスハンドル型
LPCSTRをロングポインターコンストストリング型と読んでる奴がいるかどうかくらい不毛な話だ
いないだろ?
WCHARを「わちゃー」って呼んでる奴いるだろ?
最近intとかcharを書いたことがない LONGとかのマクロばっかり書いてるとせっかくの構文着色が意味なくなるな 色がついてるの条件文とreturnくらいだ・・・
usertype.datくらい書けよw
MSDNではLONGはlong、INTはintになってたりするけどな
WCHARとwchar_tの違いがわからん
(ノ∀`) ワチャー
wchar_tとかへんてこなのがC標準に入るとか意味わからん
Win32に限るなら違いはない gccだとsizeof(wchar_t) == 4だったりするのでMinGWではわざわざ sizeof(wchar_t) == 2にするためのコンパイルオプションを使ってる
dwchar_tとかに名前かえろ
こういう文字コード、文字セットが絡む部分はコンパイラ仕様じゃなくてライブラリ側で対応するのがスマートだな charではなく最初からbyte、unsigned byteにしとけばよかったんだ
Microsoftが自社の都合だけで仕様変えられる独自拡張じゃないので
多くのアプリケーションの設定画面のような、 設定画面が開いている間は他のウィンドウの操作を一切受け付けないような ウィンドウってどうやって作るの? 他のウィンドウにフォーカスを当てようとすると 警告音が鳴って、タイトルバーが点滅するようなウィンドウなんだけど
モーダルダイアログでググればいいとおもうよ
flashって簡単ですか? mxml?
お前は何の話をしているんだ
>>731 アプリケーションウインドウの手前に設定用のウインドウを出すために
アプリケーションウインドウをオーナーウインドウする。
操作を受け付けないようにするには、EnableWindowで無効にする。
この2つの組み合わせで出来る。
DialogBoxを使う場合はこれを勝手にやってくれるので、自分でやる必要はない。
何もMFCの実装のような真似をしなくても、 普通はWS_POPUPで事足りるだろ。
感動した!!
子ウィンドウを親ウィンドウの後ろに表示するにはどうしたらいい?
サービスプログラムから、ログインユーザ名を取得するにはどのようにすればよいでしょうか? GetUserName()だと当たり前ですが、"SYSTEM"を取得してしまいます。
>>739 子ウィンドウを監視して前面に来たら後ろに戻すとか
親ウィンドウをモーダル化するとか。
>>740 泥臭いやり方だと、プロセス一覧を作って
プロセスのユーザー名からSYSTEM関係を除いて一番多い奴
とか。
742 :
739 :2010/08/09(月) 18:12:21
>> 741 レスありがとうございます。 ただ、もう少し正確にログインユーザ名を取得する方法をしりたいです・・・ レジストリなどのどこかに記述されていないでしょうか?
レジストリにあると思うならregeditで検索すりゃkeyぐらいわかるだろ
ターミナルとかリモートデスクトップとかで複数ユーザーがいたり そもそもログインしてないとかどうすんの
>>739 コンソールセッションなら
WTSGetActiveConsoleSessionId
WTSQuerySessionInformation(WTSUserName)
×739 ○740
747 :
デフォルトの名無しさん :2010/08/10(火) 12:22:42
クリップボードを監視するソフトを作っています。 SetClipboardViewerとChangeClipboardChainを使い WM_CHANGECBCHAINとWM_DRAWCLIPBOARDのメッセージ処理を書いて、 普通に使う分には目的に沿ったソフトを作ることができました。 ただ、クリップボードチェイン内のプログラムの異常終了・強制終了などが原因で クリップボードチェインが切れるとクリップボード監視動作も止まってしまいます。 検索してみるとクリップボードチェィン切れ対策をしなければならないということだけはわかったのですが クリップボードチェィン切れ対策とは具体的にどのような事をすればいいのでしょうか? タイマーなどで、何秒かおきに ChangeClipboardChain SetClipboardViewer を呼び出して再設定し直すという方法は、やってみたのですが WM_DRAWCLIPBOARDに無限ループ的にメッセージが 飛んでくることになってしまい、うまくいきませんでした。 ご存知の方がおられましたら、よろしくお願いします。
スパイウエアのソースを参考にするといい
監視とか覗きとかをやろうとする人間にろくな奴はいない。
それでは、通過するIPパケットを監視して、アドレス変換をおこなっている
いわゆる家庭用BBルーターを使用している
>>749 はカスという事で良いですね。
ftpのルーター超えでは覗きまでやってるので、カスの極みですね。
>>748 >>749 すいません。書き方が悪かったです。
ソフトの大まかな機能は、クリップボードの履歴をとって再利用するだけのソフトです。
>家庭用BBルーター わざわざ「家庭用BB」を付けるあたり、だれもが使っているという発想が初心者臭くていいよね。
うん。 その初心者にもわかる自己矛盾に気付かなかった>749が、より一層惨めになるでしょ。
郵便配達員が宛先を確認するのと、手紙の中身をのぞく違いが分かっていない時点で、 確かに惨めだよね。
ルーターのプログラムを作ったやつがカスなんだろw
>>754 多分わかってないのはキミの方だと思うよ。せっかくftpってキーワード書いてやったのに。
FTPもデータを覗いている訳じゃない。 恥の上塗りを繰り返すのが趣味なんだろうけどね。
夏だなあ ああ夏だなあ 夏だなあ
他のプログラムにキー入力イベントを送るプログラムを作りたいのですがどうやったらいいですか
まずVisualStudio を起動します。
> FTPもデータを覗いている訳じゃない。 > 恥の上塗りを繰り返すのが趣味なんだろうけどね。 うわ〜〜〜。ここまで恥の上塗りを繰り返す人も珍しい。w
具体的に突っ込めないからって人格攻撃て
>>760 起動しました。
ターゲットのプログラムのウィンドウハンドルを得るにはどうしたらいいですか。
764 :
デフォルトの名無しさん :2010/08/10(火) 19:32:51
>>763 FindWindow関数で検索するといいよ。
そこからさらに、少し調べる必要があるけど、ぐぐればわかるからがんばって。
うわ〜〜〜 > 具体的に突っ込めないからって人格攻撃て って、言う事は > FTPもデータを覗いている訳じゃない。 まさかこれで、具体的に突っ込んでるつもりなんだろうか。 無知とはまさに恐ろしい。www
なんで無駄に煽り合うの?
プログラマはストレスがたまっている
次スレのテンプレにはクリップボード関係は禁止、を入れるべきだな
どちらかというと他のプログラムに干渉するのが、板のルールに引っかかるんだけどな。
そんなこと言ったらOSの存在自体が板のローカルルール違反だわ
だれもOSの作り方なんて聞いていないが、幻覚が見えるんだろう。 病院へ行くことをお勧めする。
見えない敵と戦いすぎだな糖質
なんで無駄に罵り合うの?
プログラマはストレスがたまっている
プロ レス
見えない敵と戦いすぎだな糖質
だれもOSの作り方なんて聞いていないが、幻覚が見えるんだろう。 病院へ行くことをお勧めする。
クリップボードの内容を定期的にクリアする常駐ソフトがスタートアップ される環境です。タスクマネージャから終了させてもすぐに再開 してしまいます。このソフトを起動するのはこの場合別の常駐 プロセスでしょうか?それとも別のソフトウェア(エクスプローラ) とかでしょうか?それを判別するプログラム或はAPIってありますか?
次スレのテンプレにはクリップボード関係は禁止、を入れるべきだな
>>778 NtQuerySystemInformationでSYSTEM_PROCESS_INFORMATIONを取得すれば親プロセスのプロセスIDが確認できる
すげー、デジャヴ。
コピペ禁止するために生徒のPCに組み込む
>>778 なプログラムの作り方聞いて
叩かれまくってた先生が居た気がする。
っつーかわざわざ車輪の再発明せんでも フリーのツールいっぱいある気がす
他のプログラムにマウスの入力を送る方法で、sendmessage()以外の方法って何がありますか
偽マウスドライバを作って、そいつから送らせる。
SendInputとか
画面にドッキリ画像を表示 + ちょっと大きめの音を出す んで、びっくりしたユーザーの振動がマウスに伝わる。 もちろんフォーカスをターゲットとなるプログラムに合わせておく。 これでバッチリ
SendInputいいすね。hwndなしでも使えるし。
乱数の種に使えそうだ
どこのF.E.A.Rですか
笑ったけど、フォーカスってキーボード用・・・
メモリデバイスコンテキストに関連付けたピクセルバッファを RGB(0x77,0x77,0x77)で埋め尽くし その後にDrawIconEx(フラグはDI_IMAGE | DI_MASK指定)を使って、アイコンを描画し ピクセルバッファから、RGB(0x77,0x77,0x77)では無い部分を抜き出すコードを書いて動いているんですが 極々一部のPCで動かすと、RGB(0x77,0x77,0x77)で埋め尽くした部分が DrawIconEx後に見ると、0x00で埋め尽くされているんですが、これは環境に依存してしまうんでしょうか?
ピクセルバッファって何?
richeditコントロールに画像を張り付ける事は 可能ですか?
>>792 ピクセルバッファにクリエイトコンパチブルビットマップとセレクトビットマップしていないと予想
カタカナで会話するなぁーッッッッッッッッッッッ!!
ぴくせるばっふぁにくりえいとこんぱちぶるびっとまっぷとせれくとびっとまっぷしていないと予想
DrawIconExは成功しているのかどうか
極々一部で動かないマシンは対象外でいいだろ
Win32APIのツリービューでTVS_CHECKBOXESで全項目にチェックボックスが付くのは解ったのですが、 子項目はそのままで、親項目のみにチェックボックスを付ける方法などはないのでしょうか? オーナードローは出来ないみたいですし、カスタムドローでいけるかと思ったのですが駄目でした。 よろしくお願いします。
SendMessage, PostMessage, SendInputを使用して他プログラムにキーボード入力を行う プログラムを作成しているのですがうまくいきません。 自作の実験用プログラムに対しては正常動作しました。 またspy++で普通にキーボード入力して発行されるメッセージと同じメッセージを プログラムから送ってみましたがダメでした。 ターゲットのプログラムがWM_KEYDOWNメッセージを無視してGetAsyncKeyStateなどで キー入力を見ているように思うのですが、こういう場合はどうやればターゲットのプログラムに キー入力を送れますか。
dllinjection
素人には使いこなせません
805 :
デフォルトの名無しさん :2010/08/14(土) 20:24:13
いいからAPI出せや
detteiu
VirtualAllocEx VirtualProtect WriteProcessMemory CreateRemoteThread ImageDirectoryEntryToData かな。 グローバルフック使う方がリモートスレッド作成する手間が少ないか。
ちょっと実験で、 WndProcの中にcase WM_KEDOWN: return 0; メインループの中にGetAsyncKeyState(VK_DOWN) を記述したテスト用プログラムに対して、別のプログラムから SendMessage(target_hwnd, WM_KEYDOWN, VK_DOWN, 0) してみたら、SendMessageの入力は無視されて、直接↓キー押したら反応して、 今回のターゲットのプログラムと同じ挙動になった。 GetAsyncKeyStateの中で参照してるキーの押下情報はWM_KEYDOWNで書き換えられるパラメータとは 別個にあるみたいですね。GetAsyncKeyStateに対応したSetAsyncKeyStateみたいな関数があればいいんだけど。 DirectInputとかも関係あるのかなあ。言語を変えてJavaとかでもやってみるかな。。
>>809 確かその関数って割と低レイヤのデータをとってくるんだったはず
ウィンドウが非アクティブでもキー押下情報がとれたり
だからウィンドウメッセージみたいな高レイヤの処理とは根本的に別物
>>809 GetKeyStateはメッセージが飛んできた時の状態
GetAsyncKeyStateはAPIを呼んだ瞬間の状態
AmazonのDBの価格情報がint型だってことは分かった
金融計算でfloat,doubleやNumber(DB上はこう呼ぶ)など 浮動小数点実数を使うこと自体異常
いやいや価格の定義上uintの可能性も捨てきれないだろ。 でもintだろうな。数字を見た感じ。
>>802 keybd_event でできるかも?
>>816 おおおおおおおおお!!できましたー。
あなたは神です。ありがとうありがとう。
しかしSendMessage, PostMessage, SendInputでダメだったのに なんでkeybd_eventだとうまくいくんだろう。 他より低水準な処理をしてるんだろうことは分かるが。
>>816 無理だろ
SendInput、keybd_eventはいずれもキューにキーボードイベントを格納するもの
最終的に該当ウィンドウのメッセージ処理でキーボードイベントとして処理されることが前提
ウィンドウメッセージとは無関係にキーボードの状態を知るためのAPIがGetAsyncKeyState
このAPIに割り込むには、APIフックなどを使ってAPI自体の挙動を自力で上書きするしかないと思う
できたと言ってるのに無理ってw
keybd_eventではhwndを使ってないことが良かったのかな。
822 :
819 :2010/08/15(日) 01:20:57
なんか書いてる間に解決したみたいだけど釈然としない GetAsyncKeyStateはともかく、 keybd_eventってSendInputと同レベルの旧APIだと思ってたんだけど、 keybd_eventの方が高度なことってあるの?
>>809 WM_KEYDOWNはSendしちゃダメだよ。それはPostするメッセージ。
keybd_eventだと
>>809 のテスト用プログラムでも動作しました。
keybd_eventのみGetASyncKeyStateが参照するパラメータをいじってるようですね。
>>823 PostMessageでもダメでした。
keybd_eventでもハードウェアスキャンコードを適切に充てれば無敵
>>824 どのネトゲの話をしてるのかわからないけど
keybd_event動くならSendInputも間違ってなければ動くよ
千田(wとか言っちゃうゲームの話ならこれ以上詳しい話はしない
気になったのでSendInputの動作も確かめました。
結果、
>>809 のプログラムはSendInputでキー入力情報を送れました。
が、ターゲットのプログラムに対しては全く同じ処理にも関わらず送れませんでした。
以上です。
普通に動くわけじゃないから送れば良いってもんじゃないんだけどまぁ良いか 何のネトゲか話しないしこれ以上教える義理も無いし
質問スレなんで教える気の無い人はすっ込んでてくださいね
>>829 教える気は有ったよ、むしろ満々だったよ。
だけどSendInputをどのように処理したか言わないわ
経験からPost/SendMessage受け付けないのはネトゲだろうと踏んで詳しく聞こうとしても無しのつぶてでどうすれと?
大体ネトゲBOTの質問に対してそんなに優しいスレじゃなかったろうに何なんだよw
気分だよ
そんなもんだよな わかった、素直に寝る事にする
SendInputの処理は以下ですよん。コピペなので詳しいことは理解してないです。
これで
>>809 のテストプログラムは動いて、実際に動かしたいプログラムに対してはダメでした。
void send_keyinput(WORD VirtualKey, BOOL bKeepPressing)
{
INPUT input[1];
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VirtualKey;
input[0].ki.wScan = MapVirtualKey(input[0].ki.wVk, 0);
input[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
input[0].ki.time = 0;
input[0].ki.dwExtraInfo = ::GetMessageExtraInfo();
::SendInput(1, input, sizeof(INPUT));
if (!bKeepPressing)
{
input[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
::SendInput(1, input, sizeof(INPUT));
}
}
あとターゲットのプログラムはGetAsyncKeyStateでキー情報を読んでると予想しましたが
どうやら違ったようですね。DirectInputとかでしょうか。
モードレスダイアログでWM_KEYDOWNを処理したいんだけど、メッセージが来ない・・・ WM_GETDLGCODEっていうのが大量に来るけど、これを処理するのがモードレスのマナー?
TranslateMessage呼んでるか
>>835 有難う!
GetMessageのループ内で、IsDialogMessageでTRUE帰って来たらcontinueしてた
ちょっとcontinueせず、Translateよんでみます
IsDialogMessage関数の後にTranslateMessage関数とか実行して駄目じゃなかったっけ?
838 :
デフォルトの名無しさん :2010/08/15(日) 11:00:27
>>838 そこの仕様に書いてあるじゃん
で、フックで横取りとか
>>838 のソフトやspy++のように、特定のウィンドウを指定して
メッセージを取得するのはフックでできるんだっけ?
ウィンドウハンドルからスレッドID取れるからできるよ
842 :
838 :2010/08/15(日) 12:44:27
>>838 ありがとうございます。フックでやってみます。
843 :
デフォルトの名無しさん :2010/08/15(日) 16:12:04
いいからAPI出せや
>>814 派遣会社に派遣されて、金融計算(パソコンのint型で
桁が足りないからdouble使用)の糞プログラムの改造の
仕事がまわってきたから、とんずらして会社辞めてやった。
スレ汚しスマソ
三週間毎に二日連続というパターンを示している
VistaやWindows7のエクスプローラみたいに、リストビューの項目を 選択すると薄い選択色になるようにするにはどうしたらいいのでしょうか Win7で動かしても、従来の濃い選択色にしかなりません
847 :
846 :2010/08/16(月) 09:10:19
SetWindowTheme(ListView,L"Explorer",NULL);でいけました
>VistaやWindows7のエクスプローラみたいに >Win7で動かしても イミフ
Win7風のリストビューをWinXPでも実現したいと勘違いされそうだったので 明示的に書きました
いいからAPI出せや
API
AIDS Pneumonia Inkin
64bit用DLLを作ってるんだが、共有メモリを用意するためCreateFileMappingすると NULL返して、GetLastErrorで見るとERROR_INVALID_HANDLEを返すんだが これは何故?32bitだと問題なく動く
DllMainでやってるなら死んだ方がいい
何故?よくやってるサイトとか見るけど
MSDNの解説が正しいとかどこの情弱だよ
英語版は少なくともお前の10万倍は信頼性が高い。
>>857 のソースをコピペして64bitでコンパイルしたら普通に実行できた(Win7 64bit VS2008)
なので
>>853 のソースのどこかにバグがある。
DLL_PROCESS_ATTACHで static const TCHAR *MAP_FILENAME = TEXT("SHARE"); hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(DATAITEM), MAP_FILENAME ); としていて、駄目になる WinXP、32bitのVC++2010 ビルド後はWinXP64bitで確認してる
その程度で笑いが取れると思ったら大間違いだ! ……まさか素じゃないよな?
>>861 適当なハンドル渡せばERROR_INVALID_HANDLEが返るに決まってんだろwww
駄目に決まってんじゃねえかアホか
HANDLEはvoid*なんで… void*ってことは64bit環境なら64bitなわけで… -1ってことはビットが全部立ってるわけで… すなわち
(^0)
0xFFFFFFFFFFFFFFFF
なんかもうやだ
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
しかしこんな微笑ましいミスでよかったと思う
m9 (^0 ^ )
というか、CreateFileMappingでググって上位に来るサイトで、0xFFFFFFFFとか書いちゃってるしなwww
875 :
861 :2010/08/16(月) 21:13:07
みんな有難う… 0xFFFFFFFFは駄目なのか…どのサイトも0xFFFFFFFFばっかりだから気づかんかった…
なぜ素直にINVALID_HANDLE_VALUEを渡さないんだw
通常ファイルではなくページファイルを使う目的でINVALID_HANDLE_VALUEを代わりに指定させるような設計も問題ありだな。 目的とマクロ名が一致してない。今のMSなら卒倒しそうだ。
878 :
デフォルトの名無しさん :2010/08/16(月) 21:41:36
いいからAPI出せや
NT3.1だぜw
x64ならではだな
ファイルのオープンに成功したどうか確認しないでCreateFileMappingすると ページファイルを使ったファイルマッピングオブジェクトが作成されてしまう (エラーにならない)罠があるってAdvanced Windowsに書いてたな。
いまだにMSDNとか読んでる情弱犯罪者がいるんだ
>>884 のお勧めはなんですか? SAMSONですか? 愛読してるんですよね。
2chの回答って必ずミス付きだよな
どんなにでかい釣り針でもかからずにはいられない人がいるんですよ
丸投げで投資0で利益を回収しようとする輩が多いからわざと埋め込んでいるという噂を聞いたことがある
そんなもん自称上級者がミスを隠蔽するために釣りだったことにするのは良くある話だ
見事に釣られてるのに認めたくない奴が後釣り扱いするのも見かけるw
--------------------------------- ヘ_ヘ ミ・・ ミ ということにしたいのですね ( )〜 void ---------------------------------
>>834 のように、モードレスにするとWM_KEYDOWN来ないんだがこれは何で?
wisdomや猫でも分かるのサンプルコードにWM_KEYDOWN追加しても来ない
で、if(IsDialogMessage(hdlg,msg)){
TranslateMessage(msg);
DispatchMessage(msg);
continue;
}
とやるとWM_KEYDOWN来るけど、MSDN見ると
>>837 のように記述が書いてある
モードレスダイアログに対してのメッセージだからDispatchしてもいい気がするが何か気持ち悪い
>この関数は、メッセージが必要とするすべての変換とディスパッチを実行するので、IsDialogMessage で処理したメッセージを TranslateMessage または DispatchMessage 関数へ渡してはなりません。 >戻り値 >メッセージが処理されたときは、0 以外の値が返ります。 >メッセージが処理されなかったときは、0 が返ります。
VisualC++2008ExpressEditionでIMEの辞書登録単語を編集するプログラムを作成しています。 辞書の読み書き削除を行うためにIMM32の機能を利用していたのですが、 この度実行環境をXPからWindows2008Serverに変更した所動作しなくなりました。 調べていく内にTSFという物にたどり着いたのですが、 辞書云々に該当しそうな物としてはITfFnConfigureRegisterWord(辞書ツールのダイアログを表示する) くらいしか見当たりませんでした。 Windows2008ServerとMS-IMEの環境下でこのような処理を行うにはどうすればよいのでしょうか。
MS-IME限定ならIFEDictionary使えばいいんじゃないの
>>895 レスありがとうございます。
IFEDictionaryを使えばほぼ再現できそうなのですが
あと一点、登録単語の削除のメソッドがないみたいです。
ImmUnregisterWordに相当する機能は何かありませんでしょうか。
897 :
894 :2010/08/17(火) 17:33:28
>>896 も私です。
自己解決しました。
IFEDictionary::RegisterWordの引数で削除が指定できるのですね。見逃していました。
>>895 さん、本当にありがとうございました。
898 :
デフォルトの名無しさん :2010/08/17(火) 18:44:10
ポゥ!!
C++ Win32APIのツリービューでTVS_CHECKBOXESで全項目にチェックボックスが付くのは解ったのですが、 子項目はそのままで、親項目のみにチェックボックスを付ける方法などはないのでしょうか?
無い 自作しろ
で、実際にチェックつけられたとしてそれはどういう意味になるの? 人間の感覚、想定する想像と違う動作をするUIは避けるべき
設計スレじゃないんだから、くだらない精神論垂れ流すのやめなよ。 「トップ項目をチェックする」というメニューかもしれない。
Comctl32 6.0のリストビューではグループ化機能が使えるけど WindowsXPでグループ化している時はソートができないのは仕様ですか? Windows7だとできるんですが。
精神論・・・? 使い方間違ってるぞ
>>899 けど実際どういうことに使うことを想定しているか聞きたいな。
ちょっと興味がある。
どう使うか自分が想像できない事だし。
オレ様の想像力を超えた設計はするなってか? お前らは粛々とAPI答えてりゃ良いんだよ。
そう受け止めるかw 屈折してるなーw
908 :
デフォルトの名無しさん :2010/08/19(木) 00:02:04
いいからAPI出せや
API API API API API API API API APIたちが… API API API API API API API API キングAPIになった!
912 :
デフォルトの名無しさん :2010/08/19(木) 07:06:49
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CREATE: return Wm_CreateProc(hWnd,(LPCREATESTRUCT)lParam); case WM_COMMAND: return Wm_CommandProc(hWnd,HIWORD(wParam),LOWORD(wParam),(HWND)lParam);←この関数中で 〜 } return DefWindowProc( hWnd, msg, wParam, lParam ); } ↓これをした後 void hgoe(HWND hwnd) { LPSTR str; float x,y,z; GetDlgItemText(hwnd ,10,str ,100);sscanf(str,"%f",&x); GetDlgItemText(hwnd ,11,str ,100);sscanf(str,"%f",&y); GetDlgItemText(hwnd ,12,str ,100);sscanf(str,"%f",&z); } WinMain中の MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }←ここでエラーが出ます } エラーメッセージはメモリの000005を読み込み中にエラーですみたいな、アドレスがちゃんと入ってない時に出るエラーだと思うのですが、どうすれば良いでしょうか?
>LPSTR str; >float x,y,z; >GetDlgItemText(hwnd ,10,str ,100);sscanf(str,"%f",&x); TCHAR str[MAX_PATH];とかに変えてみ
914 :
デフォルトの名無しさん :2010/08/19(木) 07:25:23
>>913 おお!できました!ありがとうございました!
他のところではそういうやり方でやってたのですが
このやり方でも通ったので全くそこが問題だと思いませんでした!
変な場所でエラーが出るから分かりにくいですね。
>>914 >他のところではそういうやり方でやってたのですが
>このやり方でも通ったので全くそこが問題だと思いませんでした!
該当箇所を全部書き直したほうがいいよ
それは動いてるように見えてるだけで、実はスタック破壊を起こしてる
その辺を調べて詳細知ったほうが頭に入るから
どんなコンパイラを使ってるんだ? 普通はコンパイル時に未初期化変数の警告を食らわないか?
917 :
デフォルトの名無しさん :2010/08/19(木) 07:39:45
VC++2008EEです 未初期化の警告は有りましたがエラーじゃない場合は無視するという方針ですた(`・ω・´)ゞ
今すぐ「警告をエラーとして扱う」をオンにしておけ。 個人的にはプロジェクトを作ったら真っ先にオンにしておく事をお勧めする。
これはひどい
C言語初学者がよくやるミス
ポインタとか基礎を学習してないと書けないコードだな
こういう奴未だに量産されてんのか C++は本当に巨大な糞塚だな
C++を悪く言うなよ。そもそもC++のコードでもないだろ
ユーザが多いからクソも多いだけで、C++が無かったらそのクソは他の言語に群がっている。
925 :
デフォルトの名無しさん :2010/08/19(木) 16:53:54
つまりPHPみたいなもんだな
PHP始めようと思って調べたら、どの解説サイトも この設定のこの値を…という記述ばかりで、それを変えると何が変わるのか一切無かったから辞めた JSPで十分だわ
又聞きを連ねてるだけで裏づけがねーよな エンコーディング関係なんて完全におまじないでやってる奴が多い
オープンソースプロジェクトなんてみんなそんなもんだろw
動きゃいいんだよ、動きゃ。
動かないくせに・・・
一見正常に見えるのが一番の悪
強制終了ダイアログを呼び出すAPIってありませんでしたっけ? むかしどこかで見て、関数名を忘れてしまいました……
WM_CREATEはメッセージループが回り始めた時に 最初に呼ばれるんですか? それともwindowを生成した時???
後者
「問題が発生したため……」のダイアログの方を呼び出す関数ってありませんでしたっけ
イライラ
ダイアログボックステンプレートリソースから、モードレスダイアログボックスを作成する際に、 CreateWindowExのhMenu引数のに子ウィンドウIDを指定するように 子ダイアログに親ウィンドウからの子ウィンドウIDを指定することは可能でしょうか? (ウィンドウが作成された後、子ウィンドウIDを書き換える…など) 親ウィンドウから、「GetDlgItem関数を使って」子ダイアログのウィンドウハンドルを取得したいのです。 (GetDlgItemで取得することが目的です) 稚拙な質問ですが、ご教授願います。
それはGetDlgItemの機能じゃないから無理。
面白いAPI教えてください
よしまかせろ。誰か教えてやってくれ、たのむ。
944 :
デフォルトの名無しさん :2010/08/20(金) 17:11:38
win32api時代しか知らないおにいさんが答えてやるよ SendMessage( HWND_BROADCAST, WM_QUIT, 0, 0) 実行するなよ! 絶 対 に実行するなよ!
お前にはがっかりだ
GetDriveTypeで取り外し出来るディスクか調べてるんだが バルク品のハードディスクを外付けで繋ぐと、通常のハードディスクを返す 外付けかどうか調べる方法って他にないかな?
取り外せるかどうかじゃなくて(ディスクが)交換可能かどうか調べるAPIだからなぁ
無い。
949 :
デフォルトの名無しさん :2010/08/20(金) 21:38:52
質問です。Win32APIのみを使って(コンパイラのクラスライブラリは使わずに)、 CでWindows 95 OSR2.5上でプログラミングし始めました(XP SP3でもテスト済み)。 参考書は当時(Win95〜Win98時代)のものを洋書と和書を買い込んで。 で、単純なメニュー無しのウインドウを表示させるだけの、いわば スケルトン的なコードなんですが、最初にグローバル変数として static char NullWnd[32] = "NullWndClass"; そして初期化とインスタンスの関数としてそれぞれ static BOOL FirstInstance(HINSTANCE); static BOOL AnyInstance(HINSTANCE, int); long FAR PASCAL _export WindowProc(HWND, unsigned, UINT, LONG); と宣言しているのですが、たいていの入門書や(古い)入門サイトでは staticやWndProcの型修飾はついてないんですね。こいつらを付けるかつけないかというのは、 あまり本質的ではないものなのでしょうか?それとも、後々ボディーブローのように 効いてくる局面が(ひょっとしたら)あるのでしょうか? よろしくご教示ください。処理系はPC-9821Xc200(MMX Pentium 200MHz/96MB/8GB; Win95OSR2.5相当; コンパイラはBorland C++ 4.52(英語版)、OpenWatcom C/C++ v1.9)です。 OpenWatcom v1.9のサンプルプログラム(Win32用)のほとんどが、static付けてました。 XP SP3でも同じコンパイラを使用していて、Warning Level Maxで何も警告がでませんでした。
950 :
36 :2010/08/20(金) 22:00:22
これはねたなのか、本気なのか? 取り合えず、勉強するならもっといいパソコンと新しい資料を見た方がいい。
なんか、ずっと前につけた名前が残ってた…
952 :
949 :2010/08/20(金) 22:41:58
いや、ネタでこんな長文書きません。誤解があったらすいません。 ただ、PC-9821上のWin95/Win98(SE)/WinNT4で共通して動く コードを書きたいのです。当時のアプリで優秀なものが結構ありながら、 しかしソースコードが公開されていないために、 「なら自分で組んでやるぜ」と思った次第です。 DirectXの描画に関しては、基本的にはver. 6.1を基準にしていきたいです。 普段のデバッグは、自作のPhenom II x4 955BE (C2)/4GB DDR3/500GB+1TB SATA/ GA-MA785GT-UD3H/WinXP SP3のほうで同じコンパイラでやってます。 新しすぎる参考書(2001年以降くらい〜)とか、コンパイラだと、 そっちプロパーの解説になっちゃうので(猫本とかはどうなんでしょうか?)。勝手ですいません。 VC++ 2005 EE?が無償で使えるのは耳にしたことがあります。でも、とりあえず 手持ちのVC++ 4.0やBorland C++ 4.52時代のもので完結できたらいいな、と思ってます。 PC-9821で動かすのがポイントです。でなきゃ、Windows Programmingはやってなかったと思います。
953 :
949 :2010/08/20(金) 22:44:35
連投すいません。今まではPC-9801でx86アセンブラ、OpenWatcom C + FASMで 自作描画ライブラリを作ったり、サウンドやEMSメモリをいじったりしてました。
>ただ、PC-9821上のWin95/Win98(SE)/WinNT4で共通して動く >コードを書きたいのです。当時のアプリで優秀なものが結構ありながら、 >しかしソースコードが公開されていないために、 嘘を書くな しかも何でいまさらWin9x/NT4なんだ
>「なら自分で組んでやるぜ」と思った次第です。 でも static の意味は判りません(キリ
おちょくるなアホ
static → private extern → public
958 :
949 :2010/08/20(金) 23:35:29
Win32APIの質問だったら、ここしかないと思って質問したんですが、 なんで釣りとか嘘を書いてるとか、云われるんでしょうか…? 当時優秀だったフリーウェアで、ソースコード非公開のものは結構ありますよ。 それを自分である程度再現して、たとえばGPLv2とかBSDライセンスで公開したいというのは、 あるでしょうが。 それに、いまさらもなにも、Win95〜NT4〜W2k〜XPまで、すくなくとも 共通したコードで書けるわけで、プラットフォームの差異を異端視する必要は ないと思います。PC-9821後期モデルであれ、古いFMVノートであれ、同じでしょう。 staticの意味は分かりますが、世のWin32APIの解説サイトや参考書で、 staticを付けているコードがほとんど無いし、WndProc関数にしても、 long FAR PASCAL _export WndProcとしているのはあまり見ません。 そこに何か意味・論理上の差はあるのか?とお聞きした次第です。 でも、どうも嫌われてしまったみたいなので、すみません。
あまりレガシー環境にこだわってる人見るとアホに見えてくるんで おちょくりたくなって来るんですよ これは俺の意見じゃなく、からかってる人達の意見な
>それに、いまさらもなにも、Win95〜NT4〜W2k〜XPまで、すくなくとも >共通したコードで書けるわけで、プラットフォームの差異を異端視する必要は だから嘘を書くなってw
他人をおちょくるためなら平気で長文書くし自虐や自演を使うオナニー変態がいる コレ豆知識な
FARなんて、16bit時代の遺物 PASCAL規約なんて、3.1以前の遺物 _exportは知らん
>>949 世代をまず伺いたい。(A:10代 B:20代 C:30代 D:40代 E:それ以上)
PC-9821はどうやって入手したの?(A:昔買ったのをずっと使ってる
B:中古 )
BCC+4.0はいつ買ったの
とか
>>961 つまりおちょくってるのは949で959はその自演と
俺はちげーよw
とりあえず、 long FAR PASCAL _export WindowProc(HWND, unsigned, UINT, LONG); は LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM); の方が良いだろう。
967 :
949 :2010/08/21(土) 00:32:27
>>962 ありがとうございます。FARとかは不必要なんですね。素直にWINAPIでやると。
OpenWatcomに付属のサンプルコードは、Win32/Win16両方で走るように、
プロジェクトと#ifdefで分かれてて、かつその差異を吸収するwin1632.hという
インクルードファイルがあったりします。普通の入門書どおりで差し支えない、と。
世代は20代後半、PC-9821は中古購入です。PC-9801でC + アセンブラをやってましたが、
一段落した(多少の描画機能の実装とか、各種ROMの吸出し、FDイメージ化とか)ので、
目先を変えてWin32プログラミングでもしてみようかなと思って。
NetBSDでのGtk2がGUIプログラミングとしては初めて。
昔部活でPC-9801VXでN88 DISK-BASIC(86)をやっていた、ギリギリの世代です。
Borland C++ 4.52はebayで先月輸入しました。OpenWatcom v1.9と比較するためです。
TASM 4.0もebayで買ったな。
>>966 ありがとうございます。やはりCALLBACKがよさそうですね。OpenWatcom付属のソースは、
かなり後方互換性を重視している感じなので(DOS/Win3.1/Win32対応コンパイラ)、記述をわざと
古めにしてるのかもしれません。IDEも古めかしい感じですし。
ちょうどアレですかね、昔のCコンパイラでint main(void){を受け付けるのに、
80年代の参考書はmain(){ で解説しているとか、そういうノリですかね。
♪君の行く道は♪ ♪果てしない悪路♪ ♪やがてきっと♪ ♪泥沼にはまり♪ ♪そこを抜け出し♪ ♪老いたプログラマ♪
OSの新旧はともかく、その当時のWin32のコードはたいていVC++4〜6がベースになっている。 なのでOpenWatcomのソースでstaticがついているというのは、その処理系独特の作法ともいえる。 今の環境でその優秀なプログラムとやらを勉強したいのなら、Win32APIだけじゃなくて処理系別の特性の違いも覚えていく必要がある。 ある処理系では必要な宣言でも別の処理系で不必要で、間違って記述したために動作しないという可能性も当然あるからな。 まあ遠回りすることを咎めたりはしないが。 _exportというのはたぶんVC++の__declspec(dllexport)のことじゃないかな
もうひとつ気になったが、
>>ちょうどアレですかね、昔のCコンパイラでint main(void){を受け付けるのに、
>>80 年代の参考書はmain(){ で解説しているとか、そういうノリですかね。
これはノリとかではなくCの規格でどっちの記法も許されている。
ちなみにC++では後者の書き方は不可。
古い参考書を使う場合、今の規格では非推奨となっているような記述も当然あると思うので
そういったC/C++規格やAPI仕様の変遷も全部勉強すべし。
むしろ古い規格のコンパイラなんだから新しいものに合わせる必要ないんじゃあ…
Delphiの出番だな
973 :
デフォルトの名無しさん :2010/08/21(土) 02:01:59
夏だな
>>967 >世代は20代後半、PC-9821は中古購入です。PC-9801でC + アセンブラをやってましたが、
これが嘘じゃないなら病院へ逝った方が良い
冗談抜きで
たしかに正気を疑う。 40代後半なら話はわかるが・・・いや今更PC-9821ってさっぱりわかんね。 昔のPC板いった方がいいだろ。
>>969 _exportもWin16の遺物
Win32ではWndProcなどのアプリケーションが用意するコールバック関数に
付ける必要はなくなった
つーかstaticの意味が分からないというのはWin32 API以前の問題だってことが
わからないならC言語入門のスレから出なおせとしか
> VC++ 2005 EE ではWin95で動くバイナリは作れない
95にWin32s入れれば動くんじゃないかな。 試したこともないけど。Win32sとか懐かしい。
ごめん適当なこと書いたわ、32sはWin3.1用だた
>>949 無い。
C++でprotected/privateにするような感じで、
static修飾した方が美しいから、そうしているだけ。
64bitで書け
次スレの季節
まだ慌てる時間じゃない
986 :
949 :2010/08/21(土) 18:41:44
>>980 ありがとうございます。やっぱりstaticをつけたほうが、コード的には
美しいものになるんですね!
僕はカーニハン先生とパイク先生の「プログラミング作法」や、
藤原氏の「Cプログラミング診断室」を熟読していまして、きれいで洗練されたコードを
目指しています。だから、staticをつけるほうがイイ!のであれば、できるだけ
それに準じたかったのです。あまりにも無意味であれば、その限りではなかったんです。
>>974 いやホント、5インチフロッピーを部室で渡された、最後の世代ですよ。
今部屋にあるVX、UV、DA、それに当時手の届かなかったA-Matehがあるのは壮観だなぁ。
だからさっさと病院逝けよ
staticの意味とかwin32api関係ないじゃん Cの入門書くらい読んでからプログラム板に書き込めよ
989 :
949 :2010/08/21(土) 19:04:10
いえ、staticの意味くらい分かります。そうではなくて、ほとんどの入門書・サイトで 初期化関数や実体化関数の宣言でstatic BOOLとしていないし、 static char szAppNameとかしていないので、疑問に思ったんです。 でも、美しいコードを目指します。
きれいかどうかではなく、必要かどうかで考えるべき
staticの意味分かってて疑問に思うなら向いてない
なんでもかんでも明示的にしたら最適化が効かなくなるんじゃね?
そういう問題じゃないだろ
WM_ENDSESSIONでファイルに書き出すのが駄目って本当?
やってみりゃいいよ
やったけど問題なく動く。でも終了間際に書き込むのはなんちゃらって見た
staticの意味がわかるのに 必要かどうか分からないとかきれいかどうかで決めるとかマジで病院行け
999gets
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。