5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Win32API質問箱 Build92

1 :デフォルトの名無しさん:2010/12/26(日) 10:26:23
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやHなお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

■過去スレ
Win32API質問箱 Build91
http://hibari.2ch.net/test/read.cgi/tech/1289149302/

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

過去スレはwikiから探してください。

155 :デフォルトの名無しさん:2011/01/10(月) 21:15:36
動くことは動くだろ
カーネルにない関数叩いたときにオワタになるだけ

156 :152:2011/01/10(月) 21:26:54
>>154
それだと有難いです!!いえ〜ぃ!

タスクバーから終了のソフトなので、「無視」で真っ黒ウィンドウ
になったりすると、うっかり古バージョンウィンドウズの人が
実行した時に、操作不能(≒)になってしまうのが怖かったのです。


>>155
そうなるとバージョンを取得して、2000より前だと→終了などが
必要になりますよね。すごく面倒臭いです!!!
でもやっぱそうですよね。。。

ありがとうございました。

157 :デフォルトの名無しさん:2011/01/10(月) 21:55:53
/SUBSYSTEM:WINDOWS,5.00

158 :デフォルトの名無しさん:2011/01/10(月) 22:16:11
指定したウィンドウ(バックグラウンド)にCtrl+V(貼り付け)を送信するにはどうすれば良いでしょうか
下記のようにしてみたのですが、Vしか送信されていないみたいです
間にSetFocusを入れて対象のウィンドウをフォアグラウンドにすると上手くいくのですが
あくまでバックグラウンドでの処理をしたいので・・・

(ソースはC#です)
public static void SendCtrlV(IntPtr handle)
{
    byte[] bKeyState = new byte[256];

    UInt32 thisThread = GetCurrentThreadId();
    UInt32 targetThread = GetWindowThreadProcessId(handle, IntPtr.Zero);

    AttachThreadInput(thisThread, targetThread, true);

    GetKeyboardState(bKeyState);
    byte bCtrlTemp = bKeyState[VK_CONTROL];

    // Ctrlを押下状態にする
    bKeyState[VK_CONTROL] = 0x80;
    SetKeyboardState(bKeyState);

    // Ctrl+V
    SendMessage(handle, WM_CHAR, VK_V, 0);

    bKeyState[VK_CONTROL] = bCtrlTemp;
    SetKeyboardState(bKeyState);

    AttachThreadInput(thisThread, targetThread, false);
}


159 :デフォルトの名無しさん:2011/01/10(月) 22:23:57
SendInput

160 :デフォルトの名無しさん:2011/01/10(月) 22:29:47
OPENGLのMDIアプリケーションで
子ウィンドウをそれぞれのフォーム作成時に

hdc = GetDC(Handle);
//ピクセルフォーマットの初期設定
SetPixelFormatDescriptor();

という風に毎回とるようにしているのですが
子ウィンドウを作るたびに、一番新しいウィンドウしか有効にならないようです
どうすればそれぞれにレンダリングコンテキストを有効にできるのでしょうか

161 :152:2011/01/10(月) 22:32:06
>>157
すごく有難いことを教えて頂いたのだと思います。
ただ、理解するのに数日かかりそうなので、先に言っておきます。
有難うございました。

162 :デフォルトの名無しさん:2011/01/10(月) 22:33:39
>>158
SendMessage(targetThread,WM_PASTE,0,0);

163 :デフォルトの名無しさん:2011/01/10(月) 22:34:26
SendMessage(handle,WM_PASTE,0,0);
だった

164 :デフォルトの名無しさん:2011/01/10(月) 23:44:59
>>160
OpenGLはスレッドに対して、1windowというか1コンテキストだった気がする。
同じスレッドで呼び出したいなら、切り替える必要がある。
レンダリングをそれぞれ独立したスレッドでやったらどうだろうか。
というのは予想で、MDIの動作はやったことないな。

165 :デフォルトの名無しさん:2011/01/11(火) 01:34:17
>>159,162
ありがとうございます
しかし、SendInputはフォアグラウンドでないと機能しないようでした
WM_PASTEのメッセージ送信はも反応がありませんでした
対象をテキストエディタにした場合には正常に貼り付けできていたので、該当アプリにWM_PASTEメッセージの処理が実装されていない感じです

ちなみに元のソースでSetFocusでフォーカス設定した際には出来たというのはどうやら勘違いのようでした
SetKeyboardStateの返り値は正常終了となっているが押下状態になっていない感じでした
(フォーカスを設定したのち、keybd_eventでCtrlを送ってから or 手動でCtrlを押しながら Vを送る正常に貼り付けできたため)
AttachThreadInputでアタッチすれば効果があると思ったのですが・・・

別の手段がありましたら是非よろしくお願いします

166 :デフォルトの名無しさん:2011/01/11(火) 07:48:09
電子書籍なら買う
紙書籍は置き場所取るし気軽に持ち歩けないし誤植はいつまでもそのままだし全文検索もリンク機能もないしコピペもできないからいらん
値段も電子のが安いんでしょ?

167 :デフォルトの名無しさん:2011/01/11(火) 11:18:33
>>144
俺も買う
XPのテーマとかVistaの拡張子関連付けとか苦労した

168 :デフォルトの名無しさん:2011/01/11(火) 13:03:32
文字列構成するときに、{1},

169 :デフォルトの名無しさん:2011/01/11(火) 13:06:21
文字列構成するときに、{1},{2} と位置指定できるような API ありますか?
%s とかだと、引数として渡した順番で入っちゃうけど
ローカライズの時って困っちゃうことになることあるから。

170 :デフォルトの名無しさん:2011/01/11(火) 13:23:48
FormatMessageとか?

171 :デフォルトの名無しさん:2011/01/11(火) 14:02:32
OS提供のでなくていいのならBoost.Formatとか

172 :デフォルトの名無しさん:2011/01/11(火) 14:45:56
FormatMessage でいけそうですね。
さんくす。

173 :158:2011/01/11(火) 15:31:23
自己解決しました
該当アプリではどうやらTranslateMessage()処理により、Ctrl+V(貼り付け)と同等の効果をもたらすには
WM_KEYDOWN(VK_CONTROL)
WM_KEYDOWN(VK_V)
WM_CHAR(0x00000016) ※VK_V - VK_A + 1
という順番でメッセージを送れば良いようでした

174 :デフォルトの名無しさん:2011/01/11(火) 20:30:23
>>166
電子書籍みたいに気楽に修正できる媒体になると
出版側が間違ったら訂正すればいいやとか考えて
MSDNと大差ないものになるに 1024 HWND

175 :デフォルトの名無しさん:2011/01/11(火) 21:28:51
>>144のやる気次第

176 :デフォルトの名無しさん:2011/01/12(水) 07:56:04
定期あげ

177 :デフォルトの名無しさん:2011/01/12(水) 08:50:42
GetDoubleClickTime をいくつかのプログラムで使ったんだけれど、
これって同じシステムマウス設定の他のプログラムやエクスプローラーのダブルクリックで感じるダブルクリック認識スパンより長くないですか?
今は値を半分にして使っています。

178 :デフォルトの名無しさん:2011/01/12(水) 13:02:02
お前のコードが間違っている

179 :デフォルトの名無しさん:2011/01/12(水) 22:47:59
質問させてください。
環境はVisualStudio2010評価版?(無料のやつ)、
ウィンドウに文字を表示したくてDrawTextを使っています。

DrawText( hDC, data, -1, &rc, DT_END_ELLIPSIS );
とあるdata(表示したい文字列)に
LPCTSTR data = TEXT("%s\n",string1);
のように引数を入れると
warning C4002: マクロ 'TEXT' に指定された実引数の数が多すぎます。
と出てしまいます。

表示する文字列を変えたくて以上のようなプログラムを書いたのですが、
どこが良くないのでしょうか?
またDrawTextで出来ないのであれば何をしようすればよいでしょうか。
教えてくださいm(_ _)m
一応DrawTextやエラーメッセージの内容を検索してみたのですが
解決策がみあたりませんでした・・・

180 :デフォルトの名無しさん:2011/01/12(水) 23:14:47
スレチ
C++初心者スレ池

181 :デフォルトの名無しさん:2011/01/12(水) 23:21:39
>>179
ちょっとまて,その string1 っていうのは何型の変数なの?
それが分からないと答えられない。

182 :デフォルトの名無しさん:2011/01/12(水) 23:36:11
え、TEXT まくろって
文字列に L つけるかつけないかだけじゃなかったの?
sprintf みたいな機能ってあった?

183 :179:2011/01/13(木) 00:25:48
>>180
すみません。
C++初めてなのでDrawTextはAPIだと思ってました。
出直します。

>>181
char string1[1024]のような感じになっています。


184 :デフォルトの名無しさん:2011/01/13(木) 01:21:49
char data[2000];
wsprintf(data,"%s\n",string1);
DrawText( hDC, data, -1, &rc, DT_END_ELLIPSIS );

185 :179:2011/01/13(木) 02:37:47
>>184
ありがとうございます!
dataを大きめの配列にするのですね。
どうやら他の方がおっしゃったようにC++も知識不足のようですので、
勉強してきます。


186 :デフォルトの名無しさん:2011/01/13(木) 10:35:32
そのまんま出せばいいだけの気がするけど
最後に改行すると何かいいことあるのかな

187 :デフォルトの名無しさん:2011/01/14(金) 20:10:29
CoCreateInstanceでIShellDispatchを生成しようとすると、
0x80040154 (REGDB_E_CLASSNOTREG)が返ってきます。
OSの機能が未登録なんてことはあるんでしょうか?
ダメ元でregsvr32 shell32.dllとやってみましたが変わりませんでした。
何か原因として思い当たることがありましたらご教示下さい。
環境はWindows7です。

188 :デフォルトの名無しさん:2011/01/14(金) 20:24:14
CLSID_Shellで作れないの?

189 :187:2011/01/14(金) 20:56:21
はい。
レジストリの登録情報(HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000})
を直接見てみましたがちゃんとありました。
書き忘れましたが、CoCreateInstanceのコールは以下のようにしています。
CoCreateInstance(CLSID_Shell, 0, CLSCTX_ALL, IID_IShellDispatch, (LPVOID*)&pShellDispatch);

190 :デフォルトの名無しさん:2011/01/14(金) 21:01:50
CoInitialize読んでないとか

191 :187:2011/01/14(金) 21:05:14
それは大丈夫です。
例えばCLSID_HTMLDocumentだとか、関係ないクラスで試してみましたが生成できました。

192 :デフォルトの名無しさん:2011/01/14(金) 22:01:29
CLSCTX_ALLをCLSCTX_INPROC_SERVERにしてみたら?

193 :デフォルトの名無しさん:2011/01/15(土) 11:17:13
IMAPI v2でBlu-rayの物理フォーマット出来ますか

194 :デフォルトの名無しさん:2011/01/15(土) 14:43:10
メールのテリア使いだけ

195 :187:2011/01/15(土) 23:00:00
>>192
CLSCTX_ALLはCLSCTX_INPROC_SERVERを含んでいるので、試してみましたがやはりだめでしたね。

196 :デフォルトの名無しさん:2011/01/15(土) 23:48:27
CLSID_Shellでググレばすぐわかるんだけどな。
情弱ってカワイソス

197 :デフォルトの名無しさん:2011/01/16(日) 05:53:56
>>196
>>188
>>189

198 :デフォルトの名無しさん:2011/01/16(日) 12:03:57
ボタンやスクロールバーみたいなコントロールを完全に独自に作りたい
場合は,ウィンドウクラスの登録と専用ウィンドウプロシージャ用意して,
CreateWindowで作ればいいの?
どこかいい参考資料ある?

199 : [―{}@{}@{}-] デフォルトの名無しさん:2011/01/16(日) 12:20:18
枠のないウィンドウを作って画像を表示すればいい
要はゲームを作るのと一緒
ボタンとかも全部画像表示すればいいだけ
マウスクリックの座標とか全部自分で設定しないといけないけど

200 :デフォルトの名無しさん:2011/01/16(日) 14:38:02
デバッグツールを作っていて、
他プロセスの仮想メモリ空間へwriteしたいんだが、
ProcessMemoryWriteしても書き込めない領域があるみたい

OpenProcess でアクセス権Allにしてもだめっぽい。
何か方法ある?


201 :デフォルトの名無しさん:2011/01/16(日) 15:25:54
ゲームプロテクト環境下でないという話なら、お前のコードが間違っている。
APIのせいにする前に見直せ。

202 :デフォルトの名無しさん:2011/01/16(日) 16:26:41
>>201
あ、やはり。
デバッグツールは嘘でハッキングツールを勉強がてら作ってみてるのが本当でした。
なのでまさに、ゲームプロテクト環境下でつ。
プロテクト周りの仕組みのってるページとかないかな。(スレチだけど)
昔みたことがあるんだけど、みつけられない。


203 :デフォルトの名無しさん:2011/01/16(日) 16:52:47
メモリ読み書き系は基本的すべてフックされている。APIの実体の先頭バイトを見てみれば確認できる。
これの回避方法は色々あるが、嘘つきには残念だが教えられない。
ヒントを出すと、オリジナルの改変されていないコードを実行すれば目的は達成できると言っておこう。
結局のところプロテクトの知らないまたは検知することのできないコードで行えばいいのだ。

204 :デフォルトの名無しさん:2011/01/16(日) 18:30:55
でばどら!

205 :デフォルトの名無しさん:2011/01/16(日) 18:39:51
もしどら!?

206 :デフォルトの名無しさん:2011/01/16(日) 19:19:25
>>203
最近のはそんな原始的なフックしかけてないですよ^^;

207 :デフォルトの名無しさん:2011/01/16(日) 19:28:43
メモリのゼロ番地読み書きするにはどうすればいい?

208 :デフォルトの名無しさん:2011/01/16(日) 19:30:35
トランポリンみたいな幼稚な手法が通用するのは数年前までだね
今ではユーザーモードレベルのAPIフックなんてあってもなくても変わらないゴミみたいなものだし
>>203はShadow Walkerで検索してみるといいよ

209 :デフォルトの名無しさん:2011/01/16(日) 19:38:11
"Owner Window"(オーナーウィンドウ) にたいして
"owned Window" はどういう言葉がいいのかな?

210 :デフォルトの名無しさん:2011/01/16(日) 19:42:13
my window?

211 :デフォルトの名無しさん:2011/01/16(日) 19:43:55
"Labor Window"がぴったりだな

212 :デフォルトの名無しさん:2011/01/17(月) 00:06:14
被所有ウィンドウ
従属ウィンドウ
隷属ウィンドウ
奴隷ウィンドウ
被用者ウィンドウ
ドMウィンドウ
オーンドウィンドウ

213 :デフォルトの名無しさん:2011/01/18(火) 13:13:55
リソースではなく、既にメモリに展開されている.icoファイルからツールバーや.exeに使うアイコンを表示するにはどうすれば良いですか?

214 :デフォルトの名無しさん:2011/01/18(火) 14:08:48
あげ

215 :デフォルトの名無しさん:2011/01/18(火) 18:27:40
Win32APIの入門でオススメサイトあったら教えてください
猫さんのところはわからないまま進む感じであまりいい勉強になりませんでした

216 :デフォルトの名無しさん:2011/01/18(火) 18:40:41
>>213
LookupIconIdFromDirectoryEx
CreateIconFromResource(Ex)
関数名見ただけで脊髄反射すんなよ?

217 :デフォルトの名無しさん:2011/01/18(火) 19:06:16
>215
本買う金ないぐらい貧乏ならあきらめよう

218 :デフォルトの名無しさん:2011/01/18(火) 20:24:57
>>215
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html

219 :デフォルトの名無しさん:2011/01/18(火) 20:28:16
>>218
俺もこのサイトを勧める

220 :デフォルトの名無しさん:2011/01/18(火) 20:43:47
猫はCの基礎が確り身に付いてないと躓くね

221 :デフォルトの名無しさん:2011/01/18(火) 20:52:28
>>218-219
ありがとうございますた(´・ω・`)b

222 :デフォルトの名無しさん:2011/01/18(火) 22:16:14
実行ファイルのアイコンってリソースから読み込まないと変えられない?

223 :デフォルトの名無しさん:2011/01/19(水) 00:29:06
えっ

224 :222:2011/01/19(水) 00:32:27
自己解決しました。
デバックじゃなくてリリースでビルドしないと変わらないのね

225 :デフォルトの名無しさん:2011/01/19(水) 02:15:58
えっ

226 :デフォルトの名無しさん:2011/01/19(水) 22:51:10
エクスプローラでは画像のサムネイルが表示されますよね。(「縮小版」表示の場合)

このサムネイルをプログラムから最新の情報に更新する方法を教えてください。
現在、画像ファイルを編集するプログラムを作っているのですが、
ファイルを更新しても、その画像のサムネイル画像が更新されないのです。

つまり、エクスプローラを右クリックで選択できる「縮小版を最新の情報に更新」
をプログラムから呼び出せる方法をご教示いただきたいのです。

227 :デフォルトの名無しさん:2011/01/19(水) 23:33:55
ソース読め
http://comvic.blogdns.com/modules/d3forum/index.php?topic_id=42

228 :デフォルトの名無しさん:2011/01/19(水) 23:34:46
>>226
Shellオブジェクト系で行けると思う

229 :226:2011/01/19(水) 23:45:16
>>227-228
ありがとうございました。
特に227氏さま。ソースいまから読んでみます

230 :デフォルトの名無しさん:2011/01/20(木) 02:58:01
sendkey F5

231 :226:2011/01/20(木) 06:50:40
>>230
ありがとうございます(>>226の回答と解釈しました)
でも、F5では縮小版は必ずしも更新されないです。

232 :デフォルトの名無しさん:2011/01/20(木) 07:49:08
エクスプローラのプロパティで
「縮小版の場合キャッシュしない」
のチェックを予め外しておくとかチェックしておくとか

233 :デフォルトの名無しさん:2011/01/20(木) 08:57:02
WindowsのAPIではハンガリアン記法で型を表してるんですよね?
でも構造体によって例えば

OPENFILENAME構造体
DWORD lStructSize;
DWORD nMaxCustFilter;
WORD nFileOffset;

MENUITEMINFO構造体
UINT wID;
ULONG_PTR dwItemData;
LPTSTR dwTypeData;

などとなっていて、この場合のnとかdwとかが何を表しているのか分かりません
どういう事でしょうか?

234 :デフォルトの名無しさん:2011/01/20(木) 08:58:45
n : number (int or long, etc.)
dw : DWORD

235 :デフォルトの名無しさん:2011/01/20(木) 14:01:05
DWORD lStructSize;
DWORD nMaxCustFilter;
こっちではDWORDなのにlとかnになってて
ULONG_PTR dwItemData;
LPTSTR dwTypeData;
こっちでは中の型も違うのにdwになってるのが疑問なんじゃない?

236 :デフォルトの名無しさん:2011/01/20(木) 14:21:57
そういう話をし出すと、歴史を語らなければいけなくなるんじゃないか

237 :デフォルトの名無しさん:2011/01/20(木) 14:24:54
システムハンガリアン記法は廃止されました

238 :デフォルトの名無しさん:2011/01/20(木) 17:33:11
WORD 1文字幅DWORD 2文字幅。
DWORDはLOWORDマクロで下位の1文字を、HIWORDマクロで上位の1文字を取り出せる。
今のところ32bit幅だが、いつ64bit幅や128bit幅になるかは秘密。

239 :デフォルトの名無しさん:2011/01/20(木) 17:36:28
>>238
>今のところ32bit幅だが、いつ64bit幅や128bit幅になるかは秘密。

コンパイルオプションで変わる

240 :デフォルトの名無しさん:2011/01/20(木) 17:39:21
1文字幅
適当だな

241 :デフォルトの名無しさん:2011/01/20(木) 19:41:43
>>239
LPVOID や LPARAM はともかく、DWORD が 32bit 以外ってなんか変なんだけど、あるんだ。

242 :デフォルトの名無しさん:2011/01/20(木) 20:11:17
もともとMicroshiftのマクロ定義な型名はWidowsのバージョンが変わってそのサイズが変化した後でも
コードの変更を最小限に抑えようとするためのものなのでWORD = 1文字幅^^は適当で正解。
WORDの中にはあらゆるWidowsにおいて1文字を格納するのに十分なサイズが割り当てられちゃう。びくんびくん。

243 :デフォルトの名無しさん:2011/01/20(木) 20:11:37
本義で言えば、最近のCPUではWORD=64bitなんじゃないのか

244 :デフォルトの名無しさん:2011/01/20(木) 20:15:56
>>243
そういう場を混乱させるだけの発言は控えようぜ

x86アセンブラで考えたら
CPUが何ビットになろうが
WORD = 16bit
DWORD = 32bit
QWORD = 64bit
PWORD? = 128bit

245 :デフォルトの名無しさん:2011/01/20(木) 21:33:00
>>243
そのとおり
VC6 で動いてた短いプログラムをソースそのままで
VC2008 でコンパイルしたらエラーも警告も出ないのに
動かなくなってた
time_t の長さが変わってたのが原因だった

246 :デフォルトの名無しさん:2011/01/20(木) 21:34:56
>>244
アセンブラではそうだろうが
C++っていうかWin32APIレベルだと違うよね

247 :デフォルトの名無しさん:2011/01/20(木) 21:42:03
>>246
Win64でもDWORD=32bitだぞ
DWORD_PTRっていう変態型がWin32だと32bit、Win64だと64bitになる

248 :デフォルトの名無しさん:2011/01/20(木) 21:44:03
いやWORDが32bitだからさ

249 :デフォルトの名無しさん:2011/01/20(木) 21:50:28
>>248
WORDってunsigned shortのtypedefだろ?
shortのビット数が32とか・・俺釣られてんのかな

250 :デフォルトの名無しさん:2011/01/20(木) 22:04:30
なんか紛らわしいことになってるけど、正解は >>244だからな。みんな。
C言語からしかかじってない奴はとんでもないこと言い出すな。

251 :デフォルトの名無しさん:2011/01/20(木) 22:25:23
DWORDのDはDoubleのD
WindowsのSDKは古い歴史を引き摺り過ぎてる
>>236 >>242

252 :デフォルトの名無しさん:2011/01/20(木) 22:27:19
http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx
MSDNも引かずに憶測だけで話す奴とか何
>>242
BITMAPFILEHEADERもWidowsのバージョンによって変わるんですかあなた天才ですね

253 :デフォルトの名無しさん:2011/01/20(木) 22:29:21
しかしwordとletterを間違えるとか釣りにしても恥ずかしいな

254 :デフォルトの名無しさん:2011/01/20(木) 22:57:09
人生って難しいね・3・

255 :デフォルトの名無しさん:2011/01/20(木) 23:08:07
>>245
time_tの元の型を調べろよBOY

197 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)