■過去ログ置き場に戻る■
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.