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


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

Win32API質問箱 Build15
501 名前:デフォルトの名無しさん :03/12/11 23:26
Register<->Unregister

502 名前:デフォルトの名無しさん :03/12/11 23:36
BOOL≠boolean

503 名前:デフォルトの名無しさん :03/12/12 00:26
BOOL==FOOL

504 名前:描画 :03/12/12 03:41
GetPixelとSetPixelについて教えていただきたいことがあります。
ファイルからメモリ上にビットマップを読み込み、別に用意したメモリ上で減色したビットマップを生成したいのですが、
(GetPixelでピクセルを読み込み、RGB分解して減色させて、SetPixelで書き込むと)かなり時間がかかります。

なにか他にいい方法はありませんでしょうか。

505 名前:デフォルトの名無しさん :03/12/12 04:58
GetDIBits/SetDIBits

506 名前:デフォルトの名無しさん :03/12/12 07:21
ビットマップファイルは無圧縮だとただの配列なので、ポインタで直接読み取れ。
ビットマップの構造調べればすぐわかるど。


507 名前:デフォルトの名無しさん :03/12/12 09:01
フラットツールバーについて質問です。
ツールバーを作るときにTBSTYLE_FLATをつけるのが間違いだと
解説されているところばかりなのですが、
作成後にスタイルを変更する方法だと、ツールバーの高さが変わってきます。

たとえば猫では
>しかし、CreateToolbarExとかCreateWindowExでいきなりこれらのスタイルを加えても思い通りになりません。
>いったん従来どおりのスタイルでツールバーを作ってから SetWindowLongでスタイルの指定をします。
とあるので、もしかすると不定なのかなって思ったりもしてるのですが。

で、どうしようかということで少し実験してみたのですが、
フラット状態で作成されると背景が親ウインドウの背景ブラシで塗られるという解釈でいいのでしょうか?
このように書かれた解説も見当たりませんでした。
透明状態で作成されるという記事はいくつもありましたけど・・・

自分の環境ではWin2kしか試せないので、確信が持てません。
ちなみに、WTLとかのソースを見る限り言いのかなという気はしているのですが。

508 名前:492 :03/12/12 09:04
>>494
有り難うございました。

とは言ってもどうすればいいのか良く分からないなぁ。
このヒントでもう少し調べてみます。

509 名前:描画 :03/12/12 09:17
>505-506
どうもありがとうございます。
早速いろいろ試してみます。

510 名前:デフォルトの名無しさん :03/12/12 09:33
>>501
ありがとうございます。
Unregister()の存在は知っているのですが…
他のアプリなんでUnregisterなんてのはご法度ですよね。
第2パラメータの関係で元に戻す事もできないですし。
ようは自分以外はキーを無効にしたいのです。
フックしているのですが、ホットキーは有効になってしまってて…。
フックの仕方がまずいのだろうか???
仕変っていうか制限にしてもらおうかなぁ…

511 名前:デフォルトの名無しさん :03/12/12 10:06
>>510
と、見落としていたスマン。
上書きができないとすると、APIをフックするか先行して登録するしかないんじゃないかな?

512 名前:デフォルトの名無しさん :03/12/12 12:10
>>508
タスクバーに表示されるのはトップレベルのウィンドウで
所有されているウィンドウ、ツールウィンドウ(WS_EX_TOOLWINDOW)、非表示ウィンドウは
タスクバーに表示されない。


513 名前:デフォルトの名無しさん :03/12/12 16:24
あるマウス操作を自動化したくてちょっと作り始めました。
ただ、操作を記録とか難しいことはやろうとはしていません。
で、とりあえず書いてみたソースが下のとおりです。
SetCursorPos(1024/2, 768/2);
HWND hWnd;
Sleep(2000);
hWnd = ::GetCapture();
::SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);

全然、全然クリックしてくれません。
どこがおかしいのでしょうか?

514 名前:デフォルトの名無しさん :03/12/12 16:41
>513
WM_LBUTTONUPも入れたら?

515 名前:デフォルトの名無しさん :03/12/12 17:07
>>513
GetCapture()がNULLになってると予想

516 名前:513 :03/12/12 17:07
すみません。mouse_eventというAPIがありました。

517 名前:デフォルトの名無しさん :03/12/13 12:10
WaitForSingleObjectでシグナルを待つ場合、
この関数でブロック・ポーリングせずにシグナルが発生したら
登録しておいたコールバック関数を呼び出すようなAPIはないですか?
ポーリングしたりサブスレッドで監視して通知というのは避けたいのです。

518 名前:デフォルトの名無しさん :03/12/13 12:30
> コールバック関数を呼び出す

一部のAPIはコールバック関数を登録できるけど、汎用のものは無いね。

コールバック関数って、そのコンテキストでの制約を考えるのが
嫌だから俺はあんまり使ってないなあ。
処理するスレッドが明示されているほうが楽だと思うが、いかが。

519 名前:デフォルトの名無しさん :03/12/13 15:57
>>517
なんでサブスレ駄目なん?

520 名前:デフォルトの名無しさん :03/12/13 17:55
>>519
面倒だからじゃない ?

俺には、そんなに面倒とは思えないけど。

521 名前:デフォルトの名無しさん :03/12/13 18:26
>>520
俺もそう思う

522 名前:517 :03/12/13 20:30
>>518-521
スレッドを使わないのはスレッド作れない特殊な環境だからです。
# WZ Editorのマクロ言語TX-Cというコンパイラ
>517の件は無理そうということなのでタイマで監視するかDLL化する方法を探ってみます。
ありがとうございます。

523 名前:デフォルトの名無しさん :03/12/13 21:15
>>522
API も関数ポインタ (コールバック関数の登録に必要だよね) も使えるのに、CreateThread() が使えないの ?

どんな環境なんだろう...。

524 名前:デフォルトの名無しさん :03/12/13 22:36
>>522
スレッドが作れなくなる、何か強い理由があるなら(漏れはその環境を持っていない)
いま現にWaitForSingleObjectを使ってること自体にも深い問題がありそうだな
オフスペックとか

525 名前:デフォルトの名無しさん :03/12/13 22:54
メインウィンドウのメニューからダイアログボックスを呼びたいのですが、
一応表示はされるものの、表示した瞬間にすべての入力を受け付けなくなります。
ぐぐっては見たんですが結局原因はつかめず。

なぜでしょうか?

526 名前:デフォルトの名無しさん :03/12/13 22:57
>525
何に対して入力が受け付けなくなるの?
まさか「メインウィンドウ」とか言わないよね?

527 名前:デフォルトの名無しさん :03/12/13 22:59
>>526
入力を受け付けなくなるのはダイアログボックス・メインウィンドウ双方です。
こうなるとIDEからデバックの中止をしなければプログラムを終了できない状況です

528 名前:デフォルトの名無しさん :03/12/13 23:03
で、そのときの画面は、タイトルバーの表示を見る限りでは、背面に表示している
はずのメインウィンドウがアクティブウィンドウの状態で、ダイアログボックスは
非アクティブウィンドウにの状態になっています

529 名前:525 :03/12/14 00:14
自己解決しました。
リソースエディタでメニューからリソースの挿入で、挿入するリソースを
選ぶときにどういうわけかIDD_PROPPAGE_SMALLを選んでいたのが
処理が帰ってこなくなっていた原因だったようです。

直接的には、リソーススクリプトの内容が原因だったことになるので、
いくらソースを眺めてもおかしなところは発見できないでいました。

IDD_FORMVIEWを選んだら何事も無かったかのように解決しました。
お騒がせしました。

530 名前:デフォルトの名無しさん :03/12/14 00:25
CHOOSEFONTを使って作った、フォントを変更するコモンダイアログボックスなんですが、
サンプルの部分と実際に変更した文字が、横に並んで出るんですけど一つづつの文字が、縦で出てしまうんですけど。
そうゆう設定ってどこで行っているんでしょうか?
構造体の宣言はこんな感じで行いました。
ZeroMemory(&cf,sizeof(CHOOSEFONT));
cf.lStructSize =sizeof(CHOOSEFONT);
cf.hwndOwner =hWnd;
cf.lpLogFont  =&lf;
cf.Flags     =CF_SCREENFONTS | CF_EFFECTS;
cf.hInstance  =GetModuleHandle(NULL);
if(ChooseFont(&cf)){
       if(hFont != NULL){
       DeleteObject(hFont);
       hFont=NULL;
       }
hFont=CreateFontIndirect(&lf);
rgbColor       =cf.rgbColors;

531 名前:デフォルトの名無しさん :03/12/14 02:33
頭に@が付いてるのは縦書き用フォントだ。

532 名前:デフォルトの名無しさん :03/12/14 02:40
>>531
そうゆうことだったんですね。解決しました。サンクス

533 名前:デフォルトの名無しさん :03/12/14 04:50
マルチディスプレイ環境でwmp6.4などのように2つ目のディスプレイに最大化をさせたいのですが方法が分かりません
取り合えず2つ目の画面の位置を調べたいのですが、GetDesktopWindow⇒GetWindowRectでは
2つ目の画面で実行しても、1つ目のディスプレイの値が返ってきてしまいました

どなたか、2つ目の画面の位置を調べる方法、もしくは最大化させる方法など知っている方がいましたら
教えていただけないでしょうか?

534 名前:533 :03/12/14 05:15
すみません、wmp6.4の最大化というのは最大化ボタンを押した時の最大化ではなく
Alt+Enterを押した時のフルスクリーンのことです
どうかよろしくお願いします

535 名前:デフォルトの名無しさん :03/12/14 15:21
MSペイントのブラシ機能を実装するにはどうしたらいいですか?
フリーラインを引くときカスタムパターンを使いたいってことです。
LineDDAを使うほかないかな?
MSPAINT.exeのなかを見てもLineDDAは使ってないし・・・・
8x8パターンのブラシを作成しても、それで線を引くAPIがわかりません・・・
良い方法があったら教えてください、よろしくお願いします

536 名前:デフォルトの名無しさん :03/12/14 15:29
SelectObjectでブラシを選択するんじゃないの?

537 名前:デフォルトの名無しさん :03/12/14 16:06
>>535
ExtCreatePenじゃダメ?

538 名前:535 :03/12/14 16:18
>>537
それも試してみたんですけど、線を描くとぎざぎざするんですよね。
使い方が悪いのかもしれませんが・・・
明日納期なのでとりあえずLineDDAを使って無理やり描画させておきます

539 名前:デフォルトの名無しさん :03/12/14 17:47
あとはBeginPathくらいか

540 名前:デフォルトの名無しさん :03/12/14 21:34

WINAPI で分割ウインドウを作るのに使えるファンクション
というと、どんなのがありますか?
MFCのCSplitterWndに相当するものはあるんでしょうか?


541 名前:デフォルトの名無しさん :03/12/14 21:44
>>540
専用のAPI なんてない。
スプリッターウインドウコントロールなんて便利なものもない。

作り方が分からなければ MFC の CSplitterWnd
のソースコードを参考にしたらよかろう。


542 名前:ビットマップ :03/12/14 21:49
教えていただきたいことがあります。

やりたいこと:
  ファイルからメモリ上”A”にビットマップ読み込み → 別のメモリ上”B”に"StretchBlt"で画像を縮小
                → メモリ上”B”のアドレスからRGB要素読み込み → 減色してメモリ上”B”に書き込み
問題点:
  これだと書き込みエラーが発生します。

質問:
  試しにメモリ上の”A”を読み書きしてみましたが、問題なく読み書きできます。
  "StretchBlt"で画像を縮小した場合、なにか前置きで 書き込み可能にするようなものが必要なのでしょうか。
  検討いただくに当たり、何か情報が足りないようであれば何なりと言ってください。どうかよろしくお願い致します。

543 名前:デフォルトの名無しさん :03/12/14 21:52
>>541
そうっすか。ありがとうございます。
MFCのCSplitterWndはクセが強いので
APIでなんとかならんかと思ったのですが。


544 名前:デフォルトの名無しさん :03/12/14 22:03
>>543
WTLにあったと思う。


545 名前:デフォルトの名無しさん :03/12/14 22:23
>542
その「メモリ」は、DirectDrawSurfaceとか、DIBSectionの中身の
事を指しているのか?それとももしやLocalAllocで貰ったものを
指しているわけでは無かろうな。

546 名前:ビットマップ :03/12/14 22:39
>545
すみません、正直なところ意味がよく分かりません。 
ビットマップの読み込みはこんな感じです。↓

// ファイルからの読み込み
HINSTANCE hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE);
hdc = GetDC (hwnd);
BmemDC = CreateCompatibleDC (hdc);
hBmem = (HBITMAP) LoadImage (hInstance, fname, IMAGE_BITMAP, 0, 0,
                      LR_CREATEDIBSECTION | LR_LOADFROMFILE);
SelectObject (BmemDC, hBmem);

         ・
         ・
         ・
//読み込んだ画像を画面サイズに合わせて縮小し、メモリ上に保存
hdcMmem= BeginPaint (hwnd, &ps) ;
 MmemDC = CreateCompatibleDC (NULL) ;
 hMmem = CreateCompatibleBitmap (hdcMmem, MovePicW, MovePicH); //メモリに画像サイズを確保
 SelectObject (MmemDC, hMmem);
 SetStretchBltMode (MmemDC, COLORONCOLOR);              //拡大縮小モード
 StretchBlt (MmemDC, 0, 0, MovePicW, MovePicH, BmemDC, 0, 0,
                     BasePicW, BasePicH, SRCCOPY) ;   //拡大縮小画像をメモリに保存
EndPaint (hwnd, &ps);


547 名前:デフォルトの名無しさん :03/12/14 23:28
メモリーDCに張りつけたビットマップと
DIBのピクセルデータを混同してないか?

548 名前:デフォルトの名無しさん :03/12/14 23:40
BeginPaintいらん

549 名前:ビットマップ :03/12/14 23:49
>547
>548
ワタシも BiginPaintはいらないと思うんですが コンパイルすると
”値が割り当てられていないローカルな変数 'hdcMmem' に対して参照が行われました”
という警告が出てしまいます。

DIBピクセルデータとは、はじめにファイルから読み込んだデータとは形式(ビットマップ構造)が異なってしまうんでしょうか。

550 名前:デフォルトの名無しさん :03/12/15 00:02
上でGetDCしてるの使え。
CreateCompatibleBitmapでできるのはDDB
DIBがほしかったらCreateDIBSectionしる。

551 名前:ビットマップ :03/12/15 00:10
>550
GetDC ですね。 確かにうまくいきました。

552 名前:ビットマップ :03/12/15 00:22
>550
CreateDIBSection で変換しなくてはいけないんですね。
引数が いくつか理解できませんが がんばってやってみます。

みなさんどうもありがとうございました。ヒントを頂けたおかげで、
またガンバル気になれました。正直、かなり苦労していますが
1歩進む毎に、感動している状態・・・。
今後も 質問させて頂くこともあると思いますが、根気よくおつき
あい頂けたらと、心からお願い申し上げます。
なにせ、日曜日の数時間しかプログラム書けないもので。。。
年をとると 頭が固くなっていけませんね。。。ははは・・・

553 名前:デフォルトの名無しさん :03/12/15 12:51
>>533
MonitorFromWindow してモニタを調べて、GetMonitorInfo 。

554 名前:ビットマップ :03/12/16 20:03
>542 で質問させて頂いた者です。

前回の質問とは別に、新たな質問です。
以下のようにピクセルデータを読み込んで処理しています。ところが、100枚くらいある
ビットマップの内、数枚に問題が出てきます。
その問題とは、ビットマップの最後数ピクセル分のデータが読み込まれていないような
のです。いろいろ for文の dwSize を意図的に +20 とかにすると最後まで読み込まれ
るようです。以下のようなヘッダの読み込み方法ではいけないのでしょうか。

LPBYTE lpBitmapHead = ( LPBYTE ) bmData.bmBits;//ビットマップ情報
DWORD dwSize = bmData . bmWidth * bmData . bmHeight;//絵のサイズ
        ・
        ・
        ・
for ( i = 0; i < dwSize; i ++) {
LPBYTE lpR = lpBitmapHead + i * 3 + 2;
LPBYTE lpG = lpBitmapHead + i * 3 + 1;
LPBYTE lpB = lpBitmapHead + i * 3;
     <処理>
}

555 名前:デフォルトの名無しさん :03/12/16 20:14
>>554
dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight;

556 名前:デフォルトの名無しさん :03/12/16 20:33
>>554
>>555でサイズは求まるが

>for ( i = 0; i < dwSize; i ++) {
>LPBYTE lpR = lpBitmapHead + i * 3 + 2;
>LPBYTE lpG = lpBitmapHead + i * 3 + 1;
>LPBYTE lpB = lpBitmapHead + i * 3;
>     <処理>
>}

この読み方じゃダメだろ。
ラインの最後にある(かもしれない)パディングを考慮してない。

557 名前:ビットマップ 554 :03/12/16 20:37
>555
さっそくのコメントどうもありがとうございます。
DWORD dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight;
をやってみたところ、ビットマップサイズより大きな値が出ているようで、エラーが出ます。


558 名前:ビットマップ 554 :03/12/16 20:40
>556

そうですか。ピクセルの読み方がおかしいですか。どのような方法が望ましいのでしょうか。

>555
すみません。改めて、ありがとうございます。

559 名前:デフォルトの名無しさん :03/12/16 21:07
DIBの場合、横のラインが32ビットの倍数じゃなきゃあかんので、単純にwidth * hightじゃ足らないのが出てくる。


560 名前:ビットマップ 554 :03/12/16 21:17
>556
>559
ワタシのやり方だと、パディングのデータを読み込んでいる分、ビットマップの最後のピクセルまで
読み込めなくなってしまうのですね。
それで、 >555 の DWORD dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight;
になるわけですね。
パディングの分を考慮して もう一度トライしてみます。
どうもありがとうございます。

561 名前:デフォルトの名無しさん :03/12/16 22:36
>>555
色が8bppしかだめじゃん?

562 名前:デフォルトの名無しさん :03/12/16 22:41
>>561
ん?
4ピクセル境界じゃなくて4バイト境界だよ

563 名前:デフォルトの名無しさん :03/12/16 23:04
全体のサイズより、パディングを含めた
横のサイズと高さを使った方が簡単

564 名前:ビットマップ 554 :03/12/16 23:54
うおー。 もうわけわかめ。

自分のためにも書かせて頂きたいのですが、ビットマップは大きく分けるとヘッダー部分とピクセル部分で構成されていますよよね。

ピクセル部分には横1ラインの最後に調整用にパディングを含むことがある。パディングがbmWidthで取得する際は含まれない。
だから bmWidth * bmHeight では表示のサイズだが、データをいじる時はパディングを含めた ((bmWidth+3) & ~3) * bmHeight
でサイズを取得する必要がある。

ということですのね? 試してみたのですが、((bmWidth+3) & ~3) * bmHeightでやると、ビットマップの最後の方の数ピクセル分
ビットマップデータからはみ出してしまうようです。理解の足りていないところがあるのでしょうか。どうかよろしくお願い致します。

565 名前:デフォルトの名無しさん :03/12/17 00:16
>>564
((bmWidth+3) & ~3) * bmHeight
は間違ってる。
1ピクセルのバイト数をbppとすると
((width * bpp + 3) & ~3) * height

1ラインのバイト数 pitch = ((width * bpp + 3) & ~3) なので
座標(x, y)のピクセル位置は
pitch*y + bpp*x

566 名前:565 :03/12/17 00:21
ちょっと補足
pitch*y + bpp*x
はトップダウンDIBの場合。
普通はボトムアップDIBなので
pitch*(height - y) + bpp*x

567 名前:デフォルトの名無しさん :03/12/17 00:29
ボトムアップDIBはheightがライン数だとして
pitch*(height - 1 - y) + bpp*x
かなーと思いますです…

568 名前:デフォルトの名無しさん :03/12/17 01:08
>>567
そうでした
ほめてつかわす

569 名前:デフォルトの名無しさん :03/12/17 01:15
>>568
恭悦至極に存じます

570 名前:ビットマップ 554 :03/12/17 02:08
みなさんありがとうございます。
もしかして、 BITMAP構造体の ”bmWidthBytes”で1ラインのバイト数は取得できますか?
それと、1ピクセルのバイト数を取得するのにはどのような方法がありますか。
いろんなHPを参考にしようと、検索してみるのですが、ただただ混乱するばかりです。

571 名前:デフォルトの名無しさん :03/12/17 10:33
>>570
MSDNちゃんと読んでる?

572 名前:デフォルトの名無しさん :03/12/17 11:25
>>ビットマップ 554
http://www.vector.co.jp/soft/data/art/se027618.html
これ嫁。

573 名前:デフォルトの名無しさん :03/12/17 13:52
>>570
マクロ使う手もある。
#define WIDTHBYTES(bits)  (((bits) + 31)/32*4)

WIDTHBYTES(横ピクセル*bpp) とか・・

574 名前:573 :03/12/17 13:55
>>570
ああ違った、1ピクセルのバイト数か・・検索したか?

575 名前:デフォルトの名無しさん :03/12/17 19:14
自ノードから送信されるIPパケットの内容を知る方法はありませんか?
(winsockにDLLをかましたり、pCapのようなドライバを作らないで)


576 名前:デフォルトの名無しさん :03/12/17 20:18
>>575
ありません。

577 名前:デフォルトの名無しさん :03/12/17 23:28
http://pc2.2ch.net/test/read.cgi/tech/1063035045/
こっちで聞いたら?

578 名前:デフォルトの名無しさん :03/12/17 23:38
>>575
Windows 2K/Xp系限定なら、SOCK_RAW 使えば、流れているパケットを全部Sniffできるので、
送信元アドレスが自分かどうか見ていれば、送出パケットを全部拾えます。
ついでに言うと、Switchingじゃない馬鹿ハブ使っていれば、
他PC同士の通信も全部見れます。

579 名前:575 :03/12/18 00:58
レスどうもです。
SOCK_RAWとSIO_RCVALLで拾えるのは、多分受信パケットのみですね。
何か違う方法があるのでしょうか?>>578

580 名前:デフォルトの名無しさん :03/12/18 01:48
ホシュ

581 名前:デフォルトの名無しさん :03/12/18 10:16
Richeditコントロールでキーワードを色で文字修飾する
エディタを作ろうと思ったんですけど
VisualStudioみたいに入力後にリアルタイムで修飾をかけるには
どうしたらいいんでしょうか?

最初変更部分だけEM_STREAMINしてやればいいかな?と
おもってコーディングを進めていたんですが変更部分以外も全部書き変わって
モウダメポ(つдT)

多分やったことある人は結構多いと思うのでご教授願いますm(_ _)m

582 名前:581 :03/12/18 10:19
ちなみにファイルから読み込んだデータとかはちゃんと修飾して
表示するとこまではできてます

583 名前:517 :03/12/18 13:28
そういうのはカスタムコントロール作ってやったほうがいいよ。
RichEditはあまりに貧弱すぎ。

584 名前:581 :03/12/18 13:43
SFF_SELECTION
現在選択されている部分(カーソル位置)をデータのストリームに置きかえます。

↑で一応部分変更出来るようです
あと入力された文字を検出したいんですけどWM_CHARじゃ漢字取れませんでした
今WM_IME_ENDCOMPOSITIONで入力終了だけ検出できるんですが入力された
文字を引き取るにはどうしたらいいでしょうか?


>>583
カスタムコントロールってよくわからないので調べてみます

585 名前:デフォルトの名無しさん :03/12/18 14:30
>>584
imeについては猫でもわかるに行け。

586 名前:デフォルトの名無しさん :03/12/18 14:36
LoadBitmap(hInstance, "リソース名");
で、リソースの読みこみに失敗するんですがなぜでしょうか

587 名前:581 :03/12/18 14:37
サブクラス化してあったのでWM_CHAR、WM_IME_ENDCOMPOSITIONを検出後
にCallWindowProcしてエディットコントロールに表示させた後にEN_GETLINEで取ること
ができました

あとは修飾ルーチンに文字データを送ってあげればうまくいきそうです


588 名前:581 :03/12/18 14:39
>>586
MAKEINTRESOURCEマクロは使ってみました?


589 名前:デフォルトの名無しさん :03/12/18 14:42
>>588
使ったんですがだめでした

590 名前:581 :03/12/18 15:03
>>589
別のリソースで試してみても駄目ですか?

bitmapリソースってあんまり好きじゃなので自分の場合は
他の方法で外部のbitmapファイルを呼ぶようにしてます

591 名前:ビットマップ 554 :03/12/18 16:00
>565-574

返事が遅くなりましたが、おかげさまでできました。本当にありがとうございました。1ピクセル当たりのバイト数は8色、16色、256色、16ビット、24ビット
でそれぞれ決まってるんですね。

ほんと、めちゃくちゃ嬉しいです。ありがとうございました。

592 名前:デフォルトの名無しさん :03/12/18 17:55
ここの住人は親切ですね

593 名前:CreateScalableFontResource :03/12/18 17:56
NT4/2000/XP にて、CreateScalableFontResource() の第三引数へ漢字を含むパス名を与えると、
次の AddFontResource() で失敗する(エラー2)のはなぜでしょうか?
パス名がASCIIのみなら問題なく動作します。
Win98では漢字でもASCIIでも問題なく動作します。

tmp = "c:/user/temp/xxx.fot";
ttf = "c:/dir/xxx.ttf"; // OK
//ttf = "c:/漢字/xxx.ttf"; NG
if (CreateScalableFontResource(1/*read only*/, tmp, ttf, NULL) == 0) return GetLastError();
if (AddFontResource(tmp) == 0) return GetLastError();

594 名前:ビットマップ 554 :03/12/18 19:21
>591で書き込んだのですがどうも内容が変でごめんなさい。
ビット数が分かるからバイト数も分かるんですよね。それが言いたかったんです(自分が読んでもそうは読めませんけど・・・)。
以上 お世話になりました。 m(_ _)mアリガト

595 名前:デフォルトの名無しさん :03/12/19 08:33
>>579
> SOCK_RAWとSIO_RCVALLで拾えるのは、多分受信パケットのみですね。
うんにゃ。指定したネットワークポートの出入りパケット全部でし。
パケットSniffのスレッド自体は50〜60行位で書けるので、試してみそ。

596 名前:デフォルトの名無しさん :03/12/19 08:47
>>593
引数がマルチバイト型文字列扱いされていると格納方法が違うのでは?
デバッガのメモリダンプ見てみればわかるかもしれませんよ

597 名前:CreateScalableFontResource :03/12/19 11:44
>>596
> 引数がマルチバイト型文字列扱いされていると格納方法が違うのでは?
サンプルプログラムを作り、引数をprintfで確認してみました。格納方法は問題なさそうなのですが。どこが悪いのでしょう。

実行結果:
C>apitest \漢字\XXX.TTF \ABC\XXX.TTF
*** test 1 ***
CreateScalableFontResource(1, "C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp", "C:\漢字\XXX.TTF", NULL) = 1 (LastError=0)
AddFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 0 (LastError=2)

*** test 2 ***
CreateScalableFontResource(1, "C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp", "C:\ABC\XXX.TTF", NULL) = 1 (LastError=0)
AddFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 2 (LastError=0)
RemoveFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 1 (LastError=0)


598 名前:CreateScalableFontResource :03/12/19 11:46
サンプルプログラムのソース:
///@file apitest.cpp
/// build: cl /W3 /MD apitest.cpp gdi32.lib
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void addfont(char* ttf, char* tmp)
{
int ret;
DeleteFile(tmp);
SetLastError(0);

ret = CreateScalableFontResource(1/*read only*/, tmp, ttf, NULL);
printf("CreateScalableFontResource(1, \"%s\", \"%s\", NULL) = %d (LastError=%d)\n", tmp, ttf, ret, GetLastError());
if (ret == 0) return;

ret = AddFontResource(tmp);
printf("AddFontResource(\"%s\") = %d (LastError=%d)\n", tmp, ret, GetLastError());
if (ret == 0) return;

ret = RemoveFontResource(tmp);
printf("RemoveFontResource(\"%s\") = %d (LastError=%d)\n", tmp, ret, GetLastError());

DeleteFile(tmp);
}


599 名前:CreateScalableFontResource :03/12/19 11:46
サンプルプログラムのソースの続き:
int main(int argc, char** argv)
{
setlocale(LC_ALL, "");

char tmpdir[_MAX_PATH];
char tmp[_MAX_PATH];
GetTempPathA(sizeof(tmpdir), tmpdir);
GetTempFileNameA(tmpdir, "api", 0, tmp);

for (int i = 1; i < argc; ++i) {
char ttf[_MAX_PATH];
_fullpath(ttf, argv[i], sizeof(ttf));
printf("\n*** test %d ***\n", i);
addfont(ttf, tmp);
}
return 0;
}


600 名前:CreateScalableFontResource :03/12/19 12:18
追加調査で、AddFontResourceEx() を試してみたら、こちらは漢字を含むパス名も OK でした。
ただしこのAPIは 2000/XP 以降のみなので、NT4/9X に対応できず、採用することができません。


601 名前:デフォルトの名無しさん :03/12/19 12:45
9xではAddFontResource使えばいいんじゃ?
ってまだNT4があるか

602 名前:デフォルトの名無しさん :03/12/19 12:46
Win9XかNTか判別して、NTならResourceExで、
9XならResource()ですませばよろしくて?

603 名前:デフォルトの名無しさん :03/12/19 12:57
NT4ではAddFontResourceWを使ってみるとか

604 名前:CreateScalableFontResource :03/12/19 14:02
>>601-603
OSに応じてAPIを呼び分けるならば、NT4 のみがネックになります。
原因はほぼわかってきまして、CreateScalableFontResource() が作成する
フォントリソースファイル(サンプルプログラムでは "%TMP%\api*.tmp")
をダンプしてみたところ、そこに TTF ファイルのフルパスがMBCSで埋め込
まれるのですが、その埋め込まれたパス名の末尾が漢字の個数分だけ欠けて
いました。
"C:\漢字\XXX.TTF" に対して
"C:\漢字\XXX.T"  となります。NT系カーネルのbugっぽいです。

MSDN,KBには該当する記載がないので、必要な前処理をなにか忘れているのか、
それともNT4の太古から眠るbugを見つけたのか。。うーむ。


605 名前:デフォルトの名無しさん :03/12/19 14:31
CreateScalableFontResourceの段階でおかしくなってるのに
なんでAddFontResourceExだとうまくいくの?

606 名前:CreateScalableFontResource :03/12/19 15:07
>>605
>CreateScalableFontResourceの段階でおかしくなってるのに
>なんでAddFontResourceExだとうまくいくの?

CreateScalableFontResource()を使っていないからです。

AddFontResourceEx()を使う場合は、プライベート指定引数があるので
TTFファイルを直接にプライベート登録できます。

AddFontResource()を使う場合は、プライベート指定が出来ないので、
事前にCreateScalableFontResource()を使い、TTFファイルに対応した
プライベート属性フォントリソースファイルを作り、それを登録する
必要があるのです。


607 名前:デフォルトの名無しさん :03/12/19 16:25
>>595
他ノード間のパケットと自分のところにきたパケットは
読むことはできるけど、自分のところから送信するものについては
読めないみたい

608 名前:デフォルトの名無しさん :03/12/19 16:46
OpenThemeData() に指定するクラス名って、
CreateWindow() するときのクラス名とは別のようなんですが、
使えるクラス名の一覧や説明ってどこかにないでしょうか?



609 名前:デフォルトの名無しさん :03/12/19 19:19
起動中のEXEのフルパスを取得するのってどうやるの?

610 名前:デフォルトの名無しさん :03/12/19 19:25
自プロセスならGetModuleFileName(NULL)

611 名前:デフォルトの名無しさん :03/12/20 01:36
ううう、困った。 
CreateWindowで作ったコントロール(リストビュー)のフォントのサイズを
変更(大きさだけ変えたい)するにはどうすれば良いのでしょうか?

612 名前:デフォルトの名無しさん :03/12/20 01:49
CreateProcessしたプロセスを親プロセスから終了させるにはどうすればいいのでしょう?

613 名前:デフォルトの名無しさん :03/12/20 02:55
>>611
WM_GETFONT → GetObject → LOGFONTを適当に書き換えて
CreateFontIndirect → WM_SETFONT

614 名前:611 :03/12/20 04:00
>>613
回答ありがとう早速試してみます。

615 名前:デフォルトの名無しさん :03/12/20 09:37
>>612
PostThreadMessageを調べよう。

616 名前:デフォルトの名無しさん :03/12/20 11:02
ディスクトップで
マウスのボタン右クリックして「最新の情報に更新」って項目を選んだときは
どういうAPIを実行してるんですか?
やっぱりPostMessageでWM_PAINTを送ってるんですか?

hDC=GetDC(0)
このhDCに書いた落書きを更新で消したいんですけど。

617 名前:デフォルトの名無しさん :03/12/20 11:34
>>616
落書きしてしまったウィンドウ全てにInvalidateRect。
面倒なら画面全部覆うウィンドウを一瞬表示するだけでもいい。
こうすれば更新リージョンが追加されWM_PAINTが発行される。

細かい突っ込みだが
×ディスクトップ
○デスクトップ(desktop)


618 名前:デフォルトの名無しさん :03/12/20 19:46
>面倒なら画面全部覆うウィンドウを一瞬表示するだけでもいい。

だったらInvalidateRect(NULLだろ

619 名前:デフォルトの名無しさん :03/12/20 20:00
>>618
デスクトップ上にある全てのウィンドウを再描画ってことじゃね?

620 名前:デフォルトの名無しさん :03/12/20 21:04
>>619
だから第一引数がNULLなんだろ?

621 名前:デフォルトの名無しさん :03/12/20 21:07
SS_BITMAPを指定したスタティックコントロールに透過色を指定したいのですが、
いろいろ調べたにもかかわらずその方法が見つかりません。

もしかして不可能なんでしょうか?

622 名前:デフォルトの名無しさん :03/12/20 21:18
>>617,618,619,620
さんありがとう!

InvalidateRect(0,&Rect,true);
で落書きを消すことができました

623 名前:デフォルトの名無しさん :03/12/20 21:42
ショートカットファイルや共有ファイルのアイコンで
ショートカットファイルのアイコンの矢印部分のような
通常のアイコンの上に描画されるアイコンがありますが、
このアイコンのシステムイメージリスト内のインデックスを取得する方法ありますでしょうか。

624 名前:デフォルトの名無しさん :03/12/21 09:38

 Winプログラミングと、C++のコンビネーションについて
考えてみたんですが、たとえばボタンやエディットなんかの
コントロールをクラス化して、メインのウインドウで使おうと
する場合に、メインウインドウのウインドウプロシージャの
case WM_CREATE: の部分で子ウインドウのオブジェクトを
生成するのがgood かと思うんですが、しかし、case の
中では
static CButton hoge;
というのはできないんですよね?

そうすると、子ウインドウはウインドウプロシージャの
冒頭で実体化するほかないということなんでしょうか?

そのあたり、C++使って書いている人はどうやってますか?
コンストラクタで子ウインドウの生成ってのは難しいですか?

625 名前:デフォルトの名無しさん :03/12/21 10:53
>>624
なんでstaticてな制限だらけでゲロ使いにくいマゾ仕様にするんだ?
しかも関数内staticなんて、俺に言わせればケリ入るほど最悪だ。
もしそんなのが出てくるようならoperator()()使ってでも避けたいね。

ちなみに俺はコントロールなら非staticメンバにしてるし、
ClassWizardが自動生成するコードも非staticメンバだ。

あとよー、コンストラクタっておまいGWL_USERDATAを知らんのか?

626 名前:デフォルトの名無しさん :03/12/21 11:31
DLLを使わずに、KeyHookをすることは可能ですか?

627 名前:デフォルトの名無しさん :03/12/21 12:57
>>626
ドライバ作ればいいんじゃないの?

628 名前:デフォルトの名無しさん :03/12/21 13:12
タスクトレイのアイコンにカーソルを合わせるとツールチップで文字列が表示されるんですが、
その文字列を外部のプログラムから取得するにはどうしたらいいのでしょうか?
ステータスをツールチップで表示するようなプログラムがあるので、
そういう文字列を取得したいのですが

629 名前:デフォルトの名無しさん :03/12/21 16:39
>>626
フックの有効範囲が自分のアプリ内なら DLL を作る必要なし。
他のアプリのフックなら DLL を作る必要あり。

630 名前:デフォルトの名無しさん :03/12/21 19:47
MFCやらATLやらを使わずに、ActiveXコントロールを使用する方法を
解説しているサイトはないでしょうか?

631 名前:デフォルトの名無しさん :03/12/21 19:49
>>630
Delphi関連のサイトにあるんじゃないか?

632 名前:デフォルトの名無しさん :03/12/21 20:00
>>631
Delphi って元々 ActiveX サポートしてませんでしたっけ?
できれば VC++ での解説だとありがたいのですが…

使ってみたい ActiveX コントロールがあるのですが、
MFCもATLもわからないんです。

633 名前:デフォルトの名無しさん :03/12/21 20:30
ATLとかMFCのソース追っかければええんでないの?

634 名前:デフォルトの名無しさん :03/12/21 21:47
InputBox(っていってわかるでしょうか)を一発で表示してくれるAPIってのは
ないんですよねぇ?

635 名前:デフォルトの名無しさん :03/12/21 21:53
> InputBox
はぁ? なにそれ?
ここはWin32API質問箱なんすけど、合ってます?


636 名前:デフォルトの名無しさん :03/12/21 21:57
最近、明らかにAPIに関係がない質問が多いようです。

637 名前:デフォルトの名無しさん :03/12/21 22:07
>>633
ダイアログボックスに ActiveX コントロールを貼り付けて、
そのダイアログボックスを DialogBox() で表示させようとするだけで、
-1 が帰ってきてしまいます。何らかの仕組みがあると思うのですが、
MFC や ATL のソースを追いかけてもやたらと冗長そうな処理ばかりで
どれが重要なのか検討がつきません。

全部教えれ!とは言わないので、そのあたりのヒントになるような
サイトってないでしょうか…?

638 名前:デフォルトの名無しさん :03/12/21 22:18
>>637
ここ読んでるってことはWin32 APIについてなら
細かいことはともかく基本的な枠組みはわかるよな
だからMFCなら基本的には追えば何とかなるはずだ

だがActiveXだのATLだのはCOMベースでWin32 APIとは
また別な考え方の上に成り立っているものだ
なめてかかると意外に手ごわいから気をつけて

639 名前:デフォルトの名無しさん :03/12/21 22:43
AfxMessageBoxなどで、デフォルト ヘルプ コンテキストをコンテキストとして選択した場合、
ダイアログボックスのキャプションはどうやれば変更できるのでしょうか?

640 名前:デフォルトの名無しさん :03/12/21 23:13
はは〜ん、さてはMFCの質問をWin32APIスレでしようとしてる奴がいるな?

641 名前:630 :03/12/21 23:51
AtlAxWinInit()、AtlAxDialogBox() を使ってどうにか
ダイアログ自体は表示できるようになりました。

でもActiveXをコントロールする方法がわかりません…
やっぱりMFCを使うしかないんでしょうか…

642 名前:デフォルトの名無しさん :03/12/22 00:21
ActiveXコントロールコンテナを自作するのは無謀だと思う
大人しくMFCなりATLなりの助けを借りたほうがいいぞ

643 名前:デフォルトの名無しさん :03/12/22 00:27
今ここを読んでいて、MFCスレかVCスレと勘違いしました

644 名前:630 :03/12/22 00:34
>>642
ありがとうございます、わかりました。
どうもお騒がせしました。

645 名前:デフォルトの名無しさん :03/12/22 01:23
タッチタイピングソフト作ってるんですが、Win32API使って
キーを押しつづけても一回しか入力できないように(キーリピートを防止)したいんですが
どうしたらいいでしょう(´・ω・`)

646 名前:デフォルトの名無しさん :03/12/22 01:58
キー入力はどうやって受け付けてるの?

647 名前:デフォルトの名無しさん :03/12/22 02:07
>>645
該当キーのWM_KEYUPがくるまでWM_KEYDOWNを捨てればok

648 名前:デフォルトの名無しさん :03/12/22 02:33
最小化すると、通常はタスクバーの方に収納されますが
これをMSNメッセンジャーみたいにタスクトレイに向けてアニメーションさせることは出来ないでしょうか?
SPY++で追っかけても分かりませんでした・・・

649 名前:デフォルトの名無しさん :03/12/22 02:37
>>645
WM_KEYDOWNのlParam見て、30ビット目が立ってたら捨てる。

650 名前:デフォルトの名無しさん :03/12/22 02:50
>>648
TrayNotifyWndを探して
中のToolbarWindow32をフック
その後アイコンを探してその座標に向かってアニメーションを描画させればいいのかな

651 名前:デフォルトの名無しさん :03/12/22 05:26
フルスクリーンからWindowsボタンを押下した時に、タスクバーに収まらず
普通のウィンドウになってしまうのを、回避するのにはどうすれば良いのでしょうか?
フルスクリーンかタスクバーに最小化されているか、どちらかという状態に
したいのですが....CreateWindowの引数が間違っているのが原因なのでしょうか?

652 名前:デフォルトの名無しさん :03/12/22 06:29
自分で最小化するしかない

653 名前:デフォルトの名無しさん :03/12/22 06:51
>>652
なるほど、自分やるしかないのですね・・ ( ´・ω・)
やってみます。

654 名前:デフォルトの名無しさん :03/12/22 19:57
CreateMDIWindowで作った子ウィンドウのプロージャにstatic宣言の変数をつけると(C言語)
1つの子ウィンドウを閉じただけで影響が他の子ウィンドウに出るんですが、そういうもんですか?
 というか、子ウィンドウそれぞれのための変数ってどうすればいいんでしょう?グローバル変数・・・・。

655 名前:デフォルトの名無しさん :03/12/22 20:14
>>654
WNDCLASSEXのcbWndExtra
SetProp, GetProc
std::map<HWND, MYDATA>
など

656 名前:655 :03/12/22 20:14
×GetProc
○GetProp

657 名前:デフォルトの名無しさん :03/12/22 22:17
質問です.
int CDllKeyhook::SetHook()
{
hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)(CDllKeyhook::KeyHookProc), hInst, 0);
...
}

CDllKeyhookクラスのメンバ関数としてSetHook,KeyHookProcを定義しています.
上記のようなコードを書くと
「overloaded-functionからHHOOKへ変換できません」
とエラーが出ます.
KeyHookProcをクラスの外に出さずに,メンバ関数のままでこの処理を行うには
どうすればよいですか?


658 名前:654 :03/12/22 22:52
>>655,656
後は本やMSDNを見たりして調べます。ありがとうございました。
>>657
「= :: 」 は単に「=」で良いと思うんだけど・・・どうでしょう?
関数がオーバーロードされているんでは? HHOOK って何だろう?

659 名前:657 :03/12/22 23:00
>>658
すんません.HHOOKではなくHOOKPROCです.
SetWindowsHookExで,KeyHookProcへのポインタを渡したいだけなんだけど,
これがコンパイラに「関数の定義」と誤解されてオーバーロードって言われてる
みたい

660 名前:デフォルトの名無しさん :03/12/22 23:13
メンバ関数はそのままじゃコールバックに使えないので
staticにするのが常道。問題はthisをどうやって渡すかだな・・・

661 名前:デフォルトの名無しさん :03/12/22 23:14
>>657
CDllKeyhook::KeyHookProcはstaticじゃないとダメだけど大丈夫?
(非staticなメンバ関数は隠し引数としてthisを受け取る)

662 名前:654 :03/12/22 23:17
本人じゃないけど>>660,661staticでやってみたところ上手くいきました。

663 名前:本人 :03/12/22 23:24
知識不足ですんません.
クラス内で関数をstatic宣言しろってことすか?意味あるんすか?
コードを載せてもらえるとありがたい.

664 名前:デフォルトの名無しさん :03/12/22 23:34
      ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄
〜′ ̄ ̄( ゚Д゚)< なんだこの厨房どもの会話は
 UU ̄ ̄ U U  \______

thisつきで呼び出したいなら以下で?保障しないけど?

class CDllKeyhook {
unsigned char KeyHookProc[18];
//↓この関数がフック関数の実体(第一引数がthis)
static LRESULT CALBACK RealKeyHookProc(CDllKeyhook*, int, WPARAM, LPARAM);
CDllKeyhook() {
static const unsigned char code[18] =
{
0xFF, 0x34, 0x24, // push [ESP]
0xC7, 0x44, 0x24, 0x04, // mov [ESP+4],
0, 0, 0, 0, // <this>
0xB8, // mov EAX,
0, 0, 0, 0, // <RealKeyHookProc>
0xFF, 0xE0 // jmp EAX
};
memcpy(hook_proc, code, 18);
*(long*)(hook_proc+7) = (long)this;
*(long*)(hook_proc+12) = (long)RealKeyHookProc
}
...
};

CDllKeyhookのメンバからなら
hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)(this->KeyHookProc), hInst, 0);
として登録する

665 名前:664 :03/12/22 23:35
hook_procをKeyHookProcに置換

666 名前:本人 :03/12/22 23:40
上のコード見て,昔MASMでOSのkernel勉強してた頃の
push bp
mov bp, sp
を思い出した.
ありがとうございます.やってみます.

667 名前:664 :03/12/22 23:54
>>666
おっアセソブラわかるのか。じつはvcの生成したの見てまねして作っただけだから
最後のjmpでレジスタ使わずにやる方法を知ってたら教えて。

668 名前:本人 :03/12/23 00:17
コードの良し悪しは,他人にわかりやすい記述になっているかで決まるいいますが,
アセンブラ使って関数呼び出しとは,これまたトリッキーで自分以外読めねぇ..
まぁわかる人はわかると思うけど,これって常套手段なんですか?

ちなみにアセンブラ使わずに
661が言うようふつーにstatic付けるだけで,動いてくれました.
class DLLKEYHOOK_API CDllKeyhook {
 static LRESULT CALLBACK CDllKeyhook::KeyHookProc(int nCode, WPARAM wp, LPARAM lp);

CDllKeyhook::SetHook();
}

int CDllKeyhook::SetHook()
{
 hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, hInst, 0);
}

>>664
こんなC++初心者に,丁寧にありがとうございました.

669 名前:本人 :03/12/23 00:36
すんません.動いてませんわw
664の方法をとらせてもらいます.
ありがとうございました

670 名前:デフォルトの名無しさん :03/12/23 00:40
FlushInstructionCacheしといた方がいいかもね

671 名前:デフォルトの名無しさん :03/12/23 00:43
ちょっとテクニカルだけど、俺ならこうする。
動作確認してないけど。

class DLLKEYHOOK_API CDllKeyhook {
public:
DLLKEYHOOK_API CDllKeyhook() {
hook_class = this;
}
virtual LRESULT KeyHookProc(int nCode, WPARAM wp, LPARAM lp);
  int SetHook()
  {
   hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, PreKeyHookProc, hInst, 0);
  }

protected:
static LRESULT CALLBACK PreKeyHookProc(int nCode, WPARAM wp, LPARAM lp) {
return hook_class->KeyHookProc(nCode, wp, lp);
}

static DLLKEYHOOK_API CDllKeyhook *hook_class;
}

672 名前:664 :03/12/23 01:15
>>668
普通どうするかはしらないけど、不特定多数のフックをかけるのじゃなければ
671のが明らかにいいよね(不特定多数のフックなんてやったことないけど)。

余談かもしれないけど
>>664のはフックを想定したものじゃなくて、ウィンドウ用のクラスを作ったときに
ウィンドウプロシージャでオブジェクトを使うのにGetPropとかGetWindowLongPtr
とか使いたくなかったので、Delphiではこのためにオブジェクトごとにコード片を
動的に作ってやっている、というのを読んでまねした。MFCはどうやっているんだろう。

>>670
FlushInstructionCache(GetCurrentProcess(), KeyHookProc, 18);
でいいの?

673 名前:デフォルトの名無しさん :03/12/23 02:14
MFC だと HWND から CWnd* を取得できる関数があるよ。

674 名前:デフォルトの名無しさん :03/12/23 07:27
マウスボタンが押されたポイントのスレッショルド範囲とエスケープキーが
押されていないかを考慮して、ドラッグが開始されたかどうかを判定してく
れるAPIがあった様な気がするのですが、何て名前でしたっけ?

675 名前:デフォルトの名無しさん :03/12/23 12:10
DragDetect?

676 名前:デフォルトの名無しさん :03/12/23 12:31
そんな便利な関数があったのか

677 名前:デフォルトの名無しさん :03/12/23 16:33
>>667
レジスタ壊したくなけりゃ、pushしてからretすりゃいいじゃんよ。
アセンブラ使いならそんなの常套手段だと思うが...。


678 名前:デフォルトの名無しさん :03/12/23 17:03
>>677
どうせ戻りがEAXにはいるんだからレジスタの内容が変わること自体は
関係ない

679 名前:デフォルトの名無しさん :03/12/23 17:29
>>678
そうじゃなくて、fastcallやレジスタ渡し最適化の心配をしてるのかと思ったが..。


680 名前:デフォルトの名無しさん :03/12/23 17:45
あのコードでは最適化の心配など無いとおもうが。

681 名前:デフォルトの名無しさん :03/12/23 18:08
確かに、よく見るとそこまで最適化される可能性は少ないね。スマソ

まぁ、そんなことどーでもいいけどさ、
> 最後のjmpでレジスタ使わずにやる方法を知ってたら教えて。
なんて書いてあったんで、「なんだこいつ、そんなことも知らねーの?」と思っただけ。


682 名前:デフォルトの名無しさん :03/12/23 18:13
普通に相対アドレス計算すればよかろ
class CDllKeyhook {
 unsigned char KeyHookProc[18];
 //↓この関数がフック関数の実体(第一引数がthis)
 static LRESULT CALBACK RealKeyHookProc(CDllKeyhook*, int, WPARAM, LPARAM);
 CDllKeyhook() {
  static const unsigned char code[16] =
  {
   0xFF, 0x34, 0x24, // push [ESP]
   0xC7, 0x44, 0x24, 0x04, // mov [ESP+4],
   0, 0, 0, 0, // <this>
   0xE9, // jmp rel32,
   0, 0, 0, 0, // <RealKeyHookProc>
  };
  memcpy(hook_proc, code, 16);
  *(long*)(hook_proc+7) = (long)this;
  *(long*)(hook_proc+12) = ((long)RealKeyHookProc) - ((long)hook_proc+16);
 }
};

683 名前:664 :03/12/23 18:15
>>681
もったいぶらずに教えろよ。jmpでやる方法を。

684 名前:664 :03/12/23 18:18
すまん

685 名前:デフォルトの名無しさん :03/12/23 19:34
>>681
可能性?0%ではないの?

686 名前:デフォルトの名無しさん :03/12/23 22:21
thisポインタをecxで引き渡す場合があるという記述を見た記憶があるが
どの処理系の話だったか思い出せない

687 名前:デフォルトの名無しさん :03/12/24 00:20
設定したファイルのCRCを取得するAPI命令ってありませんか?

688 名前:デフォルトの名無しさん :03/12/24 00:58
>>687 自分で計算しよう

689 名前:デフォルトの名無しさん :03/12/24 02:20
http://www.microsoft.com/japan/developer/library/vccore/_core_.2f.gd.2c_2f.gr.2c_2f.gz.htm
これか。

690 名前:デフォルトの名無しさん :03/12/24 07:28
>>687
詩子様のソースを流用すると楽だよ

691 名前:デフォルトの名無しさん :03/12/24 17:11

RegCreateKeyEx のクラス文字列へのポインタ lpClass ってのは
どういうときに使うんですか? 適当に文字列を入れてみましたが
レジストリにはなんも反映されなかったようです。

692 名前:デフォルトの名無しさん :03/12/24 22:20
>>687
ttp://www.gzip.org/zlib/ zlibのcrc32.c

693 名前:デフォルトの名無しさん :03/12/24 22:22
>>691
NULLを指定すべき
http://www.microsoft.com/japan/msdn/library/ja/jpsysinf/html/_win32_regcreatekeyex.asp?frame=true?

694 名前:デフォルトの名無しさん :03/12/25 03:26
>>693
なるほど。NULLでいいのか。
どもども。

695 名前:465 :03/12/25 14:00
>>446
確かに、モーダルです。
友達にちょっとしたイタズラのプログラムを作ってくれと言われたので。
WM_DESTORYが来たときに、くどいくらいに終了確認するプログラムです。
case WM_DESTORY:
  if (IDNO == MessageBox(hwnd,"本当に終了しますか?","確認",MB_YESNO)
    break;
  if (IDNO == MessageBox(hwnd,"マジで?","エラーエラーエラー",MB_YESNO){
・・・・・・
    }else{
    ・・・・・・
}
・・・・・・
なんて事をやってます。
そして、十数個ぐらいMessageBoxを呼び出したあと、PostQuitMessageを呼び出しています。
でも終了されません。
MessageBoxをコメントアウトすると、普通に終了できるんですが・・・。

696 名前:デフォルトの名無しさん :03/12/25 14:34
WM_DESTROYはWindowが破棄された後に来るはずなので、
くどい位終了確認するならWM_CLOSEの方がいいと思われ。

で、WM_DESTROYをハンドリングするなら0を返すかDefWindowProc
呼ばないとだめじゃねーのかな?

697 名前:デフォルトの名無しさん :03/12/25 14:36
>>695
返り血は?

698 名前:デフォルトの名無しさん :03/12/25 16:58
イタズラはイヤズラ
わざわざメッセージを処理せんでも他の言語で(ry

699 名前:デフォルトの名無しさん :03/12/25 17:08
>>695
WM_CLOSEでのDestroyWindow直前でやるべき

700 名前:デフォルトの名無しさん :03/12/25 20:03
>>695
その情熱を建設的なことに傾けろ。
例えば、メッセージボックスだけでゲームノベルを創る、とか。

701 名前:デフォルトの名無しさん :03/12/25 20:47
>>700
それ、昔バッチファイルでやった記憶が‥‥(´Д`)

702 名前:デフォルトの名無しさん :03/12/25 20:49
メッセージボックスじゃ長文が書けないからキツいなあ
画像はMessageBoxExでカスタムアイコン指定すれば何とかなるか

703 名前:デフォルトの名無しさん :03/12/25 23:01
>>701
pauseを知らなかったってオチは梨だぜ

704 名前:貧乏紙 :03/12/25 23:25
>>695
そんなもんはいたずらではない。
俺が昔作ったやつはCで作ったけどディスクトップとwindowsフォルダーに
ダミーのdllとかtxtとか適当な拡張子くっつけてコンピュータを散らかす
プログラムをつくったぞい。
http://www.ne.jp/asahi/tukuba/taro/T.EXE
実行してみろ。

705 名前:デフォルトの名無しさん :03/12/25 23:47
>>704
それはいたずらの範疇をこえてるYo!

706 名前:デフォルトの名無しさん :03/12/26 00:14
>俺が昔作ったやつはCで作ったけどディスクトップとwindowsフォルダーに
>ダミーのdllとかtxtとか適当な拡張子くっつけてコンピュータを散らかす

そんなことされたら発狂して氏にそうw

707 名前:デフォルトの名無しさん :03/12/26 00:28
   _, ,_  パーン
( ‘д‘)
  ⊂彡☆))Д´) >>704

708 名前:デフォルトの名無しさん :03/12/26 00:44
>>704
嘘つくな!なんだよありゃ

709 名前:デフォルトの名無しさん :03/12/26 01:11
>>704
ディスクトップ?
disktop?

710 名前:デフォルトの名無しさん :03/12/26 05:33
すいません。質問なんですが

ret = lpDD->lpVtbl->SetCooperativeLevel(lpDD,hWnd,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

でフルスクリーン表示してるのですがウィンドウ表示にしたくて
最後の部分を DDSCL_NORMAL にすると

バックサーフィスに書き込む部分
lpDDSBack->lpVtbl->GetDC(lpDDSBack, &hDC);
でエラーが出て終了してしまいます。
どうしたらいいでしょうか?

あとメニュー付のフルスクリーン表示してるのですが
フルスクリーン時はダイアログが表示できないのでしょうか?

711 名前:デフォルトの名無しさん :03/12/26 09:15
hWnd
アプリケーションが使用するウィンドウ ハンドル。
呼び出すアプリケーションの最上位ウィンドウ ハンドルに設定する
(最上位ウィンドウが作成した子ウィンドウに対するハンドルではない)。
dwFlags パラメータに DDSCL_NORMAL フラグを指定する場合、
このパラメータは NULL となる。


とMSDNに記述されているのでハンドルを指定すると駄目かもしれませんね

712 名前:465 :03/12/26 11:55
すみません。>>694では、WM_DESTORYではなく、WM_CLOSEです。
それから、自己解決しました。
終了するときは、DefWindowProc()にそのままWM_CLOSEを渡して、
終了しないときは渡さない方法でうまくいきました。
でも、何ででしょう? 何で、PostQuitMessage()ではうまくいかないんでしょう。
WM_QUITメッセージがきたら、
メッセージループのところでゼロが返って、終了すると思うんですが・・・・・・。
メッセージループのところを書き間違えているわけでもないし、
PostQuitMessage()は、WM_DESTORY、以外では使えないのでしょうか?


713 名前:デフォルトの名無しさん :03/12/26 12:29
PostQuitMessage()はWM_DESTORY以外でも使えます

714 名前:デフォルトの名無しさん :03/12/26 16:37
普段の流れは
WM_CLOSE〜DestroyWindow〜WM_DESTORY〜PostQuitMessageですよね。
ウインドウを破棄する前にスレッド終了させようとしたから不具合起こったんじゃないの?


715 名前:デフォルトの名無しさん :03/12/26 18:18
フックについての質問:
全アプリのマウスイベントをフックするプログラム組んでるんだけど
フックプロシージャ−中で
SendMessage(hWnd, WM_COMMAND, 0, 0);
//hWndはdllを動作させるアプリのウィンドウハンドル

他のアプリがフォーカス得てるときに,違うアプリのプロシージャ実行したら落ちるわけ?
だれか解決策を教えてくだされ.




716 名前:715 :03/12/26 18:42
落ちてるコードが違ってましたわ.
SendMessage(hTool, ... );
//hToolはdllを動かすアプリのツールバーのハンドル
よろしくお願いします.

717 名前: ◆xayimgmixk :03/12/26 20:01
>>710
DDSCL_NORMALだとフリッピングが出来ず、バックサーフェスは利用不可なので、
プライマリと同じオフスクリーンサーフェス作って、それをバックサーフェスとして利用する。
Flip使えないから、Bltで転送。

ダイアログの表示はクリッピングで出来ると思う。

718 名前:デフォルトの名無しさん :03/12/26 22:04
>>716
単にプログラムがおかしい悪寒

719 名前:デフォルトの名無しさん :03/12/26 22:16
>>716
その hTool は DLL 内のグローバル変数だったりしないか?
他のアプリからフックプロシージャが呼ばれているときには、メモリ空間もそのアプリのメモリ空間になる。
#pragma 使うか MapViewOfFile() とか使わないと値が共有されない。

720 名前:デフォルトの名無しさん :03/12/26 22:44
1行づつテキストファイルを読みこんでEDITに1行づつ追加していき
全体のテキストを表示させたいのですが
WM_SETTEXTではファイル全部を読みこまないと無理のようです。
コピーペーストで追加していけば、出来そうなのですが他に良いやり方があれば
是非教えてください。

721 名前:デフォルトの名無しさん :03/12/27 00:54
>720
どうしても1行ずつの追加でないといけないのか?

722 名前:720 :03/12/27 02:18
>>721
今は、あるサイズ以下の時だけ動的にメモリーを確保して
一度に読込む方法で問題は無いです。 
でも大きいファイルも表示出来たらと思って聞いてみました。
まあ、EDITに巨大なテキストを表示すること自体良くなさげなので諦めます。

723 名前:デフォルトの名無しさん :03/12/27 08:34
テキスト末尾をEM_SETSELして、EM_REPLACESELするのが
常道だな

724 名前:デフォルトの名無しさん :03/12/27 14:39
>>722
RichEditにしてストリームで読み込めばいいんじゃないの?(プロージャで繰り返すし
>>723
windowsx.hにある Editマクロ Edit_SetSelなど使うと簡単そうだね。
って、メッセージ送ってもマクロだろうが難易度は変わらないか。

725 名前:465 :03/12/27 15:36
>>714
>ウインドウを破棄する前にスレッド終了させようとしたから不具合起こったんじゃないの?
でも、WM_QUITがきたら、
while( (Ret = Getmessage(msg, hwnd, 0,0,) ) != 0)
なので、whileループを抜けるのではないでしょうか?

>>700
それ、Win32APIを覚えたての頃にやった事があります。
といっても、C言語を覚えたのが三ヶ月ぐらい前の話だから、最近です。
我ながら、ひどくショボイものが出来上がりました。

726 名前:465 :03/12/27 15:41
質問です。
ApiMon、デバッガなどを使って、プログラムを実行していると、
たまに、デバッガがかけられている事を感知して、終了するプログラムがあります。
あれは一体、どうやっているのでしょうか?
自分にデバッガがかけられているかどうかを調べるAPIがあるのでしょうか?

727 名前:デフォルトの名無しさん :03/12/27 15:52
IsDebuggerPresent

728 名前:465 :03/12/27 16:47
>>727
ありがとう存じます。
そのまんまの名前ですね。

if (!IsDebuggerPresent())
return 0;

こんな感じでしょうか?
家にネットにつなぐ環境がないもので・・・。

ところで思うのですが、
あるAPIだけ自前で処理し、
ほかはすべて本当のdllに渡すニセモノのdllを作って、
パスより優先されるカレントディレクトリに置いたら、
デバッガの感知を回避させることが可能でしょうか?


729 名前:デフォルトの名無しさん :03/12/27 17:06
if (IsDebuggerPresent())
 return 0;
メッセージループの中にこれを入れておけばいいんじゃね?

730 名前:デフォルトの名無しさん :03/12/27 17:07
>>728
なんかクラッキングっぽいな
できるかできないかといえばできるだろう。 

731 名前:デフォルトの名無しさん :03/12/27 18:39
>>728
> あるAPIだけ自前で処理し、
> ほかはすべて本当のdllに渡すニセモノのdllを作って、
> パスより優先されるカレントディレクトリに置いたら、
IsDebuggerPresentはkernel32.dllだからこの方法は使えないような…。
サイドバイサイドをつかってもね。

EXEで参照しているkernel32.dllという文字列をkernel3_.dllとかにして
偽の名前のDLLを作ったほうがいいかも。
http://www.chiyoclone.net/details.html#listexp
を使うとそういうの作りやすいよ。

そういえばWinny2でもIsDebuggerPresentを使っていて
クラック版では外されていたね。

732 名前:デフォルトの名無しさん :03/12/27 21:48
>>731
GDI32.DLLはその方法使えたけど、kernel32.dllはだめなんかのぅ…

733 名前:デフォルトの名無しさん :03/12/28 00:42
アンチデバッガの素人がつくったアプリなら破るのは簡単。
本物のIsDebuggerPresentの入り口を書き換えてやるだけで、コロリと騙される。

まず、そのアプリをサスペンドモードでCreateProcessする。
自分のプロセス空間の中でIsDebuggerPresentのアドレスを調べる。
アプリのプロセス空間の中で、同じそのアドレスにあるページのアクセス保護を変更する。
そこに 0x33 0xc0 0xc3 の 3 バイトを書き込む。
アクセス保護を元に戻しておく。
そのプロセスをレジュームする。

しかし本物のアンチデバッガを知ってるヤツが作ったアプリなら、
SoftICEでも使わんかぎり、無理。素人にはまず不可能。


734 名前:デフォルトの名無しさん :03/12/28 10:32
普通のフォルダのアイコンを取得するにはどうすればいいでしょう?

SHGetFileInfo(strFullFileName.c_str(), 0, &shFileInfo, sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON);

とやると、strFullFileNameにフォルダのパスを入れても
フォルダのアイコンが取得できません
(SHGFI_USEFILEATTRIBUTESを外せば取得できる)
逆にいうと「必ず存在する普通のフォルダ」でもいいんですけど

レジストリを読んでExtractIconExですかねぇ。。。
でも、あれ環境変数読んでるんだよな Il||li _| ̄|○ il||li

何かいい案がありましたら、ご教示お願いします

735 名前:デフォルトの名無しさん :03/12/28 10:38
IShellFolder::GetUIObjectOfでIExtractIconを取得してIExtractIcon::Extract

736 名前:734 :03/12/28 10:52
>>735
それを使うとしても
Extractの引数にするファイルは実在しないといけないですよね
それともなんか指定があるのかな?

737 名前:デフォルトの名無しさん :03/12/28 11:01
>>736
IExtractIcon::GetIconLocationでファイル名ではないシェル固有の位置情報も得られたはず

738 名前:デフォルトの名無しさん :03/12/28 11:31
>734
>(SHGFI_USEFILEATTRIBUTESを外せば取得できる)

取得できるのに質問してるのはなぜ?

739 名前:デフォルトの名無しさん :03/12/28 12:36
HICON hIcon;
ExtractIconEx("shell32.dll", 3, NULL, &hIcon, 1);

もうね。これ。これが通の頼み方。

740 名前:デフォルトの名無しさん :03/12/28 13:17
はて、アイコンが変更されていたらどうするんでしょう

741 名前:デフォルトの名無しさん :03/12/28 14:39
じゃ、やっぱレジストリじゃん

742 名前:デフォルトの名無しさん :03/12/28 16:13

みなさん、分割ウインドウを作るときは
どうされてますか? APIレベルでの
サポートはないようなのですが。

743 名前:デフォルトの名無しさん :03/12/28 16:23
リソースで作ったダイアログのハンドルを取得するにはどうすればいいのでしょうか?
TABキーでIDC_EDIT104,IDC_EDIT105をフォーカスするようにしたいのですが、
SetFocusにはハンドルが必要なんです。

IDD_CAL DIALOG DISCARDABLE 0, 0, 252, 123
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT
CAPTION "Form"
FONT 8, "MS 明朝"
{
CONTROL "Label100", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 174, 80, 0, 0
CONTROL "身長[m]", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 7, 7, 67, 15
CONTROL "体重[kg]", IDC_LABEL102, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 82, 7, 67, 15
CONTROL "BMI", IDC_LABEL103, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 157, 7, 67, 15
CONTROL "", IDC_EDIT104, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 7, 37, 67, 15
CONTROL "", IDC_EDIT105, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 82, 37, 67, 15
CONTROL "", IDC_EDIT106, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 157, 37, 67, 15
CONTROL "BMIを計算", IDC_BUTTON108, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 45, 75, 60, 18
CONTROL "終了", IDC_BUTTON109, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 120, 75, 60, 18
}


744 名前:デフォルトの名無しさん :03/12/28 16:36
>>743
コントロールのスタイルにWS_TABSTOPがいる、
後メッセージループを書きかえる
while (GetMessage(&msg, NULL, 0, 0)) {
if (hDlg == 0 ||  !IsDialogMessage(hDlg, &msg)) {
〜〜
}
}

745 名前:734 :03/12/28 16:38
>>737

了解、やってみる・・・
シェル関数苦手なんだよな

>>738

SHGFI_USEFILEATTRIBUTESを利用しなきゃいけないから

>>739

通すぎて、私にはできません(笑)

746 名前:744 :03/12/28 16:47
>>744はタブ移動させる別の方法な。
>>743
ダイアログのコントロールのハンドルはGetDlgItem(hDlg, IDC_EDIT104,)で取得できる

747 名前:デフォルトの名無しさん :03/12/28 17:37
>738
>SHGFI_USEFILEATTRIBUTESを利用しなきゃいけないから
フォルダのアイコンを取得するのにファイル属性を利用しなきゃいけない理由は?

748 名前:デフォルトの名無しさん :03/12/29 22:18
abc.exeという実行ファイルがあったとして
この実行ファイルの引数がどうなっているか調べる方法はありますでしょうか?
もしくはそれがわかるソフトでもかまいません。
よろしくお願いします。

749 名前:デフォルトの名無しさん :03/12/30 00:58
>>748
どんな引数を受け付けるか?ってこと?
どんな引数で起動したか?ってこと?

750 名前:デフォルトの名無しさん :03/12/30 01:01
abc.exe /?


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