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


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

Win32API 質問箱 Build3
751 名前:デフォルトの名無しさん :02/05/15 21:43
長い文字列の中のポインタとその長さがメンバの構造体って
デフォルトで用意されていますか?こんなの。
struct pl {
char *lpstr ;
int nlen ;
} ;
あったら作るのたるいのであったら教えてください。
APIでもCでもいいです。

752 名前:デフォルトの名無しさん :02/05/15 21:45
>>751
strlen唱えればいい話。
ところで長い文字列ってDelphiか?w

753 名前:デフォルトの名無しさん :02/05/15 21:48
挿入されているメディアのドライブ番号とメディアタイプを取得する関数定数をおしえてクダサイ。

SetupDi〜?

754 名前:デフォルトの名無しさん :02/05/15 21:49
いや、長い文字列の中で・・・
切り取るんです・・・いちいちmallocするとメモリの無駄なので
メインバッファ一個用意しといてポインタと長さだけを保存するんです。

755 名前:デフォルトの名無しさん :02/05/15 21:52
std::string使えば?

756 名前:デフォルトの名無しさん :02/05/15 21:52
Delphiならば str.Length()


757 名前:デフォルトの名無しさん :02/05/15 21:54
もうchar *の処理系ができているので・・・・

758 名前:デフォルトの名無しさん :02/05/15 23:18
>>754
"string1\0string2\0string3\0"
こんな感じにしといてそれぞれの頭のポインタ持っとけ。

759 名前:デフォルトの名無しさん :02/05/15 23:31
ITEMID構造体はだめなん?

760 名前:デフォルトの名無しさん :02/05/15 23:32
SHITEMIDか

761 名前:デフォルトの名無しさん :02/05/16 21:56
エディットボックスに入力した文字列をOffice2000の入力フィールドに送りたいんですが、
文字化けしてしまい送れません。送り方を教えて下さい。m(__)m
↓の方法だと、メモ帳などには送れるのですが...
HWND hSendWnd; // Office2Kの入力フィールド
CString strEditString = "あいうえお";
CString strTmp;
BYTE Hibyte,Lowbyte;
WORD word;
for(int i=0;i<strEditString.GetLength();i++){
  strTmp = strEditString.Mid(i, 2);
  Hibyte = BYTE(strTmp.GetAt(0));
  Lowbyte = BYTE(strTmp.GetAt(1));
  word = MAKEWORD(Lowbyte, Hibyte);
  ::PostMessage(hSendWnd, WM_IME_CHAR, word, 0x0001);
  i++;
}

762 名前:デフォルトの名無しさん :02/05/16 22:03
>>751
BSTRというのがあるけどunsigned shortでunicodeだなあ...


763 名前:デフォルトの名無しさん :02/05/16 23:41
chCharCode1 contains the lead byteとあるからHighとLowが逆のようなきが
する。

"あいうえお"はShiftJISのよな。
_T("あいうえお")をWin32Unicodeプロジェクトでコンパイルしないと
うんこーどにならんかたきがする。

764 名前:761 :02/05/17 15:17
コレで送れた〜。
LONG nData;
for(int nIndex=0;nIndex<strEditString.GetLength();nIndex++){
  nData = strEditString.GetAt(nIndex);
  nData &= 0x000000FF;
  ::PostMessage(hSendWnd, WM_CHAR, nData, 0x0001);
}
いじょ。報告だけ(^^;

765 名前:デフォルトの名無しさん :02/05/17 17:28
おめ

766 名前:デフォルトの名無しさん :02/05/17 17:44
VisualC++ 5.0で突然なぜかデバッグモードへ行けなくなりました。
・・・ので、再インストールしたんですが、状況は変わりません。
例えばデバッグの開始→ステップインを選んでも普通にプログラムが起動するだけだったり
ブレークポイントもお構い無しにプログラムは走り続けます。
原因はさっぱりわかりません。ヘルッミー!!

767 名前:デフォルトの名無しさん :02/05/17 18:41
実はVC自体がデバッグモードで起動していた。と言ってみるテスト
んぁわけないか・・・

768 名前:デフォルトの名無しさん :02/05/17 19:33
>>766
再インスコするときは、レジストリのキー(HKCU)を削除してからでないと、完全でない。

ってか、今の状態で、
HKEY_CURRENT_USER\Software\Microsoft\Devstudio
を削除したら治るかもよ。

769 名前:デフォルトの名無しさん :02/05/17 23:04
>>768
直りました。マリガトー

770 名前:デフォルトの名無しさん :02/05/18 14:23
えー、すばらしく初心者的な質問で申し訳ないのですが・・・

コンボボックスをリソースエディタでつくりまして
SendMessage(GetDlgItem(hWnd, IDC_COMBO), CB_INSERTSTRING, (WPARAM)i, (LPARAM)str);
で起動後複数個データを入れまます

コンボボックスで上下矢印キーを押すとたしかに入力されているのですが、
ドロップダウンをしてくれないのです
正確にはしてるようなのですが、1ドットくらいしか開いてくれないので選択できないのです

コンボボックスの下は充分に空いています
リソースエディタでコンボボックスのスタイルを「ドロップダウン」にしています

なにが足りないのでしょうか
猫プロなどだと、ただデータをSendMessageで足しているだけのようなのですが…

771 名前:デフォルトの名無しさん :02/05/18 14:33
あれ?
足しただけでしたにばーっと開かなかったっけ?

772 名前:デフォルトの名無しさん :02/05/18 14:37
>>770
リソースエディタでコンボボックスの矢印押して、出たサイズ変更枠を下に広げてみ。

773 名前:770 :02/05/18 14:43
>>772
ありがとうございました!
なるほど最初は重なっていて気づきませんでした

774 名前:デフォルトの名無しさん :02/05/18 23:06
Win NT4.0/Win 2000 上で動作している Windows アプリがあり、それに
対する操作をログに記録しようとしています。

例えばログイン画面があって、そこでログインボタンを押したときに、
ボタンを押した時間と、利用者が EDIT コントロールに入力した
ログイン ID を記録したいのです。

で、そのアプリとは別の監視アプリを VC++6 で作って、dll に
SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MyHookProc,hInst,NULL) として、
MyHookProc は

EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp){
  MSG *lpMsg;
  lpMsg = (MSG *)lp;
  if (nCode < 0) return CallNextHookEx(hHook, nCode, wp, lp);
  if ( lpMsg->message == WM_COMMAND ){

としました。この中でログを取ろうとしています。

しかし、ボタンを押したときに出る WM_COMMAND が届きません。ボタンのすぐ上に
ある (=ボタンと兄弟ウィンドウの) EDIT コントロールに何か書くとログに
残るので、大枠のところは間違っていないと思っています。また、Spy++ で見ると、
確かにボタンを押すと親ウィンドウに WM_COMMAND が飛んでいます。

どうやればボタンからの WM_COMMAND を取得できるのでしょうか? 取得できない
原因としては、メッセージを投げる方法には PostMessage とか SendMessage とか
いろいろあるようなので、EDIT とボタンのメッセージの投げ方が違うのかなぁと
思っているのですが (そのアプリは VB で作ってあります)。

あるいは WM_COMMAND を取得する以外の方法はありますでしょうか?


775 名前:デフォルトの名無しさん :02/05/18 23:46
>>774
WM_COMMAND はメッセージキューを通らず直接 SendMessage で送られるので、 WH_GETMESSAGE で捕まえられません。
WH_CALLWNDPROC でどうぞ。

776 名前:デフォルトの名無しさん :02/05/19 00:01
覗き見ツールの香りが...

777 名前:デフォルトの名無しさん :02/05/19 00:04
>>776
HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。

778 名前:デフォルトの名無しさん :02/05/19 02:17
>>775
ありがとうございます。明日会社で試してみます。

>>776
> 覗き見ツールの香りが...
各操作のどこでどれくらい時間がかかっているかを分析するための
生産性管理ツールです (いや、別に覗き見ツールでもいいんですけど)。

監視したいアプリは他社開発のもので、その会社はアプリの本体で
手一杯。ということで別アプリから監視することになりました。

>>777
> HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。
特定のスレッドだけ監視すれば? ってことですよね。まだデモプログラム
作成段階なので、とりあえず全メッセージ取ってます。


本業は UNIX 屋で、Windows で初めて作るプログラムがコレなので、
わからんことだらけですが、なかなか新鮮でおもしろいもんですね。
Hook という仕組みは UNIX にはないし、コントロールなんて高機能な
ものを OS が提供しているのも驚きです (ライブラリが提供している
ものだと思っていた)。


779 名前:774=778 :02/05/19 02:25
すいません、もう一つ教えてください。

>>775
> WM_COMMAND はメッセージキューを通らず直接 SendMessage で
> 送られるので、 WH_GETMESSAGE で捕まえられません。

↑こういうことってどこに書いてありますか? MSDN をいろいろ検索した
つもりなんですが、読んだ覚えがありません (というより WM_GETMESSAGE は
全てのメッセージを捕まえる、と書いてあったような)。

また、「このメッセージを捕まえたいときは WM_* をフックすればよい」
というメッセージの分類のようなものはどこかに書いてあるのでしょうか?

毎回掲示板で質問するのも御迷惑をおかけすることになりますので、
ぜひ情報元を教えて下さい (書籍でも構いません)。


780 名前:デフォルトの名無しさん :02/05/19 02:41
>ライブラリが提供しているものだと思っていた
そのとおりです。
USER32.dllというライブラリを標準としてMSが配布しているだけです。

781 名前:デフォルトの名無しさん :02/05/19 03:03
>>779
SetWindowsHookEx の WH_GETMESSAGE のところには
> Installs a hook procedure that monitors messages posted to a message queue.
「メッセージキューにポストされたメッセージをモニタする」と書いてあるので、メッセージキューにポストされないメッセージはモニタ出来ないと考えられます。

Windows のメッセージは PostMessage でメッセージキューにポストされるものと、SendMessage で直接ウィンドウプロシジャに送りつけられるものがあります。
例えば WM_MOUSEMOVE の説明を見ると
>The WM_MOUSEMOVE message is posted to a window when the cursor moves.
ポストされると書いてあるのに対し、WM_COMMAND は
>The WM_COMMAND message is sent when (以下略)
送られると書いてあるようなので、どちらか調べられるようです。

>また、「このメッセージを捕まえたいときは WM_* をフックすればよい」というメッセージの分類のようなものはどこかに書いてあるのでしょうか?

メッセージキューにポストされたメッセージも、メッセージループの DispatchMessage で結局ウィンドウプロシジャに渡される場合が多いので、WH_CALLWNDPROC でフックしとけば大抵のメッセージを監視できます。
具体的にどういう場合にどのメッセージを処理すれば良いのかについては・・・まぁ単純に暗記というか。経験とか勘とか、場合によっては調査が必要ですな。

>>780
OSと一緒に配布されてるし、OSが提供してるライブラリとも言えなくも

782 名前:デフォルトの名無しさん :02/05/19 03:05
監視目的ならWH_JOURNALRECORDでいいじゃん

783 名前:デフォルトの名無しさん :02/05/19 03:06
>>779
MSDNでSetWindowsHookExの所をみると、
各フックプロシージャの解説へのリンクがちゃんとあるなりよ。

784 名前:774 :02/05/19 14:01
 -SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MyHookProc,hInst,NULL)
 -MSG *lpMsg;
 -lpMsg = (MSG *)lp;
 +SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyHookProc,hInst,NULL)
 +CWPSTRUCT *lpCwp;
 +lpCwp = (CWPSTRUCT *)lp;
で できました。感謝!

>>780
> USER32.dllというライブラリを標準としてMSが配布しているだけです。
そうなんですか。よく考えると GUI の部品 (のフレームワーク) を
カーネルに含めるはずないですね。

>>781 >>783
なるほど。基礎知識不足で、マニュアルから読み取れていませんでした。

>>782
> 監視目的ならWH_JOURNALRECORDでいいじゃん
ほうほう! Windows にはこんなのがあるんですね。これはおもしろそうだ。

今回は監視というより統計を取るのが目的なので、結局メッセージを解析
しなければならないことには変わりないため、WH_CALLWNDPROC でいこうと
思います。しかし、どのデータについて統計処理するのかを後から (試行
錯誤しながら) 決めたい場合は、とりあえず WH_JOURNALRECORD で丸ごと
保存しておくのも有効なんでしょうね。


785 名前:デフォルトの名無しさん :02/05/19 17:32
My Documentsへのパスを取得するにはどうしたら良いですか?

786 名前:デフォルトの名無しさん :02/05/19 17:40
SHGetFolderPath

787 名前:デフォルトの名無しさん :02/05/19 17:40
>>785
SHGetSpecialFolderLocation

788 名前:デフォルトの名無しさん :02/05/19 22:07
>>785
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
…とか。


789 名前:デフォルトの名無しさん :02/05/19 23:59
>>788
それは最低・・・

790 名前:デフォルトの名無しさん :02/05/20 00:34
そんなもん、c:\my documents に決まってるだろヴォケ!


791 名前:デフォルトの名無しさん :02/05/20 06:14
決まってるわけあるかボケェ!うちは F:\Documents and Settings\Administrator\My Documents じゃあ!

792 名前:デフォルトの名無しさん :02/05/20 06:25
>>790
開発者なのに未だに Windows 9X だけ使ってますか?
それとも迷い込んだ単なるヨタか?

793 名前:デフォルトの名無しさん :02/05/20 08:24
>>792
ネタにマジレス。
・・・大丈夫か?


794 名前:デフォルトの名無しさん :02/05/20 09:05
ネタにマジレスもそうだが、>>792だと9x系なら
必ずc:\my documentsみたいな物言いだな。

795 名前:デフォルトの名無しさん :02/05/20 09:10
>>794
>そんなもん、c:\my documents に決まってるだろヴォケ!

これがネタだと気付いていないお前が問題。笑うところだよ。これ。

796 名前:794 :02/05/20 10:46
>>795
いや分かってるよ、オレが言いたいのは
792がネタにマジレスしている上間違ってるって事

797 名前:デフォルトの名無しさん :02/05/20 10:59
>>796
ごめん、同志よ。攻撃対象を間違ったようだ。


798 名前:デフォルトの名無しさん :02/05/20 13:36
>790
a:\my documentsをどうしてくれるッ!

799 名前:デフォルトの名無しさん :02/05/20 14:02
>>798
setup /at

800 名前:デフォルトの名無しさん :02/05/20 16:39
>>794
c:\my documents なら Windows 9X と
Windows 9X なら c:\my documents は違う。
彼の物言いからそう感じるとしたら君も人のことは言えない。

801 名前:デフォルトの名無しさん :02/05/20 16:47
冷静さを失っているのだろうか?
>>800の文章は変だ。

802 名前:デフォルトの名無しさん :02/05/20 16:50
へたクソな日本語ですね

803 名前:802 :02/05/20 16:50
>>800宛てね

804 名前:デフォルトの名無しさん :02/05/20 16:54
  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ・∀・) < お茶入りました
 (つ旦と)   \________
  と_)_)

805 名前:デフォルトの名無しさん :02/05/20 22:01
SHGetFolderPathってWindows95じゃ使えない。
ドキュメントには
Windows 95/98/Me: Requires Windows 95 or later.
って書いてあるのに。
これはドキュメントが間違ってるんだよね?

それと、特別なフォルダ名を取得するAPIでは
SHGetSpecialFolderLocationが一番汎用的ってことでいいですか?

806 名前:デフォルトの名無しさん :02/05/20 22:05
>>805
うぃ。

807 名前:805 :02/05/20 22:25
え、それだけ・・・。
なんか常識みたいですね。
SHGetFolderPathのヘルプは誤ってることを心に刻んでおきます。
そしてSHGetSpecialFolderLocationを使うようにします。
ありがとうございました。

808 名前:デフォルトの名無しさん :02/05/21 00:01
複数のスレッドから共有される関数の場合
ローカル変数はスレッド毎に用意される?
それとも一つの変数を同時に利用してぐっちゃぐちゃ?

809 名前:デフォルトの名無しさん :02/05/21 00:05
>>808
関数が使用するローカル変数(=自動変数)は
スレッド毎のスタックに置かれるので別々。

810 名前:デフォルトの名無しさん :02/05/21 00:05
>>808
関数によるんじゃない?
関数内にstatic変数があったりしたらアレだし。
リソースにアクセスするものなら排他制御は必須だし。

811 名前:デフォルトの名無しさん :02/05/21 00:07
>809-810
ありがとう。


812 名前:809 :02/05/21 00:28
>>810
(=自動変数)と注意書きした
ちゃんとよめ

813 名前:デフォルトの名無しさん :02/05/21 00:28
他のプログラムのエディットボックスのフォントを変えたい(大きく)のですが。
どうしたらよいでしょう?それっぽいメッセージとか見つかりません。。

814 名前:デフォルトの名無しさん :02/05/21 00:30
810は808にレスしているようにしか見えないが。

815 名前:809 :02/05/21 00:30
芯んでくる

816 名前:デフォルトの名無しさん :02/05/21 00:30
>>812
>>810>>808あてだと思われ
時間的にも>>809は読んでないかと

817 名前:デフォルトの名無しさん :02/05/21 00:31
>>812
>>810のポインタは>>809にはむいていない罠。
一分以内に3行に及ぶ反論が書けるわけがない罠。
ちゃんとよめ

818 名前:デフォルトの名無しさん :02/05/21 00:31
かぶりまくり

819 名前:  :02/05/21 00:32
>>815
イ`!

820 名前:デフォルトの名無しさん :02/05/21 00:33
      \
    (゚д゚) エンジョイプレイ! 漏れに免じて許せ
    <(  )
      < \

821 名前:デフォルトの名無しさん :02/05/21 00:34
>>820
じゃあお前がshine

822 名前:デフォルトの名無しさん :02/05/21 00:35
      ∧_∧
      /⌒ヽ )
     i三 ∪ イイダロウ・・・
      |三 |
     (/~∪  ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 

823 名前:デフォルトの名無しさん :02/05/21 00:35

          ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 

824 名前:shige :02/05/21 00:46
しげえええええええ

825 名前:in 地獄 :02/05/21 00:51
///////////////////
/////  \  ///////
///  (゚д゚) エンジョイプレイ!
///  <(  )   /////
///   < \  //////
////      //////

826 名前:デフォルトの名無しさん :02/05/21 18:14
>>805-807
おいおい誰もツッコミ入れてないのかよ…
SHGetFolderPathの
Windows 95/98/Me: Requires Windows 95 or later.
は間違ってるんじゃなくて、shfolder.dllを一緒に配布することを
前提にしてるだけ。

827 名前:デフォルトの名無しさん :02/05/21 18:36
HKCU\Control Panel\DesktopキーのMenuShowDelayの値は
レジストリから直接取得するしかないのでしょうか?
それともAPI経由で取得できますか?

828 名前:デフォルトの名無しさん :02/05/21 18:48
>>826
ナイスつっこみ

829 名前:デフォルトの名無しさん :02/05/21 18:59
>>827 SPI_GETMENUSHOWDELAY で取れるんでないかい

830 名前:デフォルトの名無しさん :02/05/22 01:45
TopDown-DIBの場合、SetDIBitsToDeviceの引数はどうなるのでしょうか?

例えば、大きさが 24x32 の TopDown-DIBの矩形(0,0)-(24,16)を
DC上の(X,Y)へ描画する場合。

SetDIBitsToDevice(DC,
 X,  // 転送先の長方形の左上隅のx座標
 Y,  // 転送先の長方形の左上隅のy座標
 24,  // 転送元の長方形の幅
 16,  // 転送元の長方形の高さ
 0,  // 転送元の長方形の左下隅のx座標
 31,  // 転送元の長方形の左下隅のy座標
 31,  // 配列内の最初の走査行
 16,  // 走査行の数
 Bits, Info, DIB_RGB_COLORS);

これだと、下半分が(X,Y)へ描画されました。

SetDIBitsToDevice
http://msdn.microsoft.com/library/en-us/gdi/bitmaps_8e5h.asp?frame=true
http://www.microsoft.com/JAPAN/developer/library/jpgdipf/_win32_setdibitstodevice.htm

831 名前:デフォルトの名無しさん :02/05/22 14:00
>>830
(0,0)-(24,16)なんだから左下隅の座標はボトムアップなら(0,16)
トップダウンなら(0,15)だろ。
どこから(0,31)なんて数字が出てきたんだよ。

832 名前:831 :02/05/22 14:02
走査行は全部で32しかないのに31行目から16行って指定も変だし。

833 名前:830 :02/05/22 23:33
>転送元の長方形の左下隅のy座標
なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
いろいろ試している内に混乱していました。

>配列内の最初の走査行
ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
そこから 16 行って思いました。

834 名前:デフォルトの名無しさん :02/05/23 00:19
>>833 トップダウンとかボトムアップとか考えずに出来なかったっけ。
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);
じゃだめ?

835 名前:833 :02/05/23 07:32
>>834
それだと下半分が表示されました。

836 名前:デフォルトの名無しさん :02/05/23 07:42
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 15, 0, 16, Bits, Info, DIB_RGB_COLORS);
だと一行しか表示されない。
あたかも 15 - 16 行目が表示されているよう。

837 名前:デフォルトの名無しさん :02/05/23 11:41
>>835 本当?俺試したら出来てる気がするけど・・・
     833が望むのとは何か違うのかな。

838 名前:デフォルトの名無しさん :02/05/23 14:52
ボトムアップってNTか9xどっちかしか使えないんじゃなかったか?

839 名前:デフォルトの名無しさん :02/05/23 15:41
データだけトップダウン形式で、ヘッダのbiHeightを負にしてなかったりして。

>>838 ボトムアップは標準でないかい

840 名前:デフォルトの名無しさん :02/05/23 20:50
ずっと前に試したとき、NTと9xで挙動が違ったという微かな記憶がある。確かな記憶じゃないんで、確認してみそ。

841 名前:デフォルトの名無しさん :02/05/23 21:10
でも、ほぼ全てのビットマップはボトムアップだと思うんじゃが。

842 名前:デフォルトの名無しさん :02/05/23 21:15
お〜じゃがじゃが〜♪

843 名前:デフォルトの名無しさん :02/05/23 23:38
おじゃまんがっ!!


844 名前:デフォルトの名無しさん :02/05/23 23:42
おおっ

845 名前:デフォルトの名無しさん :02/05/23 23:53
>>837
>>834のやり方だとトップダウンとボトムアップで下半分が表示されました。

そして、
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 15, 0, 32, Bits, Info, DIB_RGB_COLORS);

0,  // 転送元の長方形の左下隅のx座標
15,  // 転送元の長方形の左下隅のy座標
0,  // 配列内の最初の走査行
32,  // 走査行の数

で ボトムアップ、トップダウンにかかわらず、
24x32の画像の上半分(0,0)-(24,16)が表示されました。

>配列内の最初の走査行
は Bits が指すメモリブロックの最初の行、
(ボトムアップなら、31になる?)

>走査行の数
は Bits が指すメモリブロックの行数なのかな。

Windows95ですけど。

846 名前:デフォルトの名無しさん :02/05/24 00:13
>>845
>>839の件はどう?

847 名前:デフォルトの名無しさん :02/05/24 00:42
>SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);

Info.bmiHeader.biHeight > 0 の
ボトムアップ画像でも下半分が表示されるのですよ。

もし Bits にトップダウン画像へのメモリブロックが入っていたら、
上下逆に表示されるので解ります。

848 名前:デフォルトの名無しさん :02/05/24 11:59
> >転送元の長方形の左下隅のy座標
> なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
DIBと長方形を勝手に一緒にするなボケ。
お前は上半分だけを転送したいんだから転送元の長方形は
転送元の「DIBの上半分」、だからその一番下のy座標は15だろ。

> >配列内の最初の走査行
> ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
意味不明。最初の走査行って書いてるのにどうして最後の行になるんだ?
頭大丈夫か?

849 名前:デフォルトの名無しさん :02/05/24 12:01
>>845
ボトムアップのときは1ラインずれてるはず。

850 名前:831 :02/05/24 12:14
だからトップダウンなら(0, 15)ボトムアップなら(0, 16)
だと最初から言ってるのに。

走査行ってのは、メモリが少ないとき、

lpBitsに最初の16行ぶんを読み込み→走査行に0, 16を指定して転送→
lpBitsに残りの16行ぶんを読み込み→走査行に16, 16を指定して転送

みたいにすると、

lpBitsに全体を読み込み→走査行に0, 32を指定して転送

した場合と同じ結果になるからメモリが節約できる、というもの。

だから今ではよほどメモリが少ないとかよほど巨大なビットマップ
の印刷だとかでない限り深く考えずに常にビットマップ全体
(この場合なら0,32)でいいの。

851 名前:デフォルトの名無しさん :02/05/24 12:25
半分だから違いが1ラインしか出なくてわかりにくいんだよ。
3分の1にしてみろ。違いがはっきり分かるから

852 名前:デフォルトの名無しさん :02/05/25 00:01
FindFirstFileでフォルダ検索した結果、FILE_ATTRIBUTE_DIRECTORYを使って
フォルダを判定しようと思ったのですが、これだと特殊なシェルフォルダを認識できないようです。
例えば、FavoritesなどはFILE_ATTRIBUTE_DIRECTORYで判定対象にならないみたいなのです。
こういった特殊なフォルダも含めて、フォルダだけを抜き出すように判定したいのですが
どうしたら良いでしょうか?

853 名前:852 :02/05/25 00:07
すいません、今やってみたらちゃんと判定できました。

854 名前:830 :02/05/25 00:20
最後は 0,32 でいいと解ったけど、
転送元の長方形が解りません。

>転送元の長方形の左下隅のy座標
だから、ボトムアップ、トップダウンにかかわらず、
転送元の長方形が(0,0)-(24,16)なら 15、
転送元の長方形が(0,0)-(24,8)なら 7、
になるんじゃないんですか?

855 名前:デフォルトの名無しさん :02/05/25 00:39
Charles Petzold のプログラミングWindows 第5版(下)のP.583にこんな感じのコードがあるのですが、if文のところはif(a)..if(d)の間違いでしょうか?
著者のホームページにあるバグリストには特に何も書いてないんですが。
http://www.charlespetzold.com/pw5/pw5faq.html


a = malloc(100);
b = malloc(100);
c = malloc(100);
d = malloc(100);
if(!a || !b || !c || !d){
  if(!a) free(a);
  if(!b) free(b);
  if(!c) free(c);
  if(!d) free(d);
  //エラー処理//
}


856 名前:デフォルトの名無しさん :02/05/25 00:44
どうしようもないコードだな。
黙ってFreeすればいいだろうに。

857 名前:デフォルトの名無しさん :02/05/25 00:53
>>849
ずれていました。

転送元の長方形の左下隅のy座標=15だと、
(0,1)-(24,17)が転送されてました。

y座標=16 にしたら
(0,0)-(24,16)になりました。

でも、
y座標=8 で(0,0)-(24,8)が転送されません。
(0,8)-(24,24)が転送されているみたい。

で、
>転送元の長方形の左下隅のy座標
と言うのは、ボトムアップとトップダウンだと
違うのでしょうか?

>>848
>DIBと長方形を勝手に一緒にするなボケ。
が本当なら、一緒ではないでしょうか?

858 名前:デフォルトの名無しさん :02/05/25 01:38
>y座標=8 で(0,0)-(24,8)が転送されません。
>(0,8)-(24,24)が転送されているみたい。

さっきやってみたら違っていました。

SetDIBitsToDevice(DC, X, Y, 24, 8, 0, 8, 0, 32, BottomUpBits, BottomUpInfo, DIB_RGB_COLORS);
で (0,16)-(24,24)が転送されています。

859 名前:デフォルトの名無しさん :02/05/25 06:07
>>855
おぉ、確かに間違っているようですな。

860 名前:デフォルトの名無しさん :02/05/25 06:31
>>856
暗に「free(NULL) は無害」って言っているように見えるけど、
それってグローバルな規格になってます?
昔、free()にNULLを渡すと見事に凍り付いてたような記憶があって、
漏れもPetzoltみたいにチェック入れてるクチなんだけど。

あ、スレ違いスマソ

861 名前:デフォルトの名無しさん :02/05/25 06:49
ANSI準拠ならOK.

862 名前:デフォルトの名無しさん :02/05/25 08:27
直にfree呼ばずにsafe_freeとかにしとけばいいのに

863 名前:デフォルトの名無しさん :02/05/25 09:13
>>860条件式が間違ってるっていいたいだけだろ

864 名前:デフォルトの名無しさん :02/05/25 09:59
ウィンドウハンドル・メールスロットハンドル・コンピュータ名・押されているラジオボタンID をスレッドに
渡すんですが、構造体名はどうしたらよかとでしゅか?

865 名前:デフォルトの名無しさん :02/05/25 10:21
>>863
どこがだよ。 >>855>>856をちゃんと読んでるか?

866 名前:デフォルトの名無しさん :02/05/25 10:22
struct WINDOWHANDLE_MAILSLOTHANDLE_COMPUTERNAME_RADIOBUTTONID;
・・・長いな。目的がわからんから、なんとも。

867 名前:デフォルトの名無しさん :02/05/25 10:24
そういうときのためにHogeがあるじゃないか。

868 名前:デフォルトの名無しさん :02/05/25 10:31
>>865
>>855が言いたいことは、
a = malloc(100);
b = malloc(100);
if (a || b) {
 if (a) free(100);
 if (b) free(100);
}
こうじゃないの? って言いたいんだと思うけど、違うの?

869 名前:デフォルトの名無しさん :02/05/25 10:51
>>868
>>860の突っ込み先が>>856ではなくて855に見えるのかキミは。

870 名前:デフォルトの名無しさん :02/05/25 11:03
>>869
見えた、スマソ

871 名前:デフォルトの名無しさん :02/05/25 20:03
>>864
これで
boost::tuple<HWND, HANDLE, std::string, UINT>

872 名前:デフォルトの名無しさん :02/05/26 00:01
>>868
全ソースと説明を見ないと何とも言えない。
わざと変なコードを書いているのかもしれないし。

873 名前:デフォルトの名無しさん :02/05/26 11:14
mciSendStringというAPIを使って、VB上から音楽ファイルを
再生するプログラムを作っているんですが、
流れる音楽の音量を変えるにはどうしたらいいか分からないので
誰か教えてもらえませんか?

874 名前:デフォルトの名無しさん :02/05/26 11:25
ちょいと質問
IEのメニューとかでメニューアイテムをドラッグ出来て便利だけれど
あれはどのように実装されているんでしょうか?

875 名前:デフォルトの名無しさん :02/05/26 11:36
>>868
言いたいことはわかるけど、バグ作りこんでるぞ。
if (a || b) { は、if(!a || !b){ のままで、良いだろ。

876 名前:デフォルトの名無しさん :02/05/26 11:54
free(100); はいいのか?

877 名前:デフォルトの名無しさん :02/05/26 12:06
>>873
いやがる人もいるがmixer〜系APIを使うのが一番手頃

878 名前:873 :02/05/26 18:52
>>877
thx!
明日さっそく試してみます

879 名前:774 :02/05/27 10:57
774 です。別アプリに対する操作のロギングをするには、
 SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyHookProc,hInst,NULL)
でフックして、
 EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp){
  CWPSTRUCT *lpCwp;
  lpCwp = (CWPSTRUCT *)lp;
  if (nCode < 0) return CallNextHookEx(hHook, nCode, wp, lp);
  if ( lpCwp->message == WM_COMMAND ){
でメッセージをチェックすればよい、と教えていただきました。

しかし、マウスでボタンを押した場合はこれで OK なんですが、(TAB キーで)
ボタンにフォーカスを合わせ、Enter を押したときはメッセージが取得できません。
Spy++ で見ると、WM_COMMAND は発行されておらず、
 P message:0x100E [ユーザー定義:WM_USER+3086] wParam:0000000B lParam:00000000
というメッセージしか出ていないように見えます。

で、
 if ( lpCwp->message == WM_COMMAND || lpCwp->message == 0x100E ){
としてみたのですが、これでも Enter 押下時のメッセージは取れません。Enter 押下時
に発行されるメッセージを取得する方法をご存知の方、教えてください。

最悪 WH_KEYBOARD で取るしかないのでしょうか? (つくりが煩雑になりそうなので、
それは避けたいと思っています)


880 名前:デフォルトの名無しさん :02/05/27 10:59
WH_JOURNALRECORD

881 名前:774 :02/05/27 11:06
>>880
ありがとうございます。

WH_JOURNALRECORD については >>782 で教えていただいたのですが、
そのときは >>784 ということで、今回は WH_CALLWNDPROC と WM_COMMAND で
いこうと考えました。

それでもやはりこの場合は、WH_JOURNALRECORD を使う方がよいでしょうか。


882 名前:デフォルトの名無しさん :02/05/27 11:07
WH_DEBUGとかは?

883 名前:デフォルトの名無しさん :02/05/27 11:11
P は POST なんだろうからGETMESAGEでとれるんじゃないん?

884 名前:774 :02/05/27 12:53
>>883
WH_GETMESSAGE でいけました。

最初は WH_GETMESSAGE で WM_COMMAND を取ろうとしてうまくいかなくて
WH_CALLWNDPROC を使うことにしたのですが、結局 WH_GETMESSAGE に
戻ってしまいました。

そもそもの「WM_COMMAND を取る」という方針が間違っていたわけですね。

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


885 名前:デフォルトの名無しさん :02/05/27 22:45
故あってMFCは使ってないプログラムを作ってるのですが、
Webブラウザを起動して特定のURLにアクセスする処理を作りたいと
思っています。デフォルトのWebブラウザを起動する、又はデフォルト
のWebブラウザのフルパスを取得するAPIは存在するでしょうか?
もし、無いならレジストリからデフォルトのWebブラウザを識別する
にはどうすればよいでしょうか?

886 名前:デフォルトの名無しさん :02/05/27 22:49
ShellExecute(hWnd,NULL,"http://www.2ch.net/",NULL,NULL,SW_SHOWNORMAL);.


887 名前:885 :02/05/27 23:07
>>886
おお、すばやいレスありがとうございます。

888 名前:デフォルトの名無しさん :02/05/27 23:09
>>885
下の方はレジストリ検索すれば済む話だと思う。

889 名前:858 :02/05/28 03:19
上1/4を転送するにはどうすればいいのですか?

890 名前:デフォルトの名無しさん :02/05/29 01:31
描画の前にいちいちGetDCをやるのが面倒なので、CreateWindowの直後に静的なHDCにデバイスコンテキストハンドルを
コピーしてしまい、描画のときはこれを使うんですが、おかしな事になってます。
というのは、ある描画を境にそのデバイスコンテキストハンドルが無効?になるんです。もちろんそのデバイスコンテキストハンドルは
一切いじってません。DrawTextやStretchDIBitsなどでそのデバイスコンテキストハンドルを指定しても何も書いてくれないけれど、エラーも返りません。
そこで新たにGetDCで得たものを使うとばっちり描画されます。これはどういうことでごわすか。

891 名前:デフォルトの名無しさん :02/05/29 01:36
CS_OWNDC指定してるか?

892 名前:たま :02/05/29 05:38
長文失礼します。ご質問させてください。

現在、作成したバッチ変換のアプリケーションを使用すると、
タスクバー上に、空のタスクが作成されてしまう、という問題が発生しています。
上記問題を解決するための糸口を探しており、それに関する質問をさせていたきます。

まず、アプリケーションの詳細は、以下の通りです。
#-----------------------------------------------------
本アプリケーションは、バックグラウンドで、Excelシートを自動的に
FujiXerox社のDocuWorksフォーマットのファイルに変換することができる機能です。

本アプリケーションは、監視用サーバ(C++で作成)と
変換プログラム(VC++で作成)の二つによって構成されています。
サーバがある状態を受け取ると、変換プログラムを
バッチファイルを通して実行させる形で、変換処理を実現しています。

変換処理は、プログラム実行時に、自動的にExcelアプリケーションを起動し、
変換用プリンタドライバを通して印刷変換をかけるような流れとなっています。
(上記処理自体は、DocuWorksのカスタマイズ用API上で処理されます
 (Win32 APIのShellExecuteによって印刷指示されているそうです))

バッチ実行で変換処理が行われる度に、空のタスクが作成されます。
#-----------------------------------------------------

一般的に、空のタスクが作成されてしまう原因にどのようなものが有るのでしょうか?
また、その原因が上記機能のどの辺りに潜んでいると推測されますか?

お知恵を貸してください。よろしくお願いします m(_ _)m

893 名前:デフォルトの名無しさん :02/05/29 12:33
OSは何でしょうか?
空のタスクとはプロセスが終了してないということでしょうかね。
そのタスクはVC++付属のプロセスビューワで表示されますか?


894 名前:デフォルトの名無しさん :02/05/29 15:15
WM_QUERYCENTERWND について知りたいんだけど、MSDNに載ってません。
どういうものですか? ウィンドウの中心を返すとかかなぁ...

895 名前:デフォルトの名無しさん :02/05/29 15:17
なかなかレアなメッセージだね・・・・
http://www.google.co.jp/search?q=WM_QUERYCENTERWND&hl=ja&lr=&filter=0
たったの3件・・

896 名前:デフォルトの名無しさん :02/05/29 15:37
MFCの内部メッセージじゃねーか。
CWnd::CenterWindow()で親ウインドウにセンタリングを通知するためのものだな。
つーか、grepしる!

897 名前:894 :02/05/29 15:48
>>896
あ、ほんとうだ Σ(´Д`
Spy++でも思いっきり AFX/MFC にカテゴライズされてました。

898 名前:890 :02/05/29 22:28
>>891
CS_OWNDCについて調べてみたら解決しました。どうもありがとう。

899 名前:デフォルトの名無しさん :02/05/30 03:39
>>854 >>857
ボトムアップの原点は左下ときっぱりはっきり書いてるだろ
「原点」という言葉の意味はわかるか? わからないなら氏ね

900 名前:たま :02/05/30 07:21
OSは、Win NT 4.0 SP5です。(Excelは97です)
空のタスクとは、タスクバー上に無印のタスク(?)が残ったままとなっているものです。
タスクマネージャのプロセスには、変なものは残っていないみたいですが。
プロセスビューワは使ったことないです・・・。

その後、調査を進めたところ、変換APIを通してアプリケーションを起動し、
印刷変換処理を行うところで、APIがアプリケーションの終了を正しく
ハンドリングできていないため、発生しているものであることがわかりました。
API自体はFujiXerox社製のものであるため、そちらに問い合わせし、
対応を進めたいと思います。

901 名前:デフォルトの名無しさん :02/05/30 07:33
タスクバー上に空のボタンが残るのはタスクバーのバグだったような気も

902 名前:893 :02/05/30 12:38
>>900
Excelのファイルは複数シートになっていますか?
アプリケーションから変換する場合、1つの印刷ジョブの変換が終了した時点で
ファイルの変換が完了したと判断するため、複数のジョブに分けて印刷する
アプリケーションでは都合が悪い場合があります。
最初のジョブの変換が終わった時点ではまだExcelの印刷が終わってない
可能性も考えられます。

シートが1枚だけの場合でも空のタスクが残るとすると、また違う原因なのでしょうね。


903 名前:デフォルトの名無しさん :02/05/30 21:29
ただいま、デスクトップのデバイスコンテキストを取得して、
そのままドロ〜しているのですが、
画面を綺麗にするためにデスクトップ全体を再描画させたいのですが、
どのAPIを呼んだらよいのでしょうかねぇ?

904 名前:デフォルトの名無しさん :02/05/30 21:32
WM_PAINTをデスクトップにPOSTしたらだめなの?

905 名前:デフォルトの名無しさん :02/05/30 22:41
>903 InvalidateRectとか。
>904 相手が誰であろうとやっちゃダメ。

906 名前:デフォルトの名無しさん :02/05/30 22:53
905
そーなんだ。
ちゃんと条件を作ってRedrawWindowしなきゃだめなんだ。

907 名前:デフォルトの名無しさん :02/05/30 23:23
サウンドカードの名前を取るAPIって無いですか?
(ドライバ名?)
複数ある場合は複数取りたいです.
出来たらデバイス使用中でも取得できるとなおいいです.

908 名前:デフォルトの名無しさん :02/05/30 23:29
>>583にそれっぽい物が

909 名前:デフォルトの名無しさん :02/05/30 23:38
さんきうう >>908

910 名前:デフォルトの名無しさん :02/05/31 00:59
>>899

解りました。
原点が左下にあると、上1/4の矩形は(0,32)-(24,24)で、
BottomLeftは(0,24)になるんですね!

ボトムアップは解りましたが、トップダウンが解りません。
トップダウン(原点左上)の時、上1/4の矩形は(0,0)-(24,8)
ではないのでしょうか?

例えば、ウィンドウも左上が原点ですが、
大きさ 24x32 のウィンドウの上1/4の矩形は
(0,0)-(24,8)ですよね?

911 名前:903 :02/05/31 05:56
>>904-906
こんな早くレスもらっていたとは…。
気づかずスイマセンでした。m(;´Д`)m
UpdateWindw使ってみましたが駄目だったもので。
InvalidateRectですね。どうもありがとうございます。

912 名前:デフォルトの名無しさん :02/05/31 15:01
c:\ や、\\hoge\user\ が、自分のマシン内か、他のマシンへのネットワークパスなのかを
調べるにはどうしたらよいですか?
GetDriveType()は、物理メディアが自分のマシン上にあるパスでも、ネットワークドライブなら
DRIVE_REMOTE が返ってきてしまう...

913 名前:デフォルトの名無しさん :02/05/31 15:32
if ( WNetGetUniversalName( "N:", ・・・)== NO_ERROR )
あたりでは

914 名前:912 :02/05/31 16:12
>>913
\\自分\〜 だと NO_ERROR になる...
その場合(パスが \\から始まる場合)は、マシン名を取得して、区別するしかないのかなぁ。

915 名前:デフォルトの名無しさん :02/05/31 19:48
VBで作成されている画面が最小化されています。
これを、別のVB画面から最大化したいと思います。
最大化したい画面のPIDは別の処理ですでに取り出
しているので、このPIDを利用してウィンドウハン
ドルを取り出し、SendMessage しようと思ったの
ですが、PIDからウィンドウハンドルの取り出し方が
判りません。

とあるプロセスのPIDからウインドウハンドルって
取り出せるんでしょうか?

PIDとウィンドウハンドルの関係が判っていないので
頓珍漢な質問かもしれませんが、おながいします。

916 名前:デフォルトの名無しさん :02/05/31 20:02
>>915
PIDって言う表記、誤解を招くのでやめなさい。

917 名前:デフォルトの名無しさん :02/05/31 20:14
>>916
誤解以前にPIDの意味が分からん
プロセスIDかと妄想したが、プロセスのPIDなんて書き方もされてるし

918 名前:デフォルトの名無しさん :02/05/31 20:21
915 です。
タスクマネージャで見るとPIDってかいてあるぞ。
もしかして、正しくは、そのプロセス一番最初に作成
されたスレッドIDなのか?

漏れ、UNIXばっかなのでWinってよく
判らんのよ。

919 名前:デフォルトの名無しさん :02/05/31 20:46
とあるBBSで、現在表示中のウィンドウのウィンドウIDと
プロセスIDの一覧を表示するサンプル見つけたんだけど、
ウィンドウハンドルからプロセスIDは、GetWindowThreadProcessId
でとってました。
これの逆ってできないの?

だめなのか?もしかして。

920 名前:デフォルトの名無しさん :02/05/31 20:49
EnumWindows()とGetWindowThreadProcessId()で何とかしる

921 名前:デフォルトの名無しさん :02/05/31 20:50
>>915
そのプロセスがいくつもウィンド表示してたらどうします?

922 名前:デフォルトの名無しさん :02/05/31 20:59
スレッドのID取得してメッセージをPostすることはできます。
(Wndはプロセスじゃなくスレッドに関連ずけられている)
普通Wndのハンドル取得するときはFindWindow()つかうと思いますが。

923 名前:デフォルトの名無しさん :02/05/31 20:59
http://www30.cds.ne.jp/~yukinaka/eureka/library/articles/prog/sdktips006.html

924 名前:デフォルトの名無しさん :02/05/31 21:07
みなさん、THX
ぐるぐる探さないとだめなんだね。

プロセスIDとウィンドウハンドルって
Windowsのカーネルから見るとウィンドウハンドルの
ほうが低レベルなデータだってことになるのかな?

漏れ、UNIXメインでやってるからプロセスIDさえ判れば
そこから辿れると思ったんだけど、なんか違うみたいだね。




925 名前:デフォルトの名無しさん :02/05/31 21:10
>> 921
とりあえず、最大化するのはそのプロセスのウィンドウ
なら何でも良いので、取れたウィンドウに対して最大化
します。


926 名前:デフォルトの名無しさん :02/05/31 21:10
>>924
いや、プロセス→ウィンドウよりもウィンドウ→プロセスの変換をしたい場合の方が多いから、そういう形になっているだけかと。。。

927 名前:. :02/05/31 22:25
>>924 >>926
>>921を嫁や。
プロセスが保持しているウィンドウは1つとは限らないだろ。
あるウィンドウが属してるプロセスは一意なんだけどな。


928 名前:デフォルトの名無しさん :02/06/01 02:43
winInetを使ってます

newTimeout = (DWORD)300; //30秒に設定
isResult = InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,&newTimeout,sizeof(newTimeout));

ってな感じでタイムアウト値を設定したのですが
どうやったら本当に30秒に設定されているのか
試せるんだろう?と悩んでしまいました・・・・・・

質問1 何かタイムアウトの設定が反映されているのを
     きちんと知る方法は無いでしょうか?
     InternetQueryOption関数だけではなんか不安なんです。

というか、HTTPサーバーが返す408(Request Timeout)
というステータスコードですが、サーバーが
ステータスコードを返しているのにタイムアウトって
なんか腑に落ちないんですが・・・・
てっきりHTTPクライアント側で、リクエストを送ったあとに
○○秒サーバーから応答が帰ってこないので
タイムアウトだと判断しているもんだと思っていたのです。

質問2 自分が考えていたタイムアウトは間違いで
     やっぱりHTTPサーバーが返すもんなんでしょうか?


929 名前:デフォルトの名無しさん :02/06/01 03:02
DirectXでフルスクリーンにして終了させると、いままで開いていたウインドウが
フルスクリーン時の解像度になってしまうのだけど、これってどうすればいいのですか?


930 名前:デフォルトの名無しさん :02/06/01 04:37
なぜWin32APIスレで聞くんだろう・・

931 名前:デフォルトの名無しさん :02/06/01 06:13
あるダイアログでIMEを無効にしたくて
WM_INITDIALOGで
ImmAssociateContext(hWnd, NULL)
したんですけど、有効のままなのです。
どうやって無効にしたらいいのでしょうか?

932 名前:デフォルトの名無しさん :02/06/01 14:32
EditControlに対してやってみれば?

933 名前:デフォルトの名無しさん :02/06/01 17:47
これDo?
VK_PROCESSKEY: // IME抑制
HIMC hIme = ImmGetContext(ghApp); // IMEコンテキストの取得
if( ImmGetOpenStatus(hIme) ) // IMEが開いているかチェック
ImmSetOpenStatus(hIme,FALSE); // IMEを閉じる
ImmReleaseContext(ghApp,hIme); // IMEコンテキストの解放


934 名前:デフォルトの名無しさん :02/06/01 18:13
下の質問を「C言語ならおれに聞け」で聞いたらWin32スレへ行け、と
怒られました(w
で、質問です。
特定のキーが押された時間(時刻でも間隔でもいい)を記録するプログラムが
欲しくてがんばって作ってみましたが、DOS窓が非アクティブな状態になると
キーストロークを感知してくれません。
他の窓がアクティブになっているときも監視しつづけるようにするには
どうすればいいでしょうか?
“持っている”処理系はLsi試食版とVC++です。

935 名前:デフォルトの名無しさん :02/06/01 18:31
過去ログにあった気がする。
さかのぼってhookあたりをキーに検索すれ。

936 名前:935さんありがとう :02/06/01 19:21
えへ。
むずかしくてよくわかんないや。

937 名前:デフォルトの名無しさん :02/06/01 20:27
>>928
LANケーブルを抜く

938 名前:デフォルトの名無しさん :02/06/01 20:52
GDI+のAlphaBlend関数を使ってみたのですが、
背景にAlphaBlend()で小さめのビットマップを転送して
さらにその上に他のビットマップを転送すると色化けしてしまいました。
青の半透明の長方形を転送すると転送先の明るい部分が黄色くなってしまったり
するのですが、これはいったい何故なのでしょうか・・・・
あまり使われてない関数のようなので解説サイトが見つからず、
ここで訊こうと思いました。
もしよろしければアドバイスお願いしますー

939 名前:デフォルトの名無しさん :02/06/01 22:03
青は #0000FF、黄色は #FFFF00。どっかでデータが反転してるんでしょ。

940 名前:938 :02/06/01 22:52
あ、なるほど〜・・・・・そういえばそうですね
原因さっぱり思いつかないけど、とりあえず
転送順序を逆にしたり色々試してみます〜

941 名前:931 :02/06/02 06:42
>>933
おかげさまでできました。ありがとうデス

942 名前:デフォルトの名無しさん :02/06/02 15:50
Windowsの、とあるコマンドラインプロセスを実行したいのだけれど、
そのコマンドは実行終了までかかる時間がまちまちなのですが、
実行が終わるまで監視する真っ当な方法ってどうすればいいんでしょう?

WinExecを使うと勝手にタイムアウトする可能性があるので、
CreateProcessで立ち上げ、
while(GetExitCodeProcess(....),exitcode==STILL_ACTIVE)Sleep(100);
などを考えていますが、この方法が正しいのかどうかわかりません。

それと、コマンドラインの標準出力の内容を取りたいのですが、
(unixでいう、ls | myapp みたいな事です)
WindowsAPIで、自分の立ち上げたプロセスに対してこれをやるにはどうすればいいのでしょうか?

943 名前:デフォルトの名無しさん :02/06/02 15:55
>>942
CreateProcessで得たハンドルに対してWait〜Object(s)
コンソール取り込みはパイプでどうぞ

944 名前:デフォルトの名無しさん :02/06/02 16:00
別に924でも間違いでないけど、制御が返るのにタイムラグとループ処理があるので
WaitForSingleObject( プロセスのハンドル, INFINITE );
を使うと思う。

945 名前:デフォルトの名無しさん :02/06/02 16:21
>>943>>944
なるほど、ああいう関数はプロセスハンドルに対しても使えるのですね。
勉強になりました。

>>943
パイプは、自分で立ち上げたプロセスで取り込むことが出来ませんよね?
例えば vc が cl.exe の内容をメッセージに表示するのは、
パイプではないと思うのですが……

946 名前:デフォルトの名無しさん :02/06/02 16:23
>>945
名前なしパイプで検索かけろ

947 名前:デフォルトの名無しさん :02/06/02 16:29
>>946 thanks in advance

948 名前:デフォルトの名無しさん :02/06/03 19:38
バイトオーダを変換するAPIおしえてつかーさい

949 名前:デフォルトの名無しさん :02/06/03 19:41
htons/htonl/ntohs/ntohl

950 名前:デフォルトの名無しさん :02/06/03 19:44
Wait INFINITEはヨクナイトオモウ

951 名前:デフォルトの名無しさん :02/06/03 19:49
>>949
即レス感謝!

952 名前:デフォルトの名無しさん :02/06/03 20:51
GUIスレッドでやるのはよくないが、それ以外で
よくないと言う理由がこれといってみつからん

953 名前:デフォルトの名無しさん :02/06/03 22:46
DDK環境を使ってデバイスドライバの開発をしようと考えています。
で、そのドライバの内部からRPCを使いたいのですが
どういったAPIを使えばよいのでしょうか?
ソケットを扱うAPIは発見したんですが、
RPCを扱うためのものは見つかりませんでした。うーむ(´〜`)


954 名前:デフォルトの名無しさん :02/06/04 00:43
GetDriveType ってリムーバブルかどうかは分かりますが、FDDかどうかを知るには
どうしたら良いですか?

955 名前:デフォルトの名無しさん :02/06/04 00:50
総容量調べれば?

956 名前:954 :02/06/04 01:01
>955 やられた!

957 名前:954 :02/06/04 01:52
でも、ディスクが入っていないと判別できないという罠...
Googleったら、SHGetFileInfo の SHGFI_DISPLAYNAME で名前から判断する
というのもありましたね。

958 名前:デフォルトの名無しさん :02/06/04 09:55
>>954
ファイルシステムにアクセスを試みて、
戻り値(ガゴガゴという音)音を聞き分けて判断する

959 名前:デフォルトの名無しさん :02/06/04 17:33
OSのバージョンを取得するAPI教えてください。

960 名前:デフォルトの名無しさん :02/06/04 18:38
GetVersionEx

961 名前:デフォルトの名無しさん :02/06/05 00:55
メールサーバからメールのタイトルや送信者を調べて、
条件によって削除したいのですが、何を使うのがいいのでしょうか?
WinInetでは出来なさそうだし、
Telnetじゃカッコ悪いし。
何かいいのありませんか?


962 名前:デフォルトの名無しさん :02/06/05 00:56
>>961
スレ違い

963 名前:デフォルトの名無しさん :02/06/05 00:59
>>962
適当なスレがないのでここで勘弁願います。

Winsockで出来るのかな? でも面倒そう。

964 名前:デフォルトの名無しさん :02/06/05 01:05
ネットワークプログラミングスレは適当じゃないんか

965 名前:デフォルトの名無しさん :02/06/05 01:07
あーーーー。
ありました。
net や winsockで探したので引っ掛かりませんでした。

966 名前:超初心者 :02/06/05 17:58
チュートリアルのScribbleやってみてるヘタレです。
どうにも納得できないので、親切な人 教えてください。

MSDNライブラリーの次の個所です。
Visual C++ ユーザーズガイド
 Visual C++ チュートリアル
  Scribble: MDI描画アプリケーション
   印刷機能の強化
    Scribbleイメージの拡大
     Y軸の反転への対応

ビューにCScrollViewをつかっていて、マッピングモードをMM_TEXTからMM_LOENGLISHに
変更するとY座標が反転します。

これに対応するために、BoundingBoxを計算する時に
m_rectBounding.top = min(m_rectBounding.top, pt.y); ->max(...)
m_rectBounding.bottom = max(m_rectBounding.bottom, pt.y); ->min(...)
というのは判るんですが、

BoundingBoxを線の幅だけ膨らませる処理を
m_rectBounding.InflateRect(CSize(m_nPenWidth,m_PenWidth) ->InfrateRect(...,-(int)m_nPenWidth));
というのは正しいのでしょうか?

::InfrateRectの説明を読む限り負の数を指定した場合にはDeflateになってしまうと思うのですが…


967 名前:デフォルトの名無しさん :02/06/05 18:39
MFCスレで聞け。
http://pc.2ch.net/test/read.cgi/tech/1021620974/l50

968 名前:デフォルトの名無しさん :02/06/05 20:46
>>966
確認してないが
InfrateRectは
left -= dx, top -= dy, right += dx, bottom += dy;
じゃ無かろうか、
Rectのtopとbottomが逆転しているなら、拡大するためにはdyが負でなければいけない

969 名前:超初心者 :02/06/05 21:46
>968
なるほど、負の座標内での領域を拡大するには、負の値を渡すという事ですか。

>967
>MFCスレで聞け。
それも思ったんですが、CSizeはともかく本質的にInfrateRectの使い方なのでWin32の範囲かと

970 名前:967 :02/06/05 23:00
>>969
InflateRect()ってWin32APIにあるんだな。こんな関数使ったことも
なかったからMFCの機能かと思ってた。スマソ
で、ついでにAPIリファレンスで長方形の概要見てみたら

>長方形の座標の値は、 符号付き整数で表現します。
>長方形の右辺の座標値は、 左辺の座標値よりも大きくなければなりません。
>同様に、 下辺の座標値は上辺の座標値よりも大きくなければなりません。

とあるから、InflateRect()の説明がそうなっていてもおかしくはないと思う。

971 名前:デフォルトの名無しさん :02/06/06 16:43
Win95でIPアドレスを変更するAPI教えてください。

972 名前:デフォルトの名無しさん :02/06/06 16:50
>>971
ZeroMemory

973 名前:デフォルトの名無しさん :02/06/06 17:11
レジストリ(HKCR) に書き込み権があるかどうか調べるために
  HKEY hKey;
  BOOL readOnly =
   RegOpenKeyEx( HKEY_CLASSES_ROOT, NULL, 0, KEY_WRITE, &hKey ) != ERROR_SUCCESS;

とやったんですが、書き込み件がないユーザでも readOnlyが TRUE になりません。
実際にレジストリに書き込むことなく、アクセス権を調べるのってできないんでしょうか?

974 名前:デフォルトの名無しさん :02/06/06 17:40
>973
RegOpenKeyExの説明には、サブキーにNULLを指定すると、キーの新しいハンドルが開かれるとある。
この場合、HKEY_CLASSES_ROOTという仮想キーがそのまま返るんじゃないの? アクセスチェック無しに。
サブキーに"*"とか指定してみたら?


975 名前:初心者 :02/06/06 17:54
bmpとかでない16bits/pixelのロウイメージデータがあります。
表示するのに、次の手順で行ったところ、
1. CreateCompatibleBitmap()
2. BITMAPINFO型データの設定
3. SetBitmapBits()
4. CreateCompatibleDC()
5. SelectObject()
6. StretchBlt()
ディスプレイが16bitカラーモードの時には表示できましたが、32bitカラーだと化けます。
CreateCompatibleBitmapでスクリーン互換でつくってるんだから当然だなー、と思って
調べた挙げ句、
3. SetDIBits()
としたところ、16bit/32bit両方OKになりました。
が! 8bit(256色)だとヤッパリ化けます。
SetBitmapBitsの時とは異なり、イメージのサイズなどは正しく扱われてますが、
色がおかしい。適切に8bitのパレットのデータに変換されていないようです。

こんな時、どうしたらいいのでしょう? 親切な人おながいします。<(_ _)>


976 名前:973 :02/06/06 18:02
>>974
RegOpenKeyEx( HKEY_CLASSES_ROOT, "*", 〜
で試してみたんですが、同じ結果でした。

RegCreateKeyEx( HKEY_CLASSES_ROOT, "*", 〜
とやったら、うまくいったので、これで良しとすることにしますた。

977 名前:デフォルトの名無しさん :02/06/06 18:04
16/24bitビットマップを8bitディスプレイに表示するなら
ビットマップを236色まで減色するか
DCにハーフトーンパレット選択したら何とかなると思うが。

978 名前:デフォルトの名無しさん :02/06/06 18:20
今時のご時世なら8ビットディスプレイモードなんか切り捨てて
しまった方が色々と幸せだぞ。パレットの扱いなんて面倒だし。

979 名前:デフォルトの名無しさん :02/06/06 18:42
>>971
DHCP立てれ

980 名前:デフォルトの名無しさん :02/06/06 18:47
果たして、そういう問題なんだろうか。

981 名前:デフォルトの名無しさん :02/06/06 19:51
いっこうに新スレ作る動きがないのは何かの陰謀ですか

982 名前:デフォルトの名無しさん :02/06/06 19:57
>>981
ペンギンの陰謀です。

983 名前:デフォルトの名無しさん :02/06/06 20:02
>977
ハーフトンパレット選択というのは、SetStretchBltMode(hDC, HALFTONE)の事でしょうか?
やってみましたが、全然変わりませんでした。

>ビットマップを236色まで減色するか
そこまでしない方法を探しているのですが、やっぱりそれしかありませんか。

ペイントブラシでも同じように色が変わるので、よしとするか...

984 名前:デフォルトの名無しさん :02/06/06 20:07
>>983
CreateHalftonePalette()っつーのがあるが調べてみたか?
即レスで適当に書いてるから間違ってても関知しない。

ついでに新スレ
http://pc.2ch.net/test/read.cgi/tech/1023361418/l50

985 名前:デフォルトの名無しさん :02/06/06 20:14
ハーフトーンパレットより、自前で236色まで減色したほうが多少きれいにみえる。

パレットは↓(記憶に基づいてカキコしてるから間違ってかもしれん。サンプル
コード検索してちょ)
xxx::OnDraw(CDC* pDC){
CPalette pal;
pal.CreateHalftonePalette( pDC );
pDC->SelectPalette( & pal, TRUE );//background?
...
pDC->RealizePalette();
StretchDIBits();

986 名前:983 :02/06/06 21:38
ありがとうございました。
調べてみますです。

987 名前:デフォルトの名無しさん :02/06/07 00:42
>>976
HKEY_LOCAL_MACHINE\* がすでに存在するときERROR_ALREADY_EXISTS
が帰ってくる罠
つーか普通すでに存在するはずだが…
なにか根本的に間違えてないか?

988 名前:976 :02/06/07 02:28
>>987
・HKLMじゃなくて HKCR
・RegCreateKeyEx はキーがすでに存在するときは、ERROR_ALREADY_EXISTSではなく、
 キーが開かれてて ERROR_SUCCESS が返ってくる。
 |既存のキーであることは、lpdwDisposition に REG_OPENED_EXISTING_KEY が格納
 |されることで知ることが出来る。
・HKCR\* は(多分)必ず存在するので、書き込みモードで Create(実際は Openになる)
 し、ERROR_SUCCESSならば書き込み権があると判断する。失敗なら書き込み権なし。

Administratorだと成功して、Guestだと失敗になったのでOKとした、ということです。


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