■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build18
251 名前:245 :04/04/20 19:03
>>248
何ならできますか。

>>249
イベントとは左クリックとかのWM_**です。

実はひとつのウィンドウ毎にひとつのコールバック関数を作るもの
なんですかね。myProg.lpszClassNameとCreateWindowの第一引数、
myProg.lpfnWndProcとコールバック関数の名前を同じにしますが、
それを2つのウィンドウで別々にすれば、自然と"hoge"でのイベントは
hogeCallへみたいになるんじゃないかと。
実はまだ複数のウィンドウのプログラムを作ったことが無かったので、
実験をすることも無くどうなるんだろうと質問してしまいました。

252 名前:デフォルトの名無しさん :04/04/20 19:53
>>251
定石的にはMFCやATLがやってるように(それぞれ多少手段は違った気がするが)
ウィンドウと対応するC++なりのオブジェクトをつくってウィンドウ毎に処理を分ける。

253 名前:159 :04/04/20 20:13
SHChangeIconDialogに関して質問いれたものです。
iconインデクス取得して絵画まではいけますたが

引数で送ったpath以外のディレクトリを参照で選ばれた場合の
pathをうけとる方法がわかりませぬ。

どなたかご教授願います。

254 名前:245 :04/04/20 20:25
>>252
やっぱウィンドウが複数あったり、長編なプログラムは、
MFCとかで作るもんなんですかね。自分はMFCに挫折したくちでして。
SDKのみで作っている所で創プロはすごく参考になるのだけど、
やさしめのなので(それでも難しい)。

255 名前:デフォルトの名無しさん :04/04/20 20:31
>>253
VBでいいのかな? 漏れの作ったのでよければ。

Private Declare Function SHChangeIconDialogA Lib "shell32" Alias "#62" (ByVal hWnd As Long, ByVal szFilename As String, ByVal Reserved As Long, lpIconIndex As Long) As Long
Private Declare Function SHChangeIconDialogW Lib "shell32" Alias "#62" (ByVal hWnd As Long, ByVal szFilename As Long, ByVal Reserved As Long, lpIconIndex As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function ChangeIconDialog(ByVal hWnd As Long, strPath As String, Optional Iconidx As Long = 0) As Boolean
Const MAX_PATH As Long = 260
Dim strBuf As String * MAX_PATH, strRet(MAX_PATH) As Byte
Dim lPtr As Long, lRet As Long

strBuf = strPath & vbNullChar
If IsWinNT() Then           ←OSがNTかどうか判断。自分で作る
  lPtr = StrPtr(strBuf)
  lRet = SHChangeIconDialogW(hWnd, lPtr, MAX_PATH, Iconidx)
  CopyMemory strRet(0), ByVal lPtr, MAX_PATH
  strBuf = CStr(strRet)
Else
  lRet = SHChangeIconDialogA(hWnd, strBuf, MAX_PATH, Iconidx)
End If

If lRet Then
  ChangeIconDialog = True
  strPath = Left$(strBuf, InStr(strBuf, vbNullChar) - 1)
End If
End Function

呼ぶときは
Call ChangeIconDialog(Me.hWnd, パス, インデックス)
パス、インデックスに変更された値が戻ってくる。

256 名前:246 :04/04/20 20:31
>>254
おまえ俺を馬鹿だと思ってるだろ

257 名前:デフォルトの名無しさん :04/04/20 20:32
MFCで無理なのにSDKで作れるって言うのはいったい・・・

258 名前:デフォルトの名無しさん :04/04/20 20:45
WindowsXP sp1 Visual C++

Wininetを使った汎用的なクラス(class Internet)を作りたいんだけど、
アプリケーション定義コールバック関数とInternetSetStatusCallbackへ渡すコールバック関数を使うと
コンパイル時に「warning C4312: '型キャスト' : 'DWORD' からより大きいサイズの 'Internet *' へ変換します。」
と出て、実行するとハンドルされていない例外が出て止まってしまうんだけど問題なく動かす為にはどうしたいいんだろう?

こんな感じ
//アプリケーション定義コールバック関数
virtual void callback( DWORD dwStatus, LPVOID lpStatusInfo );

//InternetSetStatusCallbackへ渡すコールバック関数
static void CALLBACK _inet_callback( HINTERNET hInternet, DWORD dwContext, DWORD dwStatus, LPVOID lpStatusInfo, DWORD dwStatusInfoSize)
{
( (Internet*)dwContext )->callback( dwStatus, lpStatusInfo );
}

259 名前:245 :04/04/20 20:51
>>256
とんでもございません。
>>247の書き方に失礼があったのならここでお詫び申し上げます。

>>257
使い方が分からないんです。猫のリソース・スクリプトも分かりません。
VBも挫折しました。ソースだけで作れるのでないと分からないです。

260 名前:デフォルトの名無しさん :04/04/20 20:55
>>259
じゃぁ、一緒にC#勉強しませんか?
割と良い感じですよ。
MFCの嫌だったところが全てなくなってる。

261 名前:デフォルトの名無しさん :04/04/20 20:55
グローバル変数に記録しとけばいいだけの話だろ。
何を悩む必要があるんだ?

hWnd1 = CreateWindow();
hWnd2 = CreateWindow();

WndProc()
{
if (hWnd == hWnd1) {
...
}
else if (hWnd == hWnd2) {

}
}

262 名前:デフォルトの名無しさん :04/04/20 20:58
糞プログラマが現れた
○戦う
○逃げる

263 名前:デフォルトの名無しさん :04/04/20 21:04
たぶん>>259さんはメッセージ駆動に慣れていないだけだと思うんですよね。
C#からはじめればばっちりですよ。

264 名前:159 :04/04/20 21:07
>>255
VBでOKなんです。こちらの意図が完全にとおりました。
どうもありがとうございます。

ってかめちゃコード見やすい・・・見習わないと・・・

265 名前:245 :04/04/20 21:08
>>260
C#ですか。どんな感じなのかいろいろ調べてみます。
ただ自分は、新しいのを覚えようとしないで、今ある知識で
工夫して何かを作ろうと考えてしまう所があって、
そのままSDKで作るかもしれませんが、その時はすいません。

>>261
グローバル変数はいけないという概念があって。WinMainは
スタートファイルだから、externとかしなくてもいいので
逆に使うことで困ることは無いと思うのですが。

266 名前:デフォルトの名無しさん :04/04/20 21:09
よしここらでいっちょ指摘しとこう。
×教授 ○教示

267 名前:245 :04/04/20 21:16
>>263
ええ、全然慣れていません。
ゲームを作ろうと思ったのですが、コンソールアプリでは
表現しきれないので、グラフィックを使いたいと思って、
勉強を始めました。昔少しやったことはあったのですが。
正直うざいだけです。PeekMessage+Sleepのメインループで
グルグルがいいのですが、勉強するチャンスでもあるのでやってます。

C#はいいんですかね。文章を読んだだけで2人の方が進めてくれたので
まさに自分にぴったしのなのかもしれません。

268 名前:デフォルトの名無しさん :04/04/20 21:17
きょうじゅ けう― 【教授】

(名)スル
(1)0 1 (ア)児童・生徒に知識・技能を与え、そこからさらに知識への興味を呼び起こすこと。
(イ)専門的な学問・技芸を教えること。
「国文学を―する」「書道―」
(2)0 大学などの高等教育機関において、専門の学問・技能を教え、また自らは研究に従事する人の職名。助教授・講師の上位。


いいんでない?


269 名前:デフォルトの名無しさん :04/04/20 21:27
>>265
ならstaticにすればいいじゃない。
変数名直で書くのがいやならクラスメンバにするとか。
形体はなんであれ、スタック以外の領域に、なんらかの形で
ハンドルを覚えておかないと分岐のさせようがないのはわかるでしょ?

270 名前:245 :04/04/20 21:41
>>269
そうですね。CheckHWNDみたいな関数があったとしても
もう片方の辺が無いから意味ないですし。
そういえば猫プロ(だっけ?)も始めに
char szClassNme[] = "ウィンドウクラス・ネーム" ;
みたいにWinMainの前にグローバル変数で書いてありますね。

271 名前:デフォルトの名無しさん :04/04/20 21:45
もしや盲信的にグローバルは駄目といっているだけなのか?

272 名前:245 :04/04/20 22:16
>>271
そうだと思います。
ただ、長編のときはグローバル関数をあまり使わないで、
カプセル化(だっけ?)した方がよかったりするように、
極力使わないほうがいいのは分かっています。
ただ、逆に使わないと大変な所は、無理せず使うようにします。

273 名前:デフォルトの名無しさん :04/04/20 23:06
>>272
まーそれでいいんじゃない。事情がわからんので適当だけど
普通は>>261よりは>>251のアプローチだと思うよ

274 名前:デフォルトの名無しさん :04/04/20 23:09
すみません、質問させてください。

ウィンドウのタイトルバーの左側にあるアイコンを動的に設定する方法ってありますか?
今、
hIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_CREATEDIBSECTION);
DrawIcon(GetDC(hWnd), 0, 0, hIcon);
などとやっていたんですが、
これはアイコンの設定ではなくて描画ですよね……。

WNDCLASS を毎回 RegisterClass() して対処しようかとも思ったのですが、
直前に RegisterClass() した時の WNDCLASS を取得する方法もわかりませんでした。

何か解決策はありませんか?

275 名前:デフォルトの名無しさん :04/04/20 23:12
>>274
WM_SETICON

276 名前:デフォルトの名無しさん :04/04/20 23:12
>>274
WM_GETICON?

277 名前:デフォルトの名無しさん :04/04/20 23:16
今C#いじってるけど、想像より実行が速いんで驚いてるよ。
ただ、俺のやり方が悪いんだろうが、すぐAPIが恋しくなってDllImport使いまくってる。

278 名前:274 :04/04/20 23:17
>>275
おお! あっさりできました!
ありがとうございます!

>>276
おはようございます。

279 名前:デフォルトの名無しさん :04/04/20 23:18
>>277
.NET Frameworkのメモリ馬鹿食いはきにならない?酷すぎるんで結局W32APIに戻ってきたよ

280 名前:デフォルトの名無しさん :04/04/20 23:23
>>277
実行中の重さは(GUI使わなければ)気になることはないね。

281 名前:デフォルトの名無しさん :04/04/20 23:29
.NET Frameworkでアプリのローカライズをやっちゃうと、
他の開発環境に戻りたくなくなってしまいますた。


282 名前:258 :04/04/21 00:04
>>258の現象はvirtualをつけるとなるみたいです。
virtualをつけても大丈夫な方法はあるんでしょうか?

283 名前:デフォルトの名無しさん :04/04/21 00:42
>>279
元々でかくなるプログラムを書いてるんで、メモリ消費量は気にならない。
むしろ今は、未知の言語を触っているという楽しさがあるので、
使い慣れてきたら気になってくるかもしれんけどね。

284 名前:デフォルトの名無しさん :04/04/21 00:44
>>277
実行は早いね。
メモリーが気になるのも同意。
マイクロソフトがこれを主流にする気みたいだから、
これで行っても大丈夫だろうとは思う。

285 名前:デフォルトの名無しさん :04/04/21 04:32
Cでやってるんですけど、MIDI再生ができませぇん。
コンパイルはできるけど、音がでない・・・OTZ

http://www.users.yun.co.jp/~studiowing/win32api/win-17.htm
ここの使ってるんですけど、何か注意する事とかありますか?

286 名前:デフォルトの名無しさん :04/04/21 04:45
えらく大雑把なサンプルだなw
まあそれは良いとして、mciSendString の戻り値は確認したのか?
それなりのエラーコードが返ってるんじゃないか?

287 名前:デフォルトの名無しさん :04/04/21 09:21
Windowsアプリケーションでコマンドライン引数を取得する処理を
自前でやってるので大変です。
main関数を使ったときのargc, argvみたいに
簡単に取り出せるAPIはないですか?

288 名前:デフォルトの名無しさん :04/04/21 09:39
__argc __argvじゃいかんの?


289 名前:デフォルトの名無しさん :04/04/21 09:44
>>288
おぉ。そういうのがあったのですか。
調べてみます。ありがとうございます。

290 名前:デフォルトの名無しさん :04/04/21 09:52
__argc, __argvだっけ?


291 名前:デフォルトの名無しさん :04/04/21 09:52
リロード忘れてた(鬱


292 名前:デフォルトの名無しさん :04/04/21 09:56
>>290
うん。

>>291
(,,゚Д゚) ガンガレ!

293 名前:54 :04/04/21 11:07
>>56-58
ありがとん。返事が遅くなってスマソ。

>>58さんのGDI+で問題解決しました。
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm

294 名前:デフォルトの名無しさん :04/04/21 12:43
>>285
MIDIファイルの位置が悪いとか……
実行ファイルのあるフォルダにMIDIをおいて、VSを使わずに直接実行してみても駄目?

295 名前:232 :04/04/21 23:23
>>232です。
ビットマップを普通に表示するのは分かってきたのですが、
透過の仕方がわかりません。調べるとマスクとか書いてあるのですが分かりません。
以下のプログラムなら、どう発展させていけばいいのでしょうか。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=61&fi=no

296 名前:232 :04/04/21 23:33
>>295
すいません。ShowBitmap関数のStretchDIBitsの最後の引数を
dwRopに変更してください。

後、実はその変更を行った後、たまたま人(前景)のほうの引数を
SRCANDにしたら透過できてしまいました。
SRCANDは「論理 AND 演算子を使って、コピー元の色とコピー先の色を
組み合わせます。」らしいのですが、なぜ透過できたのでしょうか。

297 名前:デフォルトの名無しさん :04/04/22 02:48
今日は、Charles Petzoldの刺青に萌えました・・・
ttp://www.charlespetzold.com/

298 名前:232 :04/04/22 03:17
すいません。>>295-296は人が黒のみだからうまく出来てたようです。
いろいろ調べていましたが分からないので、
1ピクセルずつ調べながら透過しない位置をGetPixelとかで
描画する方法でやってみます。お騒がせしました。

299 名前:デフォルトの名無しさん :04/04/22 03:25
>>298
そこでなんで"たまたま"成功したかを追求すれば正解があるんだが。

300 名前:232 :04/04/22 05:37
>>299
自分はウィンドウズの基礎がなってないので難しいです。

一応>>298の方法で256色のはできました。
ただintのカウンタとforを使って普通にやっているので
表示するサイズが大きくなるとかなり遅そう。

301 名前:デフォルトの名無しさん :04/04/22 08:54
>>298

1ピクセルずつやる、というのは妥当な方法だけど(マスク作るよりは楽)
それをやるならビットマップのメモリデバイスコンテキストに対してでは
なくDIBピクセル列に対して行うべきだね(DIBの操作は単純なメモリアク
セスなので、処理が圧倒的に早く正確)。

性能的には32ビットDIBで数百×数百ピクセルのビットマップを透過処理
しても、特に問題はない。


302 名前:デフォルトの名無しさん :04/04/22 09:20
>>300
> ただintのカウンタとforを使って普通にやっているので
> 表示するサイズが大きくなるとかなり遅そう。

そういうもんです。
あとは、GetPixelみたいに1ピクセルごとに計算するのではなく、301さんが言うような方法で
メモリ上に展開することでループ計算や関数呼び出しのフィードバックを省略したり、
直接アセンブラをいじってMMXやSSEを呼び出し、数ピクセル分を一気に計算したりすることで
高速化を図ったりする。


303 名前:デフォルトの名無しさん :04/04/22 10:40
斜体フォント文字の表示長方形領域を取得したいのですが、
DrawText(hDC, str, -1, &rect, DT_CALCRECT);
では、通常フォント文字の表示長方形領域を返してきます。

斜体フォント文字の表示長方形領域を正確に取得する方法をご存知の方、
教えていただけないでしょうか?

304 名前:232 :04/04/22 10:53
>>301>>302
以下を>>295のプログラムのStretchDIBitsを消して
その位置に加えれば透過描画が出来ます。(8ビットのみ)
透過の位置はビットマップの左上と同じ色の位置です。
どこを直すといいでしょうか。
if(bmpInfo->bmiHeader.biBitCount == 8) //256色ビットマップ
{
int i ;
int updw = bmpInfo->bmiHeader.biHeight > 0 ? 1 : -1; //up,downどっちの方式か
int sizeX = bmpInfo->bmiHeader.biWidth; //サイズx
int sizeY = abs(bmpInfo->bmiHeader.biHeight); //サイズy
int dot = sizeY * sizeX; //ドット数
int p; //パレットの種類
int x, y; //拡大をしない表示する位置
int x2, y2; //拡大の分
int touka = updw > 0 ? lpBMP[dot - sizeX] : lpBMP[0]; //透過する色のパレットの位置
for(i = 0; i < dot; i++)
{
p = lpBMP[i];
if(touka == p)continue; //透過する位置
x = (spotX + i % sizeX) * bairituX;
y = (updw > 0 ? spotY + sizeY - i / sizeY - 1 : spotY + i / sizeY) * bairituY;
for(x2 = 0; x2 < bairituX; x2++)for(y2 = 0; y2 < bairituY; y2++)
SetPixelV(hdc, x + x2, y + y2,
RGB(bmpInfo->bmiColors[p].rgbRed, bmpInfo->bmiColors[p].rgbGreen,
bmpInfo->bmiColors[p].rgbBlue)); }}

305 名前:デフォルトの名無しさん :04/04/22 11:19
>>303
GetTextExtentPoint32はどう?

306 名前:303 :04/04/22 11:47
>>305
ダメでした。
DrawText(hDC, str, -1, &rect, DT_CALCRECT);
と同じ結果でした。

307 名前:デフォルトの名無しさん :04/04/22 12:21
>>306
hDCにフォントの指定はしてあるよね…?

308 名前:306 :04/04/22 13:12
>>307
指定してます。
OldFont = (HFONT)SelectObject(g_mem.hSzDC, hfont);

ワードパッドで斜体文字を表示して、選択で色を反転した時にわかる領域サイズと
同サイズが返ってきていると思われます。
Win32APIでは、斜体文字の表示範囲を取得するのは無理なのでは?
と思いはじめています。

309 名前:デフォルトの名無しさん :04/04/22 14:40
>> 308
私もやり方を知らない。
それらプラス tmOverhang が助けにならないのは知ってる。
GetCharABCWidths, GetCharWidth32, GetCharPlacement, GetGlyphOutline
あたりはためしてみた?


310 名前: ◆IGEMrmvKLI :04/04/22 16:34
VBからAPIをコールしています。
InternetConnectをコールしているのですが、そのあと、アプリケーション終了時に
応答が帰ってこなくなることがあります。
マシンによって違い、アプリケーション終了後、正常終了して普通に終わるマシンと
アプリケーション終了後、正常終了して、タスクに応答なしで残りつづけるもの。

InternetConnect関数コール直後、デバッカによる停止で上記事象が発生するので、
そのあたりだとは思うのですが、OSによっての違いでもないみたいですし。

環境は、VB6.0SP5
Window2000 SP4
です。

応答が帰ってこない事象は、今のところ、Win2kSP3とSP4で確認しています。
逆に、通常に終わる場合は、WinXP・Win2kSP3・SP4・WinNTなどで確認しています。

原因について、思い当たるような節のあるかた、いらっしゃいましたらご教示よろしくお願いします。

311 名前:デフォルトの名無しさん :04/04/22 17:02
>>310
で、結局Win2kSP3・SP4ではどういう挙動を示すんだ?

312 名前:310 ◆IGEMrmvKLI :04/04/22 18:28
すいません。解決しました。
Win2kSP3・SP4の場合、タスクマネージャーに応答なしアプリケーションとして、
30秒程度?居残りつづける状態でした。

原因ですが、FTPサーバへのログインにAnonymousを使用していると、
同様の事象が発生するようです。
ほかのユーザを切りなおしてそのユーザでログインすると、その事象は解決しました。

どうも、ご迷惑をおかけしました。

313 名前:デフォルトの名無しさん :04/04/22 23:05
プロセスハンドルからプロセスIDって取れませんか?
ShellExecuteEXでプロセスハンドルしか帰ってこないんです。

314 名前:デフォルトの名無しさん :04/04/22 23:14
>>313
GetProcessId()でいいんじゃないの。
XP sp1 以降なら。

315 名前:デフォルトの名無しさん :04/04/22 23:29
>>313
CreateProcessを使うとプロセスIDを取得出来るねぇ。


316 名前:デフォルトの名無しさん :04/04/23 04:11
>>313
GetWindowThreadProcessIdというのもあるよ。参考までに。

317 名前:313 :04/04/23 22:53
>>314
XP sp1以降ということは、それ以前では感嘆には取れないんでしょうか?

>>315
データファイルを関連付けアプリで起動したいので、ShellExecute(EX)が
いいんです。
CreateProcessだとEXE直接起動オンリーですよね。FindExecutableで
さがせますけど、openのほかにprintとか他のverbもサポートしないと
いけないかも、なのでレジストリ直読みして環境変数置き換えて・・・・
マンドクセ

>>316
それだとウィンドウハンドルがわかんないといけないですけど、
プロセスハンドルからそのプロセスのウィンドウハンドルって取れます?
プロセスIDが分かっているときにウィンドウハンドルをとるなら
EnumWindowsとGetWindowThreadProcessIdで出来るんですが・・・
そのプロセスIDがわからんわけです。

318 名前:デフォルトの名無しさん :04/04/23 23:41
この辺が参考になるかな。

ttp://search.acty-net.ne.jp/mfc_search/archive/2001-1/msg03531.html

プロセスハンドルはシステム内で一意な値じゃないからそこから
プロセスIDを特定することは出来ないってことじゃないかな。

手間を惜しまないのなら、SetWindowsHookExかCreateRemoteThreadで
対象プロセスに自作のルーチンを進入させてGetCurrentProcessIdする手が
あるけど。

319 名前:デフォルトの名無しさん :04/04/24 04:30
NtQueryInformationProcess
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/ntqueryinformationprocess.asp

Windows2000 と WindowsXP (SP適用前) の場合限定で使えるんでない?
WindowsXP SP1 以降は GetProcessId() を使う方向で。
WindowsMe 以前は諦め…


320 名前:デフォルトの名無しさん :04/04/24 08:46
>>319
9xでは構造体を直接読むという荒業が使えると思われ
どうせ9xはdisconなのだから将来の互換性の問題は気にする必要ないし

321 名前:デフォルトの名無しさん :04/04/24 09:38
キャレットの表示にCaret系使うのと自分でInvertRectとかで描くのと何が違うんですか?

322 名前:デフォルトの名無しさん :04/04/24 09:49
CreateToolhelp32Snapshotでどう?

323 名前:デフォルトの名無しさん :04/04/24 09:51
Taking a Snapshot and Viewing Processes
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/taking_a_snapshot_and_viewing_processes.asp


324 名前:デフォルトの名無しさん :04/04/24 10:01
で、便乗して質問なんだけど、SetWindowsHookExで全スレッドにフック取り付ける場合、
data_segとか使って全DLLで同じメモリ領域(HHOOKとか)を参照するようにしますよね?
でもそうすると、SetWindowsHookExを複数回呼ばれた場合に、
つまりSetWindowsHookExを含むDLLが複数のプロセスで呼び出された場合、
重複したフックが設定されてしまう可能性があります。

また、肝心のフック関数は処理結果を指定されたウィンドウハンドルに送るわけですが、
上記DLLを排他処理した場合、1つのウィンドウハンドルにしか送れなくなってしまいます。

これら問題を上手く解決する方法はないものでしょうか?

つまり、
SetWindowsHooExを呼び出す関数は、どのタイミングでどのプロセスから呼び出されても、
安全・確実に実行する事が出来き、かつその全ての呼び出し元が要求したウィンドウハンドルに、
全ての呼び出し元が開放を要求するまで、フック関数からのメッセージが確実に送信される、
というふうにしたいのです。


325 名前:デフォルトの名無しさん :04/04/24 10:56
どっかでも以前議論してたが、フックハンドルを共有メモリ領域に置く必要は無かった筈

326 名前:デフォルトの名無しさん :04/04/24 11:17
>>325
すみません。"フックハンドル 共有メモリ"でググってみましたが、見つかりませんでした。
共有メモリ領域を使わない方法とはどのようなものなのでしょうか?


327 名前:デフォルトの名無しさん :04/04/24 11:56
http://pc.2ch.net/tech/kako/991/991576947.html
にそれらしきレスがありますが、
CallNextHookExにNULLを渡すというのはソースが見つかりませんでした。

328 名前:デフォルトの名無しさん :04/04/24 13:31
>>325
それでも一応動くけど
CallNextHookExで正しいフックハンドルを渡さないと環境によってはシステム自体が著しく不調になる

329 名前:324 :04/04/24 14:31
現在のソースはこんな感じ:
HANDLE hMutex = NULL;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) {
// exception
}

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
DWORDdwWaitResult;

dwWaitResult = ::WaitForSingleObject( hMutex, 1000 );

if (dwWaitResult != WAIT_OBJECT_0) {
// exception
}

}

g_hMouseHook = ::SetWindowsHookEx(
WH_MOUSE,
(HOOKPROC)g_MouseProc,
hinstDLL,
0
);

if (g_hMouseHook == NULL) {
// exception
}

::ReleaseMutex( hMutex );

330 名前:デフォルトの名無しさん :04/04/24 14:33
>>329を見たら腹が痛くなってきた

331 名前:デフォルトの名無しさん :04/04/24 15:40
俺はどっちかっていうと腹が減ってきた

332 名前:デフォルトの名無しさん :04/04/24 16:15
俺なんて最近腹が出てきた

333 名前:デフォルトの名無しさん :04/04/24 16:21
つまんねーレスに腹がたってきた

334 名前:デフォルトの名無しさん :04/04/24 17:30
はらたいらさんに1000点

335 名前:デフォルトの名無しさん :04/04/24 18:34
同じグローバルフックを複数使う理由がわからん

336 名前:324 :04/04/24 18:50
>>335
フックを使用するプログラムが、
ユーザ意思によって多重起動される可能性がある場合。


337 名前:デフォルトの名無しさん :04/04/24 20:23
>>336
その場合フックハンドルを共有したらまずいじゃないか

338 名前:デフォルトの名無しさん :04/04/24 20:46
>>337
RegisterWindowMessageをしてブロードキャストするか、
ウィンドウハンドルだけ配列にしようかと・・・

もっと良い方法ありますか?


339 名前:デフォルトの名無しさん :04/04/24 21:37
根本的に勘違いしているな。
SetWindowsHookExの第4引数を0にした場合は、起動中の全てのスレッドに
フックをかけるだけでなく、SetWindowsHookEx呼び出し後に起動したスレッドに
対しても、システムが勝手にフックをかけてくれるようになる。
あなたが考えるべきことは、多重起動されたときにSetWindowsHookExを
複数回呼び出すことではなく、多重起動されても1回しか呼び出さないことだ。

340 名前:デフォルトの名無しさん :04/04/24 21:47
書きかけで送信しちゃった、スマン。
要するにこういう風にすりゃいいだろ、って事だ。

HHOOK g_hMouseHook = NULL;


HANDLE hMutex = NULL;
hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) {
// exception
}

if (g_hMouseHook == NULL) {
g_hMouseHook = ::SetWindowsHookEx(
WH_MOUSE,
(HOOKPROC)g_MouseProc,
hinstDLL,
0
);

if (g_hMouseHook == NULL) {
// exception
}
}
::ReleaseMutex( hMutex );

341 名前:デフォルトの名無しさん :04/04/24 21:47
多重起動しても一回しかSetWindowsHookExしないように
Mutex用意してあるんでしょ?











ってことで解決なのかそうでないのかはよく知りません

342 名前:デフォルトの名無しさん :04/04/24 21:57
>>341
ソースをよく読め。
Mutexの作成に失敗した場合でもエラーコードがERROR_ALREADY_EXISTSの
場合(Mutexをすでに作成済みというエラー)はSetWindowsHookExの呼び出しに
行っちゃってるだろ。

343 名前:313 :04/04/24 23:07
>>318-320
むう、わかりましら。
レジストリ直読みでなんとなく出来てるんですが、APIがあるならそっちで
逝ってみます。

344 名前:デフォルトの名無しさん :04/04/24 23:44
>>342
ソースうんぬん言う前に投稿時間をみろよ


345 名前:デフォルトの名無しさん :04/04/24 23:52
>>344
342じゃなくて329のことだよ。

346 名前:デフォルトの名無しさん :04/04/25 01:06
>>343
9xでもパフォーマンスデータのレジストリってあったっけ?

347 名前:デフォルトの名無しさん :04/04/25 01:33
>342
WaitForSingleObject

>324
とりあえず SetWindowsHookEx() を呼ぶ関数は DLL 内にあるという解釈でいい?
で、>339 の言うとおり SetWindowsHookEx() 自体は全体で 1回だけ呼べばいい。
後は、>338 で自分でもいってる通り、呼び出し元のウィンドウハンドルの管理をする。
登録関数で追加、解放関数で削除、フック内部ではリストを見ながらメッセージ送信すれば OK かと。

348 名前:デフォルトの名無しさん :04/04/25 11:03
>>339-342
SetWindowsHookEx自体は1回だけ呼び出すようにするつもりです。
元のソースは書きかけだったもので・・・お手数おかけしました。

>>347

こんな感じでいいんでしょうか?

bool g_InstallHook( HMODULE hModule, HWND hwndNew ) {
HANDLEhMutex = NULL;
boolresult;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) return false;// fatal error

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
DWORDdwWaitResult;

dwWaitResult = ::WaitForSingleObject( hMutex, 1000 );

if (dwWaitResult != WAIT_OBJECT_0) return false;// fatal timeout

}

if (g_hMouseHook == NULL) {
g_hMouseHook = (HHOOK)::SetWindowsHookEx(
WH_MOUSE, (HOOKPROC)g_MouseProc, hModule, 0
);
}

349 名前:デフォルトの名無しさん :04/04/25 11:03
if (g_hMouseHook == NULL) result=false;// hook failed
else {
HWND*newWndList = NULL;

newWndList = (HWND*)GlobalAlloc( 0, sizeof(HWND)*(g_WndCount+1) );

if (newWndList == NULL) result=false;// hook succeeded even here
else {

CopyMemory( newWndList, g_WndList, sizeof(HWND)*g_WndCount );

newWndList[g_WndCount] = hwndNew;

g_WndList = newWndList;

result=true;
}
}

::CloseHandle( hMutex );

return result;
}

350 名前:デフォルトの名無しさん :04/04/25 12:09
C#からW32APIって呼べますか?

351 名前:デフォルトの名無しさん :04/04/25 12:13
呼べます

352 名前:デフォルトの名無しさん :04/04/25 12:15
ありがとうございます。呼べると分かればあとはどうにか調べます。

353 名前:デフォルトの名無しさん :04/04/25 13:56
>>348
・g_WndCount のインクリメントが抜けてる
・GlobalAlloc で確保したメモリはプロセス間共有されないのでフック内で使えない。
 共有領域に固定長で確保するか、FileMapping を使う。
 ただし、FileMapping 使うとプロセスごとに MapViewOfFile しなきゃいけないし、
 本当に動的にするのはかなり厳しいと思われ。不可能じゃないとは思うけど。
 適当に最大値決めて仕様にするのはどうよ?

後、個人的には毎回毎回動的メモリの拡張をやるのはあまり好きじゃないがその辺は趣味の問題だな。

354 名前:デフォルトの名無しさん :04/04/25 14:10
>>353
レスありがとう。
こんな感じにしますた。
ウィンドウへの通知はブロードキャストに。


if (g_hMouseHook == NULL) result=false;// hook failed
else g_WndCount++;

::CloseHandle( hMutex );

return result;
}

355 名前:デフォルトの名無しさん :04/04/25 14:11
bool g_UnInstallHook( HWND hwnd ) {
HANDLEhMutex = NULL;

hMutex = ::CreateMutex( NULL, TRUE, SYSTEM_HOOK_MUTEX_NAME );
if ( hMutex == NULL ) return false;// fatal error

if (::GetLastError() == ERROR_ALREADY_EXISTS) {
g_InstallHookと同じなので略
}

g_WndCount--;

if (g_WndCount <= 0) {

::UnhookWindowsHookEx( g_hMouseHook );

g_hMouseHook = NULL;
}

::CloseHandle( hMutex );

}

356 名前:デフォルトの名無しさん :04/04/25 23:34
CreateProcessWithLogonW で起動した子プロセスの標準入出力を
親プロセスのパイプにつなげてやりたいのですが、CreateProcess の
bInheritHandles に相当するものがないので、パイプハンドルを継承
させることができません。
なにかうまい方法はないもんでしょうか。
対象OSは2000以降です。

357 名前:デフォルトの名無しさん :04/04/25 23:46
>>354
もはや API の話でもなんでもないが、デクリメント前に g_WndCount が 0 以下なら即 return した方が
安全なんじゃないだろうか。
基本的にないケースだとは言え、UnhookWindowsHookEx() に NULL 渡しても大丈夫だろうかとか
余計な不安が消える。

358 名前:デフォルトの名無しさん :04/04/25 23:57
CreateProcessAsUserでも使えば?

359 名前:デフォルトの名無しさん :04/04/26 00:11
あるソフトのWS_POPUPスタイルのウインドウをタイトルバー付きのウインドウに変更したいのですが
SetWindowLongは他のプロセスのウインドウに使えないので、他に何かいい方法はないでしょうか?
検索してもフックする方法しか見つからないのですが、他に方法無いですかね?
スクリプト言語使ってるので、DLL作るのは面倒なんです。

360 名前:デフォルトの名無しさん :04/04/26 00:13
まずはSetWindowLongに関する認識を改めたほうが良い

361 名前:356 :04/04/26 00:19
>>358
すいません。親プロセスは一般プロセスなので LogonUser が使えないんです。

362 名前:デフォルトの名無しさん :04/04/26 02:47
>>361
CreateProcessWithLogonWを使ったとき実際に子プロセスを
起動しているのはRunAsサービスなのでどうしようもない

363 名前:デフォルトの名無しさん :04/04/26 10:43
>>357
了解しました。
よく考えたらg_UnInstallを複数回呼び出した後で、
g_Installとg_UnInstallの組み合わせを複数回呼び出すと・・・

364 名前:デフォルトの名無しさん :04/04/26 17:29
>>360
どういうことですか?

365 名前:デフォルトの名無しさん :04/04/26 20:29
ドラッグ&ドロップハンドル用のHDROPがMSDNに書かれておらず、MinGWのヘッダにも無いのですが
HANDLE型で代用してよいのでしょうか?
猫によると実体は同じ物のようなのですが・・・。http://www.kumei.ne.jp/c_lang/sdk2/sdk_105.htm

366 名前:デフォルトの名無しさん :04/04/26 20:33
>>365
少なくとも、Platform SDK Documentationには書いてありました。>HDROP

367 名前:デフォルトの名無しさん :04/04/26 20:42
>>366
ありがとうございます。
shellapi.hの中を捜してみるとMinGW側でもちゃんと宣言されていました。
自分の書いたコード側の問題のようなのでそちら側で調べてみます。

368 名前:デフォルトの名無しさん :04/04/26 20:47
原因がわかりました。Cの原則を忘れてswitch〜case内で変数宣言してましたorz

369 名前:デフォルトの名無しさん :04/04/26 21:11
Cでも{}で括れば変数宣言できるだろ。

370 名前:デフォルトの名無しさん :04/04/26 21:29
コンソールアプリでBASICで言うところのLOCATEに相当するAPIって何でしたっけ?
なんか有ったと思いましたが再発見できず・・・。

371 名前:デフォルトの名無しさん :04/04/26 21:38
SetConsoleCursorPosition?

372 名前:デフォルトの名無しさん :04/04/26 21:50
与えられた文字列がフォルダかファイルへの形式的に正確なパスかどうかを判定するのはどうやりますか?

373 名前:デフォルトの名無しさん :04/04/26 21:51
>>371
ですね、有難うございました。
そーか、猫のページで見たんだ。

374 名前:デフォルトの名無しさん :04/04/26 21:59
>>372
そんなAPIあったな。

375 名前:デフォルトの名無しさん :04/04/26 22:05
Path〜系のであったと思う。

376 名前:デフォルトの名無しさん :04/04/26 22:53
>>372
MASAPICOでぐぐれ


377 名前:デフォルトの名無しさん :04/04/27 03:19
win32アプリでWinMainでreturn msg.wParamと終了するのではなく、
他の潜り先でGetMessageの戻り値が0以下の時にexit(msg.wParam);
ではダメなのでしょうか。

378 名前:377 :04/04/27 04:07
>>377
すいません。自己解決しました。

379 名前:デフォルトの名無しさん :04/04/27 10:28
フォントについて教えてください。
以下のようにコーディングしているのですが
出力されるフォントが普通の明朝体のようなフォントで
出力されてしまいます。どこがまずいのでしょうか?

hFont = CreateFont(25,
0,
0,
0,
FW_BOLD,
FALSE,
FALSE,
0,
SHIFTJIS_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"Comic Sans MS");


380 名前:デフォルトの名無しさん :04/04/27 10:34
明朝体になったのはもしや全角文字?

381 名前:379 :04/04/27 10:40
>>380
半角文字です。出力はTextOutで行っています。

382 名前:デフォルトの名無しさん :04/04/27 10:48
とりあえず、気になったのは
CharSetをANSI_CHARSETにしてないのと、
ちゃんとDCに関連付けてるかどうか

383 名前:379 :04/04/27 10:52
>>382
べりーさんくすです。
ANSI_CHARSETにしたら丸っこい字になりました。
ほんとうにありがとうございました。

384 名前:デフォルトの名無しさん :04/04/27 10:53
自分でパラメータを組み立てないでEnumFontFamiliesExで
帰ってきたものをCreateFontIndirectに渡すか
GetStockObjectを使うのが鉄則
どうしても自分で組み立てる必要があるときは
フォント名よりcharsetの指定のほうが優先度が高いことを
押さえとけ

385 名前:デフォルトの名無しさん :04/04/27 10:54
一歩遅かった_| ̄|○

386 名前:379 :04/04/27 10:59
>>384
なるほどー
勉強します。

387 名前:デフォルトの名無しさん :04/04/27 14:46
はじめまして。
任意のフォルダをクリックするとそのフルパスを表示するようなものを
作りたいと思っています。
フックをかけて処理を行おうと思っているのですが、
肝心のフルパスを取得する方法が分かりません。
何かよい方法がありましたらよろしくご教授お願いします。



388 名前:デフォルトの名無しさん :04/04/27 16:05
> 任意のフォルダをクリックする

「フォルダをクリック」の意味が不明

389 名前:デフォルトの名無しさん :04/04/27 16:09
>>387
explorer.exeの各フォルダウィンドウで、
ファイル・フォルダを表示しているSysListViewで
WM_LBUTTONDOWNが発生した時に、
カーソルの下にあるファイルのパスを表示したいって事?


390 名前:387 :04/04/27 16:14
文章が分かりにくくてすみませんでした。
389さんの通りです。


391 名前:デフォルトの名無しさん :04/04/27 16:25
"フォルダアイコンにマウスカーソルを合わせるとフルパスを表示する"
ならShell Extension書けば終わると思うが。

392 名前:デフォルトの名無しさん :04/04/27 16:27
そもそも表示すると言ってもどこに表示するのやら。

393 名前:デフォルトの名無しさん :04/04/27 16:31
Explorerのオプションでタイトルバーに表示できますね。win2000

394 名前:387 :04/04/27 16:47
Shell Extensionですね。
知らない言葉なので調べてきます。
ありがとうございました。



395 名前:デフォルトの名無しさん :04/04/27 21:46
マウスでサイズ変更可能な子ウィンドウがあり、
親ウィンドウより大きなサイズにまで変更可能にしたいのですが、
どのようにしたら良いのでしょうか?

WM_GETMINMAXINFO で ptMaxSize と ptMaxTrackSize に大きな値を設定しても
サイズ変更枠のドラッグ中に、
親ウィンドウの外までカーソルを移動させることがでませんでした。

よろしく願いします。

396 名前:デフォルトの名無しさん :04/04/27 22:01
>>395
ウィンドウスタイルを見直してみな。

397 名前:デフォルトの名無しさん :04/04/28 00:06
>>396
解答ありがとうございます。

早速、Spy++で親ウインドウの外まで広げられるウインドウと
広げられないウインドウのスタイルを
比較しようと思ったのですが、
手元にあるアプリケーション(DF,VC6等)は全て広げられず、比較することができませんでした。

MSDNを見ても、それらしいスタイルが見つからないのですが、
具体的にどのスタイルが必要なのか教えて頂けないでしょうか?

398 名前:デフォルトの名無しさん :04/04/28 00:10
>>397
CreateWindowでどんな指定をしているか見せて

399 名前:デフォルトの名無しさん :04/04/28 00:34
ポップアップウィンドウ>>(超えられない壁)>>チャイルドウィンドウ

400 名前:395 :04/04/28 01:30
>>398
HWND hWnd=CreateWindow(
  szWindowClass, szTitle, WS_CHILD | WS_SIZEBOX | WS_VISIBLE,
  100, 100, 100, 100, hWndParent, NULL, hInstance, NULL);

各変数は VC7.1 の Win32 プロジェクトウィザードで作成された物をそのまま使用しています。

>>399
子ウィンドウが必要なのでWS_POPUPを付けるわけにはいかないんです。

401 名前:デフォルトの名無しさん :04/04/28 01:58
>>400
WS_CHILDを外すしかない。

402 名前:デフォルトの名無しさん :04/04/28 05:50
WS_CHILDをつけなければいいだけで、
子ウインドウに出来ないというわけではない。
それとも、WS_CHILDが必要なの?

403 名前:デフォルトの名無しさん :04/04/28 09:25
メインのウィンドウとWS_CHILDではない子ウィンドウがあるとして、
例えばモーダルなダイアログボックスを表示したときに、
子ウィンドウがEnableなままというような事は発生するんだが、
こういうのはどうにでもなるしなあ。。。なんだろ?

404 名前:デフォルトの名無しさん :04/04/28 10:44
割り込んで申し訳ないが、質問させてくれ。
「画面のプロパティ」ダイアログの「デザイン」タブみたいな事をしたいんだけど、
やはり、GetSysColorとかGetThemeとか使って、ちまちまやるしかないの?
それとも便利な関数とかある?

405 名前:デフォルトの名無しさん :04/04/28 10:57
DrawFrameControlとか?

406 名前:デフォルトの名無しさん :04/04/28 11:19
>>405
確かにボタン類やスクロールバーはそれで良いんですが、
それだと、タイトルバー等が描画できなくないですか?

また、XPのビジュアルスタイルにも対応したいのですが、
GetTheme等を用いなくても、たとえばウィンドウスタイルだけ渡したら、
その通りに描画してくれる関数・・・なんてのは無いですか?


407 名前:デフォルトの名無しさん :04/04/28 11:42
uxtheme(.dll)でMSDN調べる

408 名前:404 :04/04/28 11:47
>>407
いや、ビジュアルスタイルの場合は、
各種関数用意されてて簡単なんだよ・・・

問題は、2000とか9x系での話で、
DrawEdgeやらDrawCaptionやら使うしか無いのか・・・と。

409 名前:デフォルトの名無しさん :04/04/28 11:54
特定のネットワークアダプタのIPアドレス等の値を
設定するAPIを探しているのですが、探し方が
悪いようで一向に見つかりません。

どなたかご存じないですか?
よろしくお願いします。

410 名前:404 :04/04/28 11:54
http://hp.vector.co.jp/authors/VA020801/lnkpg/sample/drwnd.txt
こんなの見つけた・・・

411 名前:デフォルトの名無しさん :04/04/28 12:00
正規の方法では設定を調べつつDrawCaptionだのを組み合わせるしかないだろうな
あとはサブクラス化あたりでOSにむりやり描画させるか

412 名前:デフォルトの名無しさん :04/04/28 12:13
>>402-403
WS_CHILDを持たないウィンドウは「所有されたウィンドウ」であって
「子ウィンドウ」ではない(少なくともMSDNの定義では)。

413 名前:デフォルトの名無しさん :04/04/28 13:55
リッチエディットコントロールの行間を詰める方法を教えていただきたいのですが、

「こんな風に

行間が空いて

表示されて

みっともないので...」

よろしくお願いします。


414 名前:myPrintf() user :04/04/28 14:50
Edit_ReplaceSel() でC文字列を送り込んだことしかないが、
どうやって表示しているかがわからないと...

415 名前:413 :04/04/28 15:09
>>414
エディットコントロールは指定したフォントの高さ=行の高さで処理されるのですが、
リッチエディットコントロールで同じフォントを使用した場合、
フォントの上下に少し隙間ができて>>413のように表示されてしまいます。
CHARFORMAT以外にもいろいろ指定しないと駄目なのでしょうか?


416 名前:デフォルトの名無しさん :04/04/28 15:13
行間は設定できないはず。

417 名前:デフォルトの名無しさん :04/04/28 15:29
スレの趣旨とは少し外れるかもしれませんが質問させてください。
ダイアログやメニューはリソーススクリプトを書いて読み込ませることも、自分でCreateWindow(Ex)でガリガリ書く事も出来ますよね。
コンパイル後に外部からResourceHacker等でいじりやすくしようと思うとこれらを極力リソーススクリプトに追い出すべきかと
思っているのですが、保守性等の面でどちらが有利なのかは経験が浅いので良く分かっていません。

皆さんはこの二つの方法をどのように使い分けてらっしゃるんでしょうか?

418 名前:デフォルトの名無しさん :04/04/28 15:35
>>417
ダイアログエディタ使わないの?
rc変更するだけで配置を変えられるので、rcのほうがお手軽でしょ。

419 名前:デフォルトの名無しさん :04/04/28 15:54
>>418
使ってないんです。。多国語対応等も考えるとやはりリソーススクリプトに追い出した方がよさそうですね。
ありがとうございます。

420 名前:デフォルトの名無しさん :04/04/28 17:05
>>417

配置する部品が多い、特にボタンやテキストボックスなどをグリッド状
に配置するような場合は自分でCreateWindowする。こうしておけば、配置
処理を書き換えるだけで簡単に配置を変更できる上に動的な位置・サイズ
変更もやりやすいからね。


421 名前:デフォルトの名無しさん :04/04/28 17:08
>>411
非表示ウィンドウを作ってWM_PRINTでOSに書かせるのが簡単では?


422 名前:デフォルトの名無しさん :04/04/28 17:35
>>413
Win98のrichedit32.dllをコピーすると詰まります
検索すると配布しているサイトも見つかったはずです

423 名前:413 :04/04/28 18:26
>>422
有難うございます、見事に詰まりました。感謝です。



424 名前:デフォルトの名無しさん :04/04/28 19:14
C++でWin32APIプログラミングをする際にはどのような事に気をつけるべきですか?

425 名前:デフォルトの名無しさん :04/04/28 19:17
くだらない質問をしないように気をつけるべき。

426 名前:デフォルトの名無しさん :04/04/28 20:08
>>425
くだらねーレス付けてんじゃねーよ、市ねボケ!

427 名前:デフォルトの名無しさん :04/04/28 20:38
くだらない煽りをしないように気をつけるべき。

428 名前:デフォルトの名無しさん :04/04/28 22:27
>>424
ウィンドウプロシージャとしてメンバ関数を登録したい
というFAQ中のFAQを質問しないこと。

429 名前:デフォルトの名無しさん :04/04/28 22:29
CMyWindowClass::WndProcをウィンドウプロシージャにしたいんですが、どうしたらいいんですか?

430 名前:デフォルトの名無しさん :04/04/28 23:35
VC6でダイアログベースのアプリを作っています。
どのコントロールにフォーカスが移っても
IMEの入力モードを直接入力に強制的に固定したいのですが
どのようにすれば実現できますか?

また似たような質問になりますが、全角モードで入力されてもIMEを通さずに直接入力されたように
扱いたいのですが、どのようにすればよいでしょうか?

よろしくお願いします。

431 名前:デフォルトの名無しさん :04/04/29 00:51
IME操作のAPIをチェックしてから言え馬鹿

432 名前:デフォルトの名無しさん :04/04/29 01:01
コンボボックスの入力エリアに入力されたキーメッセージを
感知・処理するため、処理の行き掛り上、コンボボックスの
CB_GETDROPPEDSTATEがきた時に次の関数を呼び出していますが
いまいち不安定です。
どうすればよろしいでしょうか?

void func(){  
 MSG   msg;
 HWND ComboEditHandle = ::GetWindow(ComboHandle,GW_CHILD);
 if(ComboEditHandle==NULL)
    return;
 ::GetMessage(&msg,ComboEditHandle,0,0);

  switch(LOWORD(msg.wParam)){
    case VK_RETURN:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_RETURN,0);
       break;
    case VK_LEFT:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_LEFT,0);
       break;
    case VK_RIGHT:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_RIGHT,0);
       break;
    case VK_UP:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_UP,0);
       break;
    case VK_DOWN:
       ::SendMessage(ComboHandle,WM_KEYDOWN,VK_DOWN,0);
       break;
 }
}


433 名前:デフォルトの名無しさん :04/04/29 01:08
>>432
サブクラス化してるの?

434 名前:デフォルトの名無しさん :04/04/29 01:16
ちょっと根本的なことで疑問に思ったんだけど、
APIを呼び出すって事は各APIごとに決められたアドレスにジャンプさせること
っていう認識でいい?
API群は起動時に全てメモリに読み込まれるのかな。

435 名前:デフォルトの名無しさん :04/04/29 01:19
お前沢村だろ?

436 名前:デフォルトの名無しさん :04/04/29 01:20
Win32 APIの実体は単なるDLLからexportされた関数。
それ以上でもそれ以下でもない。

437 名前:デフォルトの名無しさん :04/04/29 01:33
VBのプロパティ入力コントロールの作るには、どのAPIを利用すればよいのでしょうか?
HTMLのタグエディタを予定しています。


438 名前:デフォルトの名無しさん :04/04/29 01:37
>>437
いっぱい

439 名前:デフォルトの名無しさん :04/04/29 01:42
>>438
いやいや・・・、微妙に突っ込み方がわからなくてすみません。

440 名前:デフォルトの名無しさん :04/04/29 02:48
>>437
CreateWindow()

441 名前:デフォルトの名無しさん :04/04/29 04:01
特定のソフトのメモリを書き換えるソフトを作っているのですが、
"WriteProcessMemory"のアドレスと書き換えるデータの型指定が分かりません。
プロセスの取得までは出来たのですが、どうにも分かりません。
どうか教えてもらえませんでしょうか?

442 名前:myPrintf() user :04/04/29 08:10
>>422-423
「猫でもわかる...」の説明通りにやっていると、win98 VC++ 6.0 で作った
application で、winXP でも、行間は詰まって表示されているが、これは
どういうことかなあ。フォント設定とか付けてレジストリ記憶です。

443 名前:デフォルトの名無しさん :04/04/29 09:10
>>409
もしかして、これって不可能なのでしょうか?

444 名前:デフォルトの名無しさん :04/04/29 11:26
>>443
GetAdaptersInfo

445 名前:デフォルトの名無しさん :04/04/29 12:14
>>440
そうではなくて・・・
VBで開発するときに使う、プロパティ設定が出来るコントロールを作りたいのです。


446 名前:デフォルトの名無しさん :04/04/29 12:21
>>445
だから自分でちまちま既存のコントロール組み合わせて作れっていわれてんだろ。

447 名前:デフォルトの名無しさん :04/04/29 12:27
WC_LISTVIEWを指定しろ
てかここのアマグラマは使えないな

448 名前:デフォルトの名無しさん :04/04/29 12:30
>>445
COM ATL ActiveX

あたりでググってみな。
多分途中でやる気が萎えると思うが。

449 名前:デフォルトの名無しさん :04/04/29 12:46
>>447
> WC_LISTVIEWを指定しろ
それはCreateWindow()を使えってことだろうが

450 名前:デフォルトの名無しさん :04/04/29 12:48
CreateWindowじゃぐぐれもしないだろ
質問に対する解決になってないな

451 名前:デフォルトの名無しさん :04/04/29 12:59
>>450
なに言ってんのあんた?
あんた445?
CreateWindowでググれなんて誰も言ってないぞ。
キーワードは COM ATL ActiveX だ。
とってもややこしい話だからここでかいつまんで説明するって訳にはいかないんだよ。
だからググれといってるの。
上のキーワードの意味が理解できなてなきゃVBのコントロールは作れない。
CreateWindow以前の問題なんだよ。

452 名前:デフォルトの名無しさん :04/04/29 13:02
エディタ作るのにそんなのいらねーだろw

453 名前:413 :04/04/29 13:12
>>442
それが解からないんですよね。
自分のPCにWin98用のriched32.dllが無くても、
行間が詰まって表示されているソフトがあったので疑問に思っていました。
そういうのはどうなんでしょうね?組み込みなのか、独自にラップしたものか...

ググってみて、OSによってdllが異なる動作をするのは解かりました。
(当方Win2000)


454 名前:デフォルトの名無しさん :04/04/29 13:28
>>444
それって、取得だけじゃなくて設定もできるんですか?

455 名前:デフォルトの名無しさん :04/04/29 13:55
画面は16bit〜32bitの環境でパレットアニメーションは出来ません。
なので8bit以下のオフスクリーンビットマップを使って、
パレットアニメーションをしようと思うんですが、やり方がまずいのか
失敗してしまいます。

いろんなサイト見て回ったんですが、
画面のシステムパレットをアニメートする方法しか、
見つけられませんでした。

オフスクリーンのビットマップのパレットを使って
GDI関数だけでパレットアニメーションさせる事は、
そもそも可能なのでしょうか? 漏れ、不可能な事やってます?

456 名前:デフォルトの名無しさん :04/04/29 13:58
>>455
可能です。


457 名前:デフォルトの名無しさん :04/04/29 14:02
>>456
って事は漏れのやり方が悪いんですね。
いろいろ試してみます。
どうもありがとう。


458 名前:455 :04/04/29 16:29
CreateDIBSection で返る HBITMAP を
SelectObject した HDC では
SetPaletteEntries&RealizePaletteを使った
パレットの変更は出来ないみたいなんですが、
他のやり方など、有りますか?

459 名前:デフォルトの名無しさん :04/04/29 16:35
手でやったほうが早い/速い気がせんでもない

460 名前:デフォルトの名無しさん :04/04/29 17:25
ウィンドウを複数作りたいのですが、どうもうまくいきません。
ボタンが押されたら、新しいウィンドウを表示させたいのですが、
どのようにしたらよいのでしょう。

461 名前:デフォルトの名無しさん :04/04/29 17:30
>>458

8ビットDIB/DIBSectionならカラーテーブルを書き換えるだけ。
システムのパレットは関係ないよw


462 名前:デフォルトの名無しさん :04/04/29 17:41
>>460
WM_KEYDOWNとかWM_LBUTTONDOWNとかでCreateWindow

463 名前:460 :04/04/29 18:18
>>462
WNDCLASSを作るときで引っかかっています
インスタンスとかはどんなやってつくればいいのでしょうか?


464 名前:デフォルトの名無しさん :04/04/29 18:20
DIBSECTION 構造体に BITMAPINFOHEADER がメンバーとして入ってますが、
このメンバーが BITMAPV4HEADER や BITMAPV5HEADER になることはある
んでしょうか。

BITMAPV[45]HEADER を渡して CreateDIBSection() しても、できあがった
DIBSECTION 内では BITMAPINFOHEADER ?


465 名前:デフォルトの名無しさん :04/04/29 18:24
>>463
>作るときで
>どんなやってつくれば
日本語を勉強しましょう。

466 名前:デフォルトの名無しさん :04/04/29 18:31
>>463
WNDCLASS作んなくていいから、
とりあえず、"EDIT"とかで作ってみろ。

それで出来たら、今度はクリックとか考えずに
オリジナルのWNDCLASSを持つウインドウを作ってみる。

今度はそれの応用だ、簡単だろ?


467 名前:460 :04/04/29 18:39
>>466
コントロールを作るのではなく、ウィンドウを作ろうと思っています。

ウィンドウごとに別のプロシージャを使いたいので、
WNDCLASSを新しく作るしかないと思ったんですが、ほかに方法があったりするのでしょうか?

468 名前:デフォルトの名無しさん :04/04/29 18:42
>>467
知ってるよ。
コントロールを作るのは練習だ、練習。
エディットコントロールは、EDITという名で
WNDCLASSが登録されてるの。

469 名前:460 :04/04/29 19:22
サブクラス化しようとしたができませんでしたが、
なんとなくで新しく作るWNDCLASSのhInstanceに
メインのウィンドウのインスタンスと同じものをいれたら普通に通りました
ご迷惑をおかけしてすみませんでした^^

470 名前:デフォルトの名無しさん :04/04/29 19:29
こういうやつっていったい何を資料にしてるんだろw

471 名前:404 :04/04/29 20:17
結局、WS_CHILDで子ウィンドウ作る事にしました。
とっても簡単・確実。

472 名前:デフォルトの名無しさん :04/04/29 20:29
Windowsタスクマネージャーのアプリケーションのところに
作ったアプリケーションを表示させないようにするにはどのWSを
消せばいいの?

473 名前:デフォルトの名無しさん :04/04/29 20:37
WS_EX_TOOLWINDOWだっけな。

474 名前:デフォルトの名無しさん :04/04/29 20:47
物凄い黄金アマグラマ群が湧いてるようだな

475 名前:デフォルトの名無しさん :04/04/29 21:12
まだ表示されるんですけど

476 名前:デフォルトの名無しさん :04/04/29 23:22
>>475 ウィンドウスタイルに「追加」

477 名前:デフォルトの名無しさん :04/04/29 23:23
>>474
春だからね。

478 名前:デフォルトの名無しさん :04/04/29 23:23
>>477
GWだからだと思う。

479 名前:デフォルトの名無しさん :04/04/30 00:40
>>472はタスクマネージャから消したいんだろ?少なくとも俺はどうすればいいか分からない。
サービスにしてsvchostあたりから動かせば可能かもしれないが方法によってはそれでも見れる。

480 名前:デフォルトの名無しさん :04/04/30 00:50
>>479
「アプリケーション」タブに非表示 == タスクバーに非表示
「プロセス」タブじゃない。

481 名前:デフォルトの名無しさん :04/04/30 00:50
そもそも、見えないようにする意図がいまいちピンと来ないんだが。

482 名前:デフォルトの名無しさん :04/04/30 01:43
>>481 愚か者

483 名前:デフォルトの名無しさん :04/04/30 03:39
今までプログラムしたことない新人さんも大量に発生しているからな。
俺も、初GWはプログラミングの勉強に費やした。

484 名前:デフォルトの名無しさん :04/04/30 08:13
>>483

485 名前:デフォルトの名無しさん :04/04/30 10:17
大量の学生をウォッチ出来るスレはここですか?

486 名前:デフォルトの名無しさん :04/04/30 12:50
>>481
典型的にはタスクトレイ常駐型アプリだろ。
ついでに非表示ウィンドウを親にするという手もある。

487 名前:デフォルトの名無しさん :04/04/30 13:26
なんか、ぐだぐだだな。

488 名前:デフォルトの名無しさん :04/04/30 22:40
タスクマネージャとタスクバーの区別がつかない奴がいるスレはここですか?

489 名前:デフォルトの名無しさん :04/04/30 22:53
bigenPaintでヘアカラーする奴がいるスレはここですか?

490 名前:デフォルトの名無しさん :04/04/30 22:55
もともとそんなにレベルが高いスレじゃなかっただろ
それとも叩いてるほうも学生なのか?

491 名前:デフォルトの名無しさん :04/04/30 22:59
>>488
それはお前だけ

492 名前:デフォルトの名無しさん :04/04/30 23:03
>>489
いやそれはここじゃないって

493 名前:デフォルトの名無しさん :04/04/30 23:04
>>492
>>240

494 名前:デフォルトの名無しさん :04/04/30 23:12
部屋カラー?

495 名前:デフォルトの名無しさん :04/04/30 23:17
ちがう

496 名前:デフォルトの名無しさん :04/04/30 23:20
タスクトレイ常駐型でもタスクマネージャのアプリケーションタブのとこに
出る奴と出ない奴があるけど、あれは何が違うん?

497 名前:496 :04/04/30 23:22
あ、今自分でわかったからいいや。今のなし

498 名前:デフォルトの名無しさん :04/04/30 23:23
>>497
そういう情報は横展開しましょう。

499 名前:デフォルトの名無しさん :04/04/30 23:44
DIB をクリップボードにコピーしようとしています。
下のようなコードを書いたのですが、クリップボードにコピーされた画像がズレてしまい、
しかもコピーした後でアプリが終了させられてしまいます。

修正方法を教えてください。

hMem = GlobalAlloc(GHND, sizeof(BITMAPINFO) + Bi.biSizeImage);
hGlobal = (LPBYTE)GlobalLock(hMem);

lpBitmapInfo = (LPBITMAPINFO) hGlobal;
lpBitmapInfo ->bmiHeader = Bi;
lpBitmapInfo ->bmiColors->rgbBlue= 0;
lpBitmapInfo ->bmiColors->rgbGreen= 0;
lpBitmapInfo ->bmiColors->rgbRed= 0;
lpBitmapInfo ->bmiColors->rgbReserved= 0;

memcpy(lpBitmapInfo + sizeof(BITMAPINFO), image, Bi.biSizeImage);
GlobalUnlock(hMem);
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(CF_DIB, hMem);
CloseClipboard();

500 名前:デフォルトの名無しさん :04/05/01 00:09
lpBitmapInfo + sizeof(BITMAPINFO)

lpBitmapInfo + 1 もしくは hGlobal + sizeof(BITMAPINFO)


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.