Win32API質問箱 Build22

このエントリーをはてなブックマークに追加
ExitWindowsEx(EWX_SHUTDOWN,EWX_FORCE);
右クリックでディレクトリ構造をメニューで出すためにメニュー・サブメニューを動的に多数
つくりたいけど、やはり右クリックのタイミングに全部のメニューを作ってしまわないと
いけないんだろうか?なんか遅くなりそうな気がするんだけど、大丈夫ですか?
経験者アドバイスお願いします。
あらかじめ作っておいたものをキャッシュして持っておけば?
>>4
ポップアップメニューが表示されるときに、そのメニュー以下のメニューを作ればいいと思うけど。
>6 それだ!そうしたい。できるんだ?
で検索するとWM_MENUSELECT メッセージを発見
ありがとう。
あ WM_INITMENUPOPUPか。。まいいや
9 ◆Z0vd5w812U :04/08/16 14:56
ちとウィンドウリージョンについて質問です。
10fpsくらいでフレームごとにウィンドウリージョンを変形させたところ
すごいCPU負荷でした。元のウィンドウサイズは320x320くらいなのですが、
頻繁なリージョン変形をしても負荷を高めない方法ってあるのでしょうか?
>>9
LayeredWindow + αチャネルを使う
12誰にともなく:04/08/16 17:53
ExpandEnv(ry
なんて関数があったのか。はじめて知った
>>12
仕様によるがSHGetSpecialFolderPathもアリだね。
環境変数についてはたしかAdvancedWindowsに書いてるよな
>>12
ついでに誰へともなく書くけど、ExpandEnvironmentStrings はレジストリの
REG_EXPAND_SZ タイプとセットで覚えておくと吉だと思う。型のものは、環境変数が展開されることを期待しているから、
ExpandE略( で展開する必要がある。
>>15
ちゃんと編集してから書き込めよ、漏れ orz
っていうか %SystemRoot% とかって普通にどう処理してるのかとおもた。
リストボックスのLBN_SELCANCELって
MSDNライブラリでは「リスト ボックスの現在の選択項目がキャンセルされたとき。」
に送られると書いてありますが、具体的にどういう操作をした場合ですか?
選択項目が変わる直前に来るかと思っていたのですが、
違うみたいです。

LBN_SELCHANGEだと選択項目が変わったあとに通知されるので、
変わる前の状態が欲しかったのですが、
自分で、記録しておかないとダメですかね?
リストボックス上でボタンダウン
のまま何らかの原因でアクティブウィンドウが切り替わってしまった

てな時
2018:04/08/16 18:34
>>19
ありがとうございます。
なるほど、やっぱり自分で管理する部分を作らないとダメですね。
SELCHANGEがあるならSELCHANGINGがないのかな?
22 ◆Z0vd5w812U :04/08/16 19:01
>>10>>11
おおおー、レイヤードウィンドウか。こんな技もあったとは。THANX。
SetLayeredWindowAttributesとUpdateLayeredWindowの組み合わせでできるのね。
>>9 & >>22
OpenGLスレで質問してたひとですか?
24 ◆Z0vd5w812U :04/08/16 19:33
>>23
そうですよ。どうかしましたか?
モニタの省電力モードの実行状態を知るAPIってあるのでしょうか。
省電力モードの設定を知ることや、省電力モードに移行/復帰できるのは探し当てたのですが、実行状態を知るのは見つからなくて
SystemParametersInfoでSPI_GETLOWPOWERACTIVEとかダメ?
試してないけど。
>>26
設定を得ることができるだけのようです
WM_NOTIFY メッセージにおいて、wParam と、NMHDR構造体の idFrom が
違う値で送られてくることってありますか?
もしあるとすれば、例えばどのような場合でしょうか?
>>25
IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS
とかどうだろう?試してないけど。
>>28
つまり、自作のプログラムで違う値が送られてきたことがあった、と?
3128:04/08/17 01:14
>>30
いえ、自分で実験してみた限りでは同じ値が送られてくるんですが、WM_NOTIFY の説明によると
「wParam はユニークであることが保証されていないので、idFrom を使うべし」
というようなことが書いてあるので、もしかして何か違いがあるのかなと思いまして…。
違いは、idFormならユニークである事が保証されてるところだろ?
>>32
>>28読め
ずいぶん偉そうな催促だ
3528:04/08/17 02:55
>>32
確かに、idFrom の方を使っていれば何の問題もないということになりますが…。
wParam が使えないとすると、はじめから wParam は別の用途に割り当てておけば
よかったわけで…そう考えると本当は何か使い道があるんじゃないかと思いまして。
仮想リストビュー(LVS_OWNERDATA)を使ってテキストだけのレポート(LVS_REPORT)を作成しようとしています。
イメージを表示するつもりがないにもかかわらず、LVN_GETDISPINFOメッセージが
LVITEM構造体のmaskにLVIF_IMAGEがセットされた状態で送られてきてしまいます。
どのように対処するのが最も正当な手段と言えるでしょうか?
 (1) maskのLVIF_IMAGEをセットしないでLVN_GETDISPINFOを送らせる方法があるので、それを使う。
 (2) maskのLVIF_IMAGEを強制的にクリアして応答しても構わない。
 (3) iImageに特殊な値(-1とか)をセットして応答する。
 (4) その他。
いろいろ調べたのですが分かりませんでした。どうかご教示ください。
>>36
>イメージを表示するつもりがないにもかかわらず

ま、イメージを表示するつもりかどうかは誰にも分からないわけだし、表示できるように
マスクがセットされていると考えれば、(2) でいいんじゃないの >試してないけど
const int THREADS_COUNT = 10;
HANDLE start;

unsigned __stdcall proc(void*)
{
::WaitForSingleObject(start, INFINITE);
return 0;
}

int main(int argc, char* argv[])
{
start = ::CreateEvent(NULL, FALSE, FALSE, NULL);
assert( start );
HANDLE threads[THREADS_COUNT] = {0};
int i;

for(i = 0; i < THREADS_COUNT; ++i) {
threads[i] = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, proc, (void*)i, 0, 0));
assert( threads[i] );
}

::Sleep(10000);
for(i = 0; i < THREADS_COUNT; ++i) {
::SetEvent(start);
::Sleep(0); // <---------- ここ
}

for(i = 0; i < THREADS_COUNT; ++i) {
::WaitForSingleObject(threads[i], INFINITE);
::CloseHandle(threads[i]);
}
3938:04/08/17 11:49
VC++6.0SP6 Win2k Win32コンソールアプリ

メインはスレッドを10コ作りイベントを10回セットしスレッドの終了を待ち
スレッドはイベントがセットされたら終了するというものです。

正常に10コのスレッドが終了するのですが
コメントの::Sleep(0);を無効にすると1コのスレッドしか終了しません。
スレッド切り替えが起きずにSetEventが10回行われ
結局1回のSetEventと同等になってしまうということなのでしょうか?
これは仕様なのでしょうか?
4038:04/08/17 11:59
言い忘れましたが、テストした環境はシングルプロセッサです。
なんか違和感のあるソース・・・何か変なんだけど、わからん。
Sleepが無い場合mainが一回のタイムスライスで10回イベントセットするからだろ。
アホか。
>>42
スレッドの最後にOutpuDebugStringを入れてみたら、確かに1コしか解放されてませんでした。
で、疑問なのですが自動リセットイベントの場合
SetEventは待ちスレッドがあった場合それを解放してイベントを非シグナル状態にする
とMSDNには書いてあります。

上記のプログラムでは待ちスレッドが10コあるため
SetEvent->イベントシグナル->スレッド解放->非シグナル
が10回繰り返されると思ったのですが…
いったいどのタイミングでスレッドは解放されるのでしょうか?
>>43
煽られて感情高ぶってるのはわかるけど、
知ったところで意味のない質問はしない方がいいよ。
プラットホームで変わるかもしれないし。
>>39
>The state of an auto-reset event object remains signaled until a single waiting thread is released,
>at which time the system automatically sets the state to nonsignaled.
- Microsoft Platform SDK Document "SetEvent"

待機中のスレッドが何時リリースされるかについては触れられていないのがポイントっぽいですね。
実際にリリースされるまでの間は、単にイベントがシグナル状態にあるだけで、

>Setting an event that is already set has no effect.
となってしまう。
auto reset event の場合ですけど、

誤>SetEventは待ちスレッドがあった場合それを解放してイベントを非シグナル状態にする
正>SetEventはイベントをシグナル状態にする。待機中のスレッドが一つ開放されるとイベントは自動的に非シグナル状態になる。

待機中のスレッドがリリースされる前に制御は戻ってきますよ。
>>43
>いったいどのタイミングでスレッドは解放されるのでしょうか?
そりゃ、スレッドの待機が解除されたら・・・だろ?

で、スレッドの待機が解除されるには、
そのスレッドが実行されなければいけない

Sleep(0)で明示的にタイムスライスを放棄すれば、
上手く行くんだから明らかだろ?

なんだったら、作成したスレッドの優先度を上げて見たら?
>>29
hDeviceを得るためにCreateFileを使おうと思いましたが
CRTディスプレイに該当するlpFileNameの文字列が分かりません
4938:04/08/17 14:20
>>44-47
ありがとうございました。
なぜこの疑問が浮かんだかというと、
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndllpro/html/msdn_metrsect.asp
のメータードセクションを試しに作ってみて上手くいかず原因をさぐってみたところ

LeaveMeteredSectionの
for (iCount=0; iCount < lReleaseCount ; iCount++)
{
lpMetSect->lpSharedInfo->lThreadsWaiting--;
SetEvent(lpMetSect->hEvent);
}

で必要分スレッドがリリースされてなかったからです。(Sleep(0)を入れて解決しました)
5038:04/08/17 14:38
何度も申し訳ない。
>>38 で名前付きイベントを使いメインとスレッドの処理を別プロセスで動かしたところ
Sleep(0)を入れなくてもスレッド10コ分リリースされました。
これはたまたまなんでしょうか…
趣味でWindowsプログラム7年やってますが、同期オブジェクトの扱い方がわからなくなってきました…
51デフォルトの名無しさん:04/08/17 15:44
”コマンドプロンプト”用のプログラムの標準入出力を
GUI(画面)に表示するプログラムがありますが、
あれはどうやって作るんでしょうか。
5236:04/08/17 15:50
>>37
> マスクがセットされていると考えれば、(2) でいいんじゃないの >試してないけど

うちの環境(XP)で (2) が使えることは確認していたのですが、他の環境でもうまくいくとは
限りませんし、(1) の見落としの可能性もあったので一応質問させていただいた次第です。
お返事、どうもありがとうございました。
53デフォルトの名無しさん:04/08/17 15:51
パイプでぐぐれ
ウインドウサイズ変更出来ないようにするにはどすればいいの?
>>54
WM_GETMINMAXINFOを処理しる
~WS_THICKFRAME
57デフォルトの名無しさん:04/08/17 18:48
>>54
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
winampのように動かしながら画面吸着させたいんですが、
WM_MOVINGでparamから位置をもらいながら位置判定して、movewindowしてるんですが、
それだと頻繁に、通常のウィンドウ動かしたときのような点線枠が変な風に(びよ〜んと伸びる)表示されてしまいます。
どうすればWinampみたいな動きが実現できるのでしょうか?
ドラッグ処理を全部自前でやればどうとでもなる。
>>58
WM_WINDOWPOSCHANGING
>>54,57
出来ました。サンクスコ
>>57で簡単に出来たけど>>54の方でやるメリットと言うか
違いって何かあるんですかね。
>>54は質問のようだが
スマヌ
>>55>>57だった
>>55だと縦方向だけ変えたくないとかを柔軟に処理できる
>>57だと枠線がサイズ変更できないウィンドウ標準のものになる
(95以降は区別が付きにくいけど)
>>51
コンソールを開く
WM_MOUSEMOVEにX = LOWORD(lParam);でX座標取得して、
SetCapture()でキャプチャーしてるんですけど、ウインドウの右側はみ出た場合は
数値がそのまま増えていくんですけど、左から出た時は0の左が65535になって左に
行けば行くほど数値が低くなるんですけど、何で65535なんて数値になるんでしょう?
67デフォルトの名無しさん:04/08/17 22:23
 

「ひろゆき」から「今晩のおかず」までを手広くカバーする巨大掲示板群
             『3ちゃんねる』へようこそ!

                   ▲▲
                  ( ・3・) <見に来てね
                  (|.   .|)   
                   |. ω |       
                   ∪ ∪
           3ちゃんねるイメージキャラクター
              「3チコ (さんちこ)」
          
              http://www.3ch.jp/   
>>66
signed, unsigned について説明してみろ
70デフォルトの名無しさん:04/08/17 22:34
>>69
signed   符号付き
unsigned  符号無し
ですか?
WORD が無符号整数型だから負数を表現できないんだよ。
いったん short にキャストしてから int なり何なりに代入汁。
>>66
左端から出たら、どんな数値になって欲しいのさ?
WORD型ってのはunsigned shortだから0から65535までしか表せなくて
-1じゃなくて65535になってしまうってことですか。

>>71
どうも有り難うございます。
SetLayeredWindowAttributes使いたいんですが、
windows.hだけではダメなんですか?
いちおう
#define _WIN32_WINNT 0x0500
これもしたんですが、定義されてないとエラーが出てしまいます
つーか専用のマクロあるんだから使え
GET_X_LPARAM
>>74
includeディレクトリをgrepして、無ければPlatformSDKをゲット
PlatformSDKのinclude内のWinUser.h内にみつけましたが、
そのフォルダ、ディレクトリ設定のインクルードファイルの欄にちゃんと入ってます…
>>77
#ifディレクティブに注意
#define _WIN32_WINNT 0x0500
これかいててもダメですね…
検索かけたらみんなこれで解決してるのに…
Platform SDKのinclude・libフォルダ設定を一番上にしたらいけました…
ぬっ殺す
いくら使わせたくないからって
winternl.hのプロトタイプ宣言が間違ってるのってどうよ
レジストリキーの変更をしたいのですが、キーを変更するAPIが見つかりません。
削除して新たに作成するしかないのでしょうか?
84デフォルトの名無しさん:04/08/18 15:21
ローカルシステムアカウントで実行しているプロセスから、
IEを起動すると最初一回だけ、「インターネット接続ウィザード」が表示されてしまいます。
これを回避したいのですが、どうすればよいでしょうか。
お知恵をお貸しください。
85C言語初心者:04/08/18 15:51
ウイルスの作り方を教えてくdさい!!!!
CreateVirusEx()
CreateViruSEX()
88sage:04/08/18 16:42
>>86-87
ありがとうございます!!!!
でもどうやって使えばいいんですか??
教えてくださいお願いします!!!!
int main()
{
 HSEX sex = CreateViruSEX();
 RunViruSEX(sex, "立ちバック");

 return 0;
}
>>83
RegSetValueEx でいけなかったっけ?
値の変更はできるけど、キーの変更はできないよ。
>>89
RunViruSEXが0をFALSEを返します!!!!
GetLastError()の戻り値は5でした!!!!
何故ですか????
93C言語初心者:04/08/18 18:35
>>92
僕のまねをしないでください!!!
なんでみんな真面目に答えてくれないんですか???・
DeleteObject((HGDIOBJ)"C言語初心者");
>>89
main(int) { CreateViruSEX; return } << "立ちバック"
こうですか?わかりません。
>>92

/*
  HPENIS GetPenisHandle(
    LPCTSTR HumanName // 所有者名
  );

  LONG SetPenisLong(
    HPENIS hPenis, // ペニスのハンドル
    int nIndex, // 設定する値のオフセット
    LONG dwNewLong // 新しい値
  );

  HADLITM GetStockItem(
    int fnItem // ストックアイテムのタイプ
  );
*/

SetPenisLong(GetPenisHandle(NULL), SPL_CONDOM, (LONG)(HCONDOM)GetStockItem(WARTY_CONDOM));
>>93
皆が真面目に答えないのはウィルス作成に米国家の専門資格が必要だから。
それで初心者を名乗るお前は絶対持っていないだろうと皆が思っているから。
>>93
真面目に答えて欲しければ、質問を変えた方がいいと思うよ。
誰もウイルス作成の手助けなんかしたくない。スレ違いのような気もするし。
99デフォルトの名無しさん:04/08/18 19:20
>>97-98
そんなとこで釣られるn(ry
つーかまずローカルルール読め低脳
>>92
おまえ童貞だろ。なら当然FALSEが返る。
102デフォルトの名無しさん:04/08/18 23:54
質問です.宜しくお願いします!

win32 console で,stdin にインプットがあるかどうかを調べるには
どうすればよいのでしょうか? unix 系の環境での select() 関数の
ようなものを探しています.今のところ _kbhit() を使用していますが,
標準入力がキーボードの時しか上手く働いてくれません...
selectで良いと思いますが・・・
ダイアログボックスの中にテキストボックスがある時、
そのテキストボックスにキーボードフォーカスを移すには
どうすればいいんですか?
雪兎不応粕
ダイアログボックス上ということであれば
WM_NEXTDLGCTLの使用を推奨したい。
>>103
winじゃselectはsocketにしか使えませんが?
108デフォルトの名無しさん:04/08/19 01:43
質問です。

プログラムから、そのプログラム自身を実行した時の CreateProcess API の
各引数を調べる方法はあるのでしょうか?
その辺を多少調べたけれどわからんかったので教えていただければ嬉しいです。
ヒントとなるキーワードやAPI名でもいいんで教えてくださいエロい人。
109デフォルトの名無しさん:04/08/19 01:45
>>107
ネタにマジレスするな
>>109ネタ解答は迷惑なので他所でやってください
111104:04/08/19 02:23
>>106
普通にGetDlgItemでできましたけどね……。
>>108
CreateProcess索いて、See Alsoをざっと見てみた。
GetCommandLine, GetEnvironmentStrings, GetStarupInfoあたりが使えそうだな。

>>111
ボタンに黒枠が残っても気にしないのならそれで問題ない。
>>102
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)とか?
入力ハンドルがコンソールじゃなかった場合にWaitFor〜していいのかちょっと怪しいが
114102:04/08/19 03:27
>>113

解決しました!
ありがとうございました.
115115:04/08/19 05:16
あるアプリのクライアント領域の描写を右に100ピクセルずらすDLLをつくっているのですがうまくいきません
DLLはプラグインとしてアプリからロード,実行されアプリのWindowProcをSetWindowLongPtrで書き換えて
自分のProcが呼ばれるところまではうまくいきました
実際にずらす処理は
if(msg==WM_PAINT)
{
  HDC hdc = BeginPaint(hwnd, &ps);
  InvalidateRect(hwnd, &ps.rcPaint, ps.fErase);
  SetGraphicsMode(hdc, GM_ADVANCED);
  XFORM xnew, xlast;
  GetWorldTransform(hdc, &xlast);
  xnew.eM11 = 1;xnew.eM12= 0;
  xnew.eM21 = 0;xnew.eM22= 1;
  xnew.eDx = 100;xnew.eDy= 0;
  SetWorldTransform(hdc, &xnew);
  LRESULT result = CallWindowProc(g_DefProc, hwnd, msg, wp, lp);
 
  //ためしに変数helloの文字列を0,0に描写
  TextOut(hdc, 0, 0, hello, wcslen(hello));
  SetWorldTransform(hdc, &xlast);
  SetGraphicsMode(hdc, GM_COMPATIBLE);
  EndPaint(hwnd, &ps);
  return result;
}
116115:04/08/19 05:17
だいたいこんな感じのを自分のProcでやっているのですが変数helloの文字は確かに右にずれて描写されるのですが
アプリによってのほうは,今までのままです.原因はSetWorldTransformを適用してるHDCとアプリが実際使ってるHDCが
異なっているためだと思うのですが,ずらす系(?)API(SetWorldTransformとOffsetViewportOrgEx)の両方とも
引数としてHDCをとるため事前にアプリが使用するHDCを固定するかでもしないとなりません.そのようなことは可能ですか?
もしくは,ずらす系APIの引数がHWND版みたいなものはないでしょうか?
長文になってしまい,まことに申し訳ないのですがよろしくおねがいします
117115:04/08/19 05:59
BeginPaintとEndPaintを置き換えるやり方を見つけたのですが
ttp://www.fengyuan.com/article/wmprint.html
ちょっと複雑そうなのでSetWorldTransformなどのずらす系APIのHWND版を
教えていただく方向でお願いします.図図しくてすみません
DLL側ではBeginPaintとEndPaintは使わない方がいいんじゃない?
GetDC(hWnd)で取れるよ。
119115:04/08/19 06:37
>>118
BeginPaintをGetDCに,EndPaintをReleaseDCに書き換えてみましたがだめでした
ずらしたあとにアプリ側の再描画で元に戻されてるのでは?
121115:04/08/19 06:51
>>120
自分のイメージ的にはSetWorldTransform(hdc, &xnew)でかってに右に移動しちゃう行列が
適用されて,その後のSetWorldTransform(hdc, &xlast)がよばれるまでの間に呼び出された
CallWindowProc(g_DefProc, hwnd, msg, wp, lp);によってアプリ側には,ずれてることすらわからないはずみたいな感じなのですが
WM_PAINT以外で元に戻されるということでしょうか?
あらかじめ SetGraphicsMode 関数を呼び出して、指定したデバイスコンテキストのグラフィックスモードを GM_ADVANCED に設定しておかなければ、SetWorldTransform 関数は失敗します。
123115:04/08/19 07:14
WM_ERASEBKGNDで送られてくるHDCを引数としてSetWorldTransformを呼び出すことで
アプリ側が描写したものに対しても100ピクセルずらすことができました.OffsetViewportOrgExでも大丈夫でした
 
>>122
いちおう115のソースの5行目で呼び出してます
 
回答していただきました皆様ありがとうございました
Spy++みたいにほかのウィンドウのメッセージを取得したいのですが
どうやればいいのでしょうか?
グローバルフックをインスコ
>>125
こんな便利なものがあるなんて知りませんでした。
ありがとうございした。
C++からWin32API使いたいんだけど、いちいちWrapperクラスなんか作らないとダメかな?
>>127
C++に対する理解が足りないのでは
そうした方が便利なら。
130127:04/08/19 15:18
結局MFCやれってことになるのかな?

MFC >>>>>>>>> 自作Win32API wrapper

ってこと?
は?
どこからそういう結論が出るんだヴォケ
まだまだ、残暑が続くからな。
変なやつの相手すんなって。
133127:04/08/19 15:40
このスレの住人て民度が低いね。(プ
>>133
民度という用語に対する理解が足りないのでは

それはともかく、C++のソースからでもWin32APIの呼び出しはできるでしょ?
呼び出しをクラスメソッドにするかどうかは設計者であるアナタ次第。
というわけでスレ違い。
近頃どのスレでも>>133みたいなのを見かける。
> 近頃どのスレでも>>133みたいなのを見かける。
自分で作った Thread に>>133みたいなのが居るのを想像してしまった。orz
ウィンドウズOSのコモンツールバー実装方法に疑問を感じる。
実装が自己矛盾に満ちている。
以降、肛門ネタ禁止
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\

DWORD size;

size = GetFileSize(GetStdHandle(STD_INPUT_HANDLE));



上の方法で標準入力に何バイト溜まっているかを取得できますか?
ぼくの肛門にも何バイトか溜まっているようです
>>141
http://msdn.microsoft.com/library/en-us/fileio/base/getfilesize.asp
> You cannot use the GetFileSize function with a handle of a
> nonseeking device such as a pipe or a communications device.
>>143
読み落としていました。

標準入力に何バイト溜まっているかを取得する方法はありませんか?
全部読まないとわからないのでしょうか?
>>144
>標準入力に何バイト溜まっているかを取得する方法はありませんか?
ありません。

>全部読まないとわからないのでしょうか?
「全部」の意味によりますが、そんな感じです。
146141 == 144 == 146:04/08/19 19:31
>>145
thx!
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
馬鹿127が荒らしてる
151127:04/08/19 22:53
>>150
おれじゃねーよヴァカ
152127:04/08/19 23:23
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < sageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \_________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
CreateFileで作成したファイルをメモリマップドファイルを用いずに
行単位で入力する方法を探しています。
C言語のfgetsに相当する関数は無いのでしょうか?
また、自作するにはどうしたらよろしいでしょうか?
>>153
精進が足りんな。
API直叩きにはスキル無さ杉。
まずバッファリングのやり方、勉強汁!
嫌なら素直にランタイム使っとけ。
155デフォルトの名無しさん:04/08/20 00:38
>>110
なんで俺に言うんだよ。>>103に言えよ。
156デフォルトの名無しさん:04/08/20 00:47
CreateWindowExで作ったエディットコントロールの…
 ・フォントのサイズ変更、
 ・フォントの種類変更、
 ・フォントの色変更、
 ・背景色変更、
 ・半透明化、
の仕方が分かりません。

リッチエディットまではいかなくてもWindows付属のメモ帳くらい変更したいのですが。

半透明化については、
SetLayeredWindowAttributes関数でできるかと思ったのですが、
ウィンドウ全体の半透明化はできてもエディットコントロールの変更は無理のようです
(エディットコントロールに同じことをするとエディットコントロール自体が消えます)

分かる方よろしくお願いします。
>>156
子ウィンドウはレイヤードウィンドウにできないはず。
WS_CHILD外して貼り付けたいウィンドウにあわせて移動。
XPや2000におけるHTMLでのボタンのような外観にはどうやったらできるんですか?
>>159
そうですか
161デフォルトの名無しさん:04/08/20 01:55
>>160
カスが
163156:04/08/20 02:03
ありがとうございます。

>>157
なるほど、それでできなかったんですね。

>>158
WS_CHILDを外してみましたが
何も変わりませんでした・・・
エディットコントロール作成時に、親ウィンドウのハンドルのところをNULLにもしてみたりしたんですが。
>>163
エディットコントロールと同じ大きさの枠無し窓でも作ればいいんじゃないかな
>>156
今や不評ですが、「猫でもわかる...」に例があったような。
半透明化はやっていませんが、他は、私は猫のお陰でやっています。
166デフォルトの名無しさん:04/08/20 10:41
ユーザー名とドメイン名からそのユーザーがlogonしているかどうかを
知りたいのですが、そのようなAPIはありませんでしょうか?

現在logonしているユーザーのリストを取得できる関数がないかなと
思っているのですが…
>>156
ボタンをサブクラス化。
バックバッファを作り、WM_PAINTで元のボタンにWM_PRINT送って描画してもらう。
背景と重ね合わせる。

でどお?
>>156

WM_SETFONT でフォントのセット、背景色は WM_CTLCOLOREDIT への応答で
170デフォルトの名無しさん:04/08/21 02:32
HWNDに対応したキャレットの幅と高さを調べられるAPIはありますか?
メニューが複数行表示されているか、どうやったら調べられますか?
またウィンドウの幅がどれくらい縮んだらメニューが折り返されるか調べる方法はありませんでしょうか?
現在のタスクバーの高さを一発で求める API はなんでしょうか。
MSDN で探すのは TASKBAR とかでは駄目で、他の用語があるんでしょうか。
タスクマネージャのように
プロセスごとの、ユーザー名、CPU、メモリ使用量を取得するには
どのようにすればよいのでしょうか
>>172
タスクバーが左右に縦に表示されている場合でも"高さ"が欲しいのか?

なんとなくSystemParametersInfo(SPI_GETWORKAREA, ...)とかGetMonitorInfo()で
取得できるワークエリアが必要な気もするが。
>>173
PSAPI
177172:04/08/21 23:47
>>174, >>175
どうもありがとうございます。
高さってのは軽率でした。screen から workarea を引くしかないんですね。
178デフォルトの名無しさん:04/08/22 07:14
メニューにチェック形式のアイテムをもたせるにはどうすればいいんですか?
ある意味では、すべてのMENUITEMはチェック形式であるといってもいいね。
>>179がなんか言い出したぞ。
>>178
CheckMenuItem()じゃない?

いやまて、そんな単純な質問ではないのか?
>>181
うん。皆、その裏が読めなくて答えられないのだよ。
183170:04/08/22 14:53
マダー?
>>183
ざっとみたかんじ、そんなAPIはなさげです
ListView_SortItemsを使ってリストビューをソートしようと思ったのですが、
何故か出来ません。


int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);


この比較関数の引数のlParam1とlParam2の値が、常に0です。
リストビューには数百ぐらいいれているのですが
CreateDIBSectionとmemcpyとかを使ってペイントソフトみたいの作れって言われたんだけどさっぱり分からん!
どこか解説ページとかない?

CreateDIBSectionの意味すら今一分かんないorz
187デフォルトの名無しさん:04/08/22 15:39
まずググれ
>>186
CreateDIBSectionとmemcpyについて解説してあげてもいいけど、
ペイントソフト作るのってその二つ理解するよりはるかに難易度高いから
そのくらい自分で調べた方が良いよ。
>>185
そのソースさらしてよ、でなきゃ原因はわからんです。

ListView_SortItemsの使い方だったら、ググれば
たくさん出てくる。
191185:04/08/22 17:06
猫を参考にしています。

HWND hList;//リストビューのハンドルを入れてあるグローバル変数

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
  static LV_FINDINFO lvf ;
  static int item1, item2 ;
  static char buf1[512] , buf2[512] ;
  lvf.flags = LVFI_PARAM ;  lvf.lParam = lParam1 ;

  item1 = ListView_FindItem(hList, -1, &lvf) ;
  lvf.lParam = lParam2 ;
  item2 = ListView_FindItem(hList, -1, &lvf) ;
  ListView_GetItemText(hList, item1, (int)lParamSort, buf1, sizeof(buf2));
  ListView_GetItemText(hList, item2, (int)lParamSort, buf2, sizeof(buf2));
  return strcmp(buf1, buf2);
}

呼び出すのはこうやってます。

  NMLISTVIEW pNMlist = (NMLISTVIEW *)lParam ;
  ListView_SortItems(hList, CompareFunc, pNMlist->iSubItem);

リストビューのウインドウハンドル、hListは確かに存在します。
実験的に、ListView_SortItems()の前にIsWindow()をやって確かめました。
192185:04/08/22 17:15
すみません。ちょっと行数を調節していたら途中に変な改行が。

それから呼び出すのは
WM_NOTIFYの、リストビューのIDからのメッセージで、
LVN_COLUMNCLICKが来たときにです。
>>191

compare関数が呼び出された時点でlParam1, lParam2共に0なんだから、
その関数をみせられてもわからんですよ。

猫のところのプログラムは動くのだから、そこから手を加えた
ところを探ってみた方がいいんじゃない?アイテムを追加するところとか。
lParamを設定していない落ちとか。

私の場合は必ずアイテム追加するときにlParam設定しておくからなぁ。
#しかもMFC利用。
195185:04/08/22 18:45
>>194
LPARAMを設定?
親ウィンドウAとその子ウィンドウBがあり、子ウィンドウBを親ウィンドウAの
キャプションのように扱いたいのですがどうすればいいのでしょうか?
以下のような感じで、子ウィンドウBをドラッグすると親ウィンドウが動くとい
うか…わかりづらくてすいません。
+---------------+
| +-----------+ |
| | 子ウィンドウB |. |
| +-----------+ |
| 親ウィンドウA   |
+---------------+

最初、子ウィンドウBでWM_NCHITTESTで親Aにそのまま流しましたがダメ
でした。
次に子ウィンドウBでWM_NCHITTESTにreturn HTCAPTIONを返し、Bの
WM_WINDOWPOSCHANGINGで親ウィンドウに対しMoveWindowしてみると
一見うまくいってるようですが親とズレてしまったり、親のクライアント領域
外に出られないなどの問題がありました。

要はシステムメニューから移動を選択したのと同じ動作をさせたいのです。
どなたがご教授頂けませんか。
キャプション?
>>196
子ウィンドウでは HTTRANSPARENT を返して、親ウィンドウでは
マウス座標を調べて子ウィンドウの座標内にあれば HTCAPTION を
返すようにしたらどうですか?
199185:04/08/22 23:05
自己解決しました。

LVITEM構造体のlParamを設定する必要があるんですね。
比較関数に送られてくるのはその値だったのか。
道理で全部ゼロになっているわけだ。
200テレパス名無しさん:04/08/22 23:05
>>178
チェックボックスのように自動でチェックする機能はないので、
自分で状態を管理してチェックを付けたり外したりしてください。
201196:04/08/22 23:36
>>198
レスが遅くなって申し訳ありません。
子ウィンドウでHTTRANSPARENT(-1)を返し、親ウィンドウで座標をチェックして
HTCAPTIONを返したところ期待通りの動作になりました。
ご教授頂きありがとうございました。
関連づけられたアイコンの小さいサイズを取得する方法はありますか?
ExtractAssociatedIconでは32x32サイズのアイコンしか取得できませんでした。
ExtractIconExだとEXEやDLLの場合は小さいサイズも取得できますが、フォルダ
の小さいアイコンを取得できません。
ぐぐってみたりMSDNをみたりしましたが見つけることができませんでした。
203デフォルトの名無しさん:04/08/23 08:22
Windows2000でコンピュータ名を変更できるAPIはないでしょうか?

SetComputerNameでは、NetBIOS名しか変わりませんでした。
Win32_ComputerSystemのRenameメソッドはXP以降でしか使えないようです。
そろそろXP専用でも何も文句言われなくなってくる時期
>>202
SHGetFileInfo
206デフォルトの名無しさん:04/08/23 09:57
>>203
よくわからずに書くけど、SetComputerNameExもダメ?
>>206
ありがとうございます。

Exの方はドキュメントだけ見て、試してませんでした。
SetComputerNameExのComputerNamePhysicalDnsHostnameで上手く行きました。

お騒がせしました。
208デフォルトの名無しさん:04/08/23 14:29
現在実行中のプロセスから、自分自身が所有しているメモリサイズを知りたいのですが、
そういうふうに使えそうなAPIはないでしょうか?
できれば、スレッドごとのスタックサイズも取れると嬉しいです。
お知恵を拝借させてください。
お願いします。
209202:04/08/23 15:35
>>205
ありがとうございます、調べてみます。
210186:04/08/23 15:36
>>208
MEMORYSTATUS
GlobalMemoryStatus
で出来ると思います。

>>189
大変亀レスですけど、ペイトソフトといってもただMoveToExとか使わずに直線を引いたりするだけのプログラムでして。
一番重要そうなCreateDIBSectionの使い方と言うか意味の理解い苦しんでます。
hdcを取得するとかしてどうするのかとか…
>>210
ググって一番最初に出てくるページどおりにやればできるんでないの?
某お絵かきソフトの作者のページだが。
>>208
プロセスごとのメモリの情報は NT 系では PSAPI の GetProcessMemoryInfo()
9X 系では、ToolHelp のヒープウォークをする必要があります。
アクセラレータキーってマウスボタンは使えないんですか?
VK_LBUTTONとかVK_RBUTTONなんてものがあるからやってみたのですが、うまくいきません。
ほかの適当なボタンに変えると動きます。
214デフォルトの名無しさん:04/08/23 17:08
>>208
パフォーマンスモニタ方面のAPI使えば大体のことはできそう。
詳しくは知らんのでMSDNあたってくらさい。
VC++6.0です。
レイヤードウィンドウを使いたくて調べたところ、
SDKをインストールする、とあったのでインストールしてみたんですが相変わらず

'SetLayeredWindowAttributes' : 定義されていない識別子です。

と出ます。
core SDK のインストールだけじゃダメなんでしょうか?
217215:04/08/24 01:46
まさか同じ質問がスレ上にあったとは・・・
別の単語で検索して引っかからなかったので見落としてしまいました。

でも、まだ解決できません。
オプションからSDKのインクルードとライブラリは
ディレクトリに加えてあるんですけど、全然効果がないです。
何故なのかわかりませんが、他に設定が必要なのでしょうか?
>>217
追加した奴を上の方にしてるか?
219215:04/08/24 02:41
>>218
はい、それは書いてあったので試してみました。
でもダメなんです。

そういえば、>>78の意味がわかりませんでした。
調べても何がなにやらで。

普通だったらちゃんと定義されてるって認識するんですよね?
#define _WIN32_WINNT 0x500
#include "windows.h"

こーしろってこと。
>>220
stdafx.hネタと同じくらいメジャーな「初心者泣かせ」かもな(w
222222:04/08/24 06:51
IMEの表示をずらしたいのですがうまくいきません.どの段階での表示かといいますと
ちょっとうまく伝えられるか自身がないのですが,メモ帳を立ち上げていただいて
[半角/全角キー]を押していただき[Aキー]を押していただくと[あ]の文字の下に点線が
表示されてる状態になると思うのですが,これをずらしたのです.
実際にずらしたいのはメモ帳なども外部アプリの物ではなく自分でCreateWindowしたEDITの物です

WM_IME_REQUESTで,なおかつWPARAMがIMR_QUERYCHARPOSITIONのときLPARAMはIMECHARPOSITIONという
構造体へのポインタでありまして,それをうめて1を返せばいいみたいなことがmsdnに書いてあるとおもうのですが
英語なので自信がありません.
msdn.microsoft.com/library/en-us/intl/ime_2nu6.asp

ここにソースを貼りました
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1086258254&rm=100
223222:04/08/24 08:36
WM_IME_NOTIFYでWPARAMがIMN_SETCOMPOSITIONWINDOWのときに
ImmSetCompositionWindowで無事ずらすことができました
質問です。

VC++6.0にて、
新規作成 -> Win32 Console Application -> 空のプロジェクト
から、ウィンドウ(またはダイアログ)を生成することは可能でしょうか。


>>224
試してみてください
226224:04/08/24 12:42
ハーイ
>>224
ぶっちゃけ、可能です。
作り方は自分で調べましょう。
手取り足取り教えられる暇人はいません。

終了
228224:04/08/24 12:50
>227 再開
可・不可だけたずねたつもりでしたので、
思わぬ回答、ありがとうございました。

229215:04/08/24 12:54
>>220
できました、そうやるのですか。
本当にありがとうございました。
230 ◆Z0vd5w812U :04/08/24 13:25
>>224
オレはいつもconsoleでWin32アプリを作ってる。printfを使いたいから。
リリース時にはWinMain()を呼び出すように切り替えてコンパイル。

で、一つだけ教える。GetModuleHandle(NULL)でアプリケーションのインスタンスハンドルを入手できる。
>>230
OutputDebugString()は許されない環境なのか?
232 ◆Z0vd5w812U :04/08/24 13:43
>>231
コマンドラインでmakefile派だから。IDEを使わないので。
>>231
慣れというものがあるっしょう。
かく言う俺もConsole使ってる。_DEBUG定数でmainとWinMainを切り替えたりして。
>>233
WinMainを使っててもコンパイルオプションでコンソールが出る。
(少なくともMingwとlcc-win32では。)
いちいちWinMainとmainを切りかえるのは面倒じゃないか?
>>232
は?IDE?なんの関係が?
OutputDebugStringって、普通にコンソールに出力出来るのか?
...\Microsoft Platform SDK\Bin\winnt\Dbmon.Exe
>>234
IDE や Makefile 等で、リリース時とデバッグ時でリンカの設定も変えてるのでは?
んでソースの中では _DEBUG 見て main 生かしたり WinMain 生かしたりしてるとか。
239224:04/08/24 17:25
>>230-238
有用な情報有難うございます。

今までWindowアプリは食わず嫌いでしたというか
機会がなかったので、食っていくのために少しオベムキョウして見ます。
240 ◆Z0vd5w812U :04/08/24 21:00
>>234>>238
そう。Makefile中でコンパイルオプションとリンクオプションを変えてる。
#ifdefでmainとWinMainを切り替えてる。10行程度だし一回作ってしまえばあとは使い回し。

>>239
深淵なる糞APIの世界へようこそ。ガンガッテ下さい。
241デフォルトの名無しさん:04/08/24 21:40
質問なんですが
猫でもわかるプログラミングのサイトのWindows SDK編 12章の
リソーススクリプトとヘッダの部分を教えてください。
お願いします。
>>241
先ずはそのサイトの該当ページを飽きるまで読んでください。
243デフォルトの名無しさん:04/08/24 23:20
読んだのですがどこみていいのか わかりません
システムメニューのリソーススクリプトはのっているのでしょうか
これは12章以降を見るっていうことでしょうか
12章の内容ってシステムメニューいじってるだけやん。
自分で好きなようにダイアログリソース作ってよし。

ついでにおまいらに言っとくが、[閉じる(C) Alt+F4]の下にメニュー追加するやつは頃す。
>>244
タスクバー右クリから閉じようとした時、切なくなるね
>>244
cmd.exeのコトかー!
ひでまるのことかー!
>>244
*.chmファイルとか開いた時とか
バージョン情報が表示されるたびに学習能力のない自分に苛立ち手首を切りたくなります。
特定の外部アプリケーションのEDITウインドウの
ウインドウハンドルを拾うにはどうすればいいですか?
トップウィンドウから徹底的にさがしまくる
252デフォルトの名無しさん:04/08/25 04:07
記録されている物理的なデータを暗号化する関数ってある?
例えば.txtの中身がaだけだととしても暗号化してrk&0 見たいに見えるようにするような
ない
254デフォルトの名無しさん:04/08/25 05:58
DirectXを使わずにフルスクリーンウィンドウを作りたいのですが、その時解像度も指定する方法ってないですか?
ChangeDisplaySettings
256254:04/08/25 06:17
たすかりました!
>>244
そんなもん人の勝手だろうが
メニューの折り返しも考慮してくれるAdjustWindowRectってありませんか?
>>244
MSDNライブラリも頃される対象になるわけだな・・・。
ない。仕方ないからWM_NCCALCSIZE投げて再計算してる
実際にウィンドウ作らないと計算できないのがイマイチだが
実際のところ、メニューが折り返されてもそれを意識しないアプリも結構多いな。
漏れはメニューに等幅フォント使ってるんで時々そういうのに出くわす。

折り返すのがイヤならReBarスタイルのメニューを使うという手もあるが
マンドクサそうだ。
>>261
WM_NCCALCSIZEを投げるサンプルみたいなものってどこかに無いでしょうか?
検索しても、WM_NCCALCSIZEに応答するサンプルしか見当たらず、
MSDNを見てもどのメンバを埋めてSendMessageするべきなのか検討もつきません。
リサイズするときはこんな感じになるのかな

int ResizeWindowByClient(HWND hwnd, int width, int height, int times_to_try=2)
{
  RECT rc = { 0, 0, width, height};
  ::ClientToScreen(hwnd, reinterpret_cast<POINT*>(&rc));
  ::ClientToScreen(hwnd, reinterpret_cast<POINT*>(&rc)+1);
  ::AdjustWindowRectEx(&rc,
    ::GetWindowLongPtr(hwnd, GWL_STYLE),
    ::GetMenu(hwnd) ? TRUE : FALSE,
    ::GetWindowLongPtr(hwnd, GWL_EXSTYLE));

  for (int i = 0; i < times_to_try; i++) {
    RECT client = rc;
    ::SendMessage(hwnd, WM_NCCALCSIZE, FALSE, reinterpret_cast<LPARAM>(&client));
    if (client.right-client.left == width && client.bottom-client.top == height) {
      ::SetWindowPos(hwnd, NULL, rc.left, rc.top,
        rc.right-rc.left, rc.bottom-rc.top, SWP_NOZORDER|SWP_NOACTIVATE);
      return true;
    }
    rc.right += width + client.left-client.right;
    rc.bottom += height + client.top-client.bottom;
  }
  // これしとかないと、変更予定だったサイズでメニューが折り返すときおかしくなる
  ::GetWindowRect(hwnd, &rc);
  ::SendMessage(hwnd, WM_NCCALCSIZE, FALSE, reinterpret_cast<LPARAM>(&rc));
  return false;
}
俺はこんなのを使ってる
void AdjustWindowRect(HWND hwnd,int width,int height)
{
RECT wrect,crect;
::GetWindowRect(hwnd,&wrect);
::GetClientRect(hwnd,&crect);
int ncwidth,ncheight;
ncwidth = (wrect.right - wrect.left) - (crect.right - crect.left);
ncheight = (wrect.bottom - wrect.top) - (crect.bottom - crect.top);
::SetWindowPos(hwnd,NULL,0,0,
width + ncwidth,height + ncheight,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
::GetWindowRect(hwnd,&wrect);
::GetClientRect(hwnd,&crect);
int ncheight2 = (wrect.bottom - wrect.top) - (crect.bottom - crect.top);
if (ncheight != ncheight2)
{
::SetWindowPos(hwnd,NULL,0,0,
width + ncwidth,height + ncheight2,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
::GetWindowRect(hwnd,&wrect);
}
RECT drect;
::GetClientRect(GetDesktopWindow(),&drect);
int x = wrect.left - (wrect.right > drect.right ? wrect.right - drect.right : 0);
int y = wrect.top - (wrect.bottom > drect.bottom ? wrect.bottom - drect.bottom : 0);
x = x < 0 ? 0 : x;
y = y < 0 ? 0 : y;
::SetWindowPos(hwnd,NULL,x,y,0,0,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
}
266デフォルトの名無しさん:04/08/25 17:53
CD-ROMの入れ替えで、ファイルリストの情報を更新したいのですが、上手く行きません。
入れ替えると、WM_DEVICECHANGEが来て、
ボリュームラベルなどの情報は取れるのですが、アイコンが更新されません。
アイコンを更新するためにはどうしたらいいのでしょうか?
>>236 のツールのように他アプリの OutputDebugString 出力を取得するにはどうすればよいのでしょうか?
268デフォルトの名無しさん:04/08/25 18:26
>>266
よくわからんけど、SHChangeNotifyRegisterで登録して、
SHCNE_UPDATEIMAGEを待ってから取得するのはどうだろう?
アイコン取得方法とかもうちょい詳細を晒せば、誰かもっといい答えをくれるかも。
>>268
ありがとうございます。
ただ、ドキュメントを見るとSHChangeNotifyRegisterはWin2K以降用なのでWin98では駄目みたいです。
アイコンはSHGetFileInfoで取得してます。
(フラグはSHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON)
>>267
そのツールにはソースが付いてるだろ。読め
>>269
Win98では隠しAPIかも。
www.geocities.com/SiliconValley/4942/
に載ってるので。

あとは、タイミングの問題に思えるので、ウェイト&リトライ入れるか
ポーリング入れるとか?
OLEドラッグ&ドロップをエミュレートするにはどうしたらいいのでしょうか?
ウインドウについてるプロパティリストを見ると、
OleDropTargetInterface と OleDropTragetMarshalHwnd というのがくっついているので、
IMarshalを使うのかなと想像してるのですが、IMarshalを使った事無いので検索しようにも
手がかりがつかめません。

検索のヒントだけでも良いので挙げてもらえないでしょうか?
エミュレートっていうのは分かりませんが、OLEドラッグ&ドロップを実現するには、
IDropSource、IDropTarget、IEnumFORMATETC、IDataObject等を実装する必要があります。

ドラッグ操作を開始するときは、DoDragDrop API(引数はIDataObjectとIDropSource)を
使用します。

ドラッグを受け付けるときは、RegisterDragDrop API(引数はIDropTarget)で
ドラッグ受け入れ用のインターフェイスを登録します。

RegisterDragDropで登録したあとは、いちおう念のため、IDropTargetを
CoLockObjectExternalでロックしておいたほうが安全のようです。
>>273
レスありがとうございます。
エミュレートというのは、プログラムからバッチ処理的に直接ドラッグ&ドロップをしたいということで、
DoDragDropによってできる通常のマウスによるドラッグドロップではないのです。

ウインドウハンドルやプロセスID等から直接ターゲットプロセスのIDropTargetを操作したいんです。
パスの取得方法について質問です
コマンドラインから
>hoge.exe "c:\aaa\bbb\ccc\ddd.txt"
と引数を渡してやったときに、フルパスからファイル名を除いた
c:\aaa\bbb\ccc\を取得したいのです。

ググった所、_splitpathでドライブ、ディレクトリ、ファイル名
に分割できる事はわかりましたが、一発でファイル名のみ除去できるAPIはないのでしょうか?
276 ◆Z0vd5w812U :04/08/26 00:00
>>275
文字列のケツから'\\'を探して'\0'で置き換えればよいのでは?
練習問題としてはありなんですが、バックスラッシュとか、
多バイト文字が不味いんじゃないでしょうか

標準で安全なものがあればそれを使うのが最善でしょうけど、
MFCとか.NETとかでならメソッドがあるみたいなんですけど……
>>275
PathFindFileName()
>>270
デルフィーのソースを読むのは嫌です
>>274
なるほど。

反則的な技ですが、相手先のウィンドゥに直接WM_DROPFILESを送ってやることで可能です。
DROPFILES構造体用のメモリを確保し、そこに必要情報を書き入れ、相手先の
ウィンドウに送りつけます。

メモリ確保は、シェルAPIのSHGetMalloc(&pMalloc)でメモリインターフェイスを
取得し、pMalloc->Alloc()でメモリを確保します。

pMalloc->Alloc()で確保したメモリは異プロセス間で参照可能です。

pMallocを使用し終わった後はpMalloc->Release()を忘れないようにしてください。

なお、DROPFILESに入れるファイル名ですが、Windows NT系列ではUNICODE、
それ以外ではANSIで入れないといけないようです。
(DROPFILES::fWideも適切にセットする。)
281280:04/08/26 00:26
あ〜。書いてしまった後でなんですが、これだと
>>直接ターゲットプロセスのIDropTargetを操作したいんです。
の希望に添えませんね…。
お役にたてなくてすみません。
>>274
UndocumentedだがOleDropTargetInterfaceプロパティに
IDropTargetのポインタが入ってる。
>>279
???
何でMSDNにDelphiのソースがあるの? 何か別のものを想像してないか?
>>282
他プロセスからじゃ操作できないんじゃね?
SetCursorPosでマウスカーソルを対象ウィンドウ上に移動してDoDragDropすればいける気もするが。
>>284
そこはDLL注入とかでがんがる
>>275
PathRemoveFileSpec()
288デフォルトの名無しさん:04/08/26 12:20
・子ダイアログである
・そのダイアログ上にあるコントロールを触った後でも、フォーカスは常にメインウィンドウにある
・フォーカスの有無にかかわらず、タイトルバーは常に明るい(灰色ではない)

以上の条件を満たすダイアログって作れますでしょうか?

要するにMFCのフローティングリバーと同じ挙動なのですが…
我々はあれを指加えて見てるしか無いのかな(´・ω・`)
MFCならソース公開されてるじゃん。
290288:04/08/26 12:40
>>289
すいません、書き忘れましたがVC++持って無いのがそもそもの悩みでして
公開されてるんですか。触りだけでもどなたか教えて頂けないでしょうか

MFCって、どこかで落とせるのかな…
>>288
そのダイアログで、WM_ACTIVATEに応答してアクティブにならないようにすればいいんじゃないの?
>>275
PathRemoveFileSpec
>>288
WS_EX_TOOLWINDOW にして WS_EX_NOACTIVATE しておけばいいんじゃない?
(Win2K / XP 以降ってことで)。
295288:04/08/26 15:13
>>291-294
お二人ともレスありがとうございます
全て試してみましたが、しかしどうにも上手くいかないです。

・WM_ACTIVATE
メッセージが来たら親ウィンドウにSetFocusしてみましたが、何故か上手くフォーカスが移りません。

・WS_EX_TOOLWINDOW
リソースからダイアログを作り、後からexスタイルを変えた場合、
あるいは最初から自前でCreateWindowExした場合、いずれもフォーカスが無いときは
やはり灰色のタイトルバーになってしまいます…。

・WS_EX_NOACTIVATE
これは0x08000000でよろしいのでしょうか?
コントロールも含め、全てWS_EX_NOACTIVATEを指定してみましたが、
これもフォーカスは通常通りで…一応spyでスタイルが定まっているのは確認しました。

この際、タイトルバーの色が変わらない方法だけでも、詳しく教えて頂けないでしょうか。
私のWS_EX_TOOLWINDOWの使い方が間違っている気がします…。
>>295
WM_NCHITTEST/HTTRANSPARENT
297288:04/08/26 17:22
>>296
レスありがとうございます。やってみたのですが、ちょっと問題が。
・マウスメッセージが来なくなる
・タイトルバーをつかんでダイアログのの移動が出来なくなる(これは何とかなるかな)
・コントロールには、結局フォーカスが移る
・なのでコントロールをサブクラス化してWM_NCHITTESTを処理すると、コントロールが固まる
・タイトルバーはやっぱり灰色

なんか否定的なレスばかりで申し訳ないです。
もうVC(MFC)買ってこようかな…。
298288:04/08/26 17:30
そうか、すいません>>288の文が不明瞭でした

・フォーカスの有無にかかわらず、ダイアログのタイトルバーと
 (メインウィンドウのダイアログのタイトルバーが共に)、常に明るい(灰色ではない)

まぁ、見栄えが悪いっていう理由だけなので、いい加減諦めるべきですかね…。
・フォーカスの有無にかかわらず、ダイアログのタイトルバーと
 メインウィンドウのタイトルバーが共に、常に明るい(灰色ではない)

重ね重ねスマソ_| ̄|○
ファイルを開く、名前をつけて保存、のダイアログが存在するかどうかを認識するのには
どういう方法があるでしょうか?
>>297
MFCは
WM_MOUSEACTIVATE/ HTSIZEFIRST <= hittest <= HTSIZELAST で MA_NOACTIVATEを返し、
それ以外でDefWindowProcかな。

非アクティブでもタイトルバーの色がアクティブのままだったり、
他に細かい事いろいろやってるけど。
>>298
それ、結構前にMFCだかVC関連のスレで出てた気がする。
ログにgrep掛けたけど、ちょっと見当たらなかった。
>>297
よく探せば(海外も含めて)参考になるソースは転がっていると思うよ。
その時間を惜しんでVC++買ってきてサンプルを読むというのも間違ってないと思いますが。
304デフォルトの名無しさん:04/08/26 19:22
仮想ドライブ FileDisk (http://www.acc.umu.se/~bosse/) というソフトのGUI化をVB6SP5で目論んでいます。
仮想ドライブの情報を得るために、

Device = CreateFile(VolumeName, _
GENERIC_READ, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
0, _
OPEN_EXISTING, _
FILE_FLAG_NO_BUFFERING, _
0)

でデバイスハンドルをを取得

Const IOCTL_FILE_DISK_QUERY_FILE = &H802
Dim rc
rc = DeviceIoControl(Device, _
IOCTL_FILE_DISK_QUERY_FILE, _
Null, _
0, _
OpenFileInformation, _
Len(OpenFileInformation), _
BytesReturned, _
0)

で、構造体変数OpenFileInformationにドライブ情報が収納されて戻ってくるはずなのですが
DeviceIoControlがエラー6(ハンドルが無効です。)を返してしてしまいます。
FileDiskのC言語のソースをVBに書き直しただけのつもりなのですが
何故、うまく動かないのでしょうか?
ちなみにVBに翻訳したい関数は↓です。

----
int FileDiskStatus(char DriveLetter)
{
char VolumeName[] = "\\\\.\\ :";
HANDLE Device;
POPEN_FILE_INFORMATION OpenFileInformation;
DWORD BytesReturned;

VolumeName[4] = DriveLetter;

Device = CreateFile(
VolumeName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);

if (Device == INVALID_HANDLE_VALUE)
{
PrintLastError(&VolumeName[4]);
return -1;
}

OpenFileInformation = malloc(sizeof(OPEN_FILE_INFORMATION) + MAX_PATH);

if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_QUERY_FILE,
NULL,
0,
OpenFileInformation,
sizeof(OPEN_FILE_INFORMATION) + MAX_PATH,
&BytesReturned,
NULL
))
{
PrintLastError(&VolumeName[4]);
return -1;
}
if (BytesReturned < sizeof(OPEN_FILE_INFORMATION))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
PrintLastError(&VolumeName[4]);
return -1;
}

printf("%c: %.*s Size: %I64u bytes%s\n",
DriveLetter,
OpenFileInformation->FileNameLength,
OpenFileInformation->FileName,
OpenFileInformation->FileSize,
OpenFileInformation->ReadOnly ? ", ReadOnly" : ""
);

return 0;
}

----
308デフォルトの名無しさん:04/08/26 20:21
ほげほげ
309275:04/08/26 20:40
>287,292

PathRemoveFileSpec()で無事取得できました。ありがとうございました。
>>304-306
CでうまくいくのならそこをDLLにしてVBから呼び出すようにしたら?ちっとも解決にはなっていないけど。
>>304
よくわからんけど、
>char VolumeName[] = "\\\\.\\ :";
↑このへんと
>VolumeName[4] = DriveLetter;
↑このへんはちゃんと理解してますよね。
つまり、"\\.\C:" みたいな文字列が、VolumeName に入ってますよね?
>>311

>char VolumeName[] = "\\\\.\\ :";
>VolumeName[4] = DriveLetter;
↑がなんで4(5文字目)なのか解かっていませんが、自分のVBコードでは
VolumeName="\\.\" & DriveLetter
にしています。

そしてCreateFile関数で得られたDeviceにはINVALID_HANDLE_VALUEでない、
デバイスハンドルが取得されるところまでは成功しています。
が、その次のDeviceIoControl関数でエラー6(ハンドルが無効です。)となってしまうのです。
VBでデバイスコントールは難しいのでしょうか。

>>310
初心者な上に、VCも持っていないので、、


ちなみに>>305-307の関数をVBに↓のように書き直しました。

Public Function FileDiskStatus(ByVal DriveLetter As String) As Integer

  Dim VolumeName As String
  Dim Device As Long
  Dim OpenFileInformation As POPEN_FILE_INFORMATION
  Dim BytesReturned As Long

  VolumeName = "\\.\" & UCase(DriveLetter) & ":"

  Device = CreateFile(VolumeName, _
                GENERIC_READ, _
                FILE_SHARE_READ Or FILE_SHARE_WRITE, _
                0, _
                OPEN_EXISTING, _
                FILE_FLAG_NO_BUFFERING, _
                0)

  If Device = INVALID_HANDLE_VALUE Then
    MsgBox GetLastError
    FileDiskStatus = -1: Exit Function
  End If

  With OpenFileInformation
    OpenFileInformation.FileSize.Low = 0
    OpenFileInformation.FileSize.high = 0
    OpenFileInformation.ReadOnly = False
    OpenFileInformation.FileNameLength = UBound(OpenFileInformation.FileName)
  End With

  Const IOCTL_FILE_DISK_QUERY_FILE = &H802
  Dim rc
  rc = DeviceIoControl(Device, _
                IOCTL_FILE_DISK_QUERY_FILE, _
                Null, _
                0, _
                OpenFileInformation, _
                Len(OpenFileInformation), _
                BytesReturned, _
                0)
  If rc = 0 Then
    MsgBox GetLastError
    FileDiskStatus = -1: Exit Function
  End If

  If BytesReturned < Len(OpenFileInformation) Then
    MsgBox GetLastError
    FileDiskStatus = -1: Exit Function
  End If

  Dim strFileName As String
  strFileName = OpenFileInformation.FileName
  MsgBox (DriveLetter _
        & OpenFileInformation.FileNameLength & " " _
        & strFileName & " " _
        & CStr(OpenFileInformation.FileSize.Low) & " " _
        & CStr(OpenFileInformation.ReadOnly))

  FileDiskStatus = 0

End Function
POPEN_FILE_INFORMATION 構造体定義

Type LARGE_INTEGER
Low As Long
high As Long
End Type

Type POPEN_FILE_INFORMATION
FileSize As LARGE_INTEGER
ReadOnly As Boolean
FileNameLength As Integer
' FileName As String
FileName(1 To MAX_PATH) As Byte
End Type

-----
VBのNullはVariantのNullなんだが問題ないんだろうか
ツリービューがデフォルトで持ってるツールチップの
DelayTimeを変更するのは不可能ですか?
TreeView_GetToolTips して TTM_SETDELAYTIME かな
>>318
それやったんですが、無視されてしまうようです。
色やマージンなどは変更できたんですが…
定義済みコントロールクラスのBUTTONで押されると押されたままになるボタンを作ることはできますか?
オーナー描画ボタンはめんどくさすぎるんで
>>320
ラジオボタンだか何かのスタイルにそんなの(ボタン風の)が合ったような気がする・・・
チェックボックス?
BS_PUSHLIKE
InvalidateRectやGetUpdateRectにわたす
RECTの幅と高さの計算はそれぞれ、

right - left + 1
bottom - top + 1

でいいでしょうか?
それとも、

right - left
bottom - top

でしょうか。
>>325
ありがとうございます!
327304:04/08/28 04:50
>>316
Nullの代わりに0、""などを入れてみたところ今度はエラー1が出ました。
なんとなく次の段階に進めそうです。

と思ったのですが、FileDiskのGUIが見つかったので今回のプロジェクト?は中止します。
皆さん、ありがとうございました。
最後までやれよ・・・
>>327
vbNullString使え。
330デフォルトの名無しさん:04/08/28 09:35
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int nCmdShow )
これの右側部分の意味っていうか、なぜhinstanceとか入れなきゃならないんですか?
これは任意の名前でもいいんですか?
>>330
まずC/C++の入門書読んで来い。このスレでする話じゃない。
これだからシロートさんは困る。
省略するな。
WinMain(HINSTANCE handle_for_Instance_of_this_Process, HINSTANCE handle_for_Instance_of_Previous_Process, LPSTR long_pointer_for_Command_Line_String)
>332
引数が一つ省略されてるのは仕様ですか?
s/)/, int state_for_how_the_window_is_to_be_Shown)/

WinMainのプロトタイプを何文字で書くかで力量が量られる。
100文字未満 :草履持ち
100〜199文字:見習い
200〜299文字:丁稚
300〜499文字:番頭
500文字以上 :旦那
まぁ、WinMainの第二引数に名前つける奴は素人な訳だが。

50文字未満:神

WinMain(HINSTANCE a,HINSTANCE b,LPSTR c,int d)
337デフォルトの名無しさん:04/08/28 10:39
HINSTANCE hInstance
HINSTANCE形の変数hInstanceてことですよね。
これは任意で名前変えても良いんですか?
>>337レス嫁

handle_for_Instance_of_this_Process

b

になら変えることが許されている。
憲法の解釈によっては問題ない。
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {}
使わないからこれでいいんだよ
void WinMain(void);
342デフォルトの名無しさん:04/08/28 10:47
>>338
だから任意で変えてもかまわないんですよね
343337:04/08/28 10:51
hInstance を b にかえてみたら、

error : parameter "hInstance" not declared

やっぱり他の名前に変えたらだめなんじゃないですか!!
しろうとに嘘教えてそんなに楽しいですか?
ここはひどいインターネットですね。
344デフォルトの名無しさん:04/08/28 10:53
>>343
おい、俺のフリするなや
345337 ◆ZIIQIs.HCM :04/08/28 11:00
ニセモノが居るのでトリップつけてみました。
お前も質問者と一緒にどっか行け
void WinMainCRTStartup(void)
で。
348337 ◆DeUsmjHgh2 :04/08/28 11:04
はー、トリップ付けたからって偽者が本物になるわけないでしょうに
349337 ◆PIbfznOsNc :04/08/28 11:09
みんないいかげんにしてください。
350337 ◆DeUsmjHgh2 :04/08/28 11:11
俺だけ下げてないから本物ってわかりますって
351337 ◇DeUsmjHgh2:04/08/28 11:16
答えてくれるまで上げます。
352337 ◆DeUsmjHgh2 :04/08/28 11:17
・・・もういいよ。お前ら人が悪いな。
>>331で終わってるんだよ。
いや、収穫もあったぞ。

WinMainのプロトタイプを何文字で書くかで力量が量られる。
100文字未満 :草履持ち
100〜199文字:見習い
200〜299文字:丁稚
300〜499文字:番頭
500文字以上 :旦那

俺は見習いか・・・意外と当たるな。
つーかそんなのコピペで済ましてますがw
SetWindowsHookEx の使い方を教えてください。

WH_CALLWNDPROC とか、WH_GETMESSAGE
とか、フックの種類がいくつかあるようですが、
どういう場合にどのフックを使えばいいのか
ヘルプを読んでもよくわかりません。

こういうときにこのフックとか解説している
サイトがあれば教えてください。
変数名は大事だよ〜
特に1つのプロジェクトを複数人で組むときとか大事だよ〜
359337 ◆DeUsmjHgh2 :04/08/28 13:31
そういえば皆さんはプログラム作るときに、コピーしまくってますよね?
マウスホイールの値を取得できるAPIはありませんか?
>>357
fuckて。明らかに英語間違ってるような。エロサイトかと思った。
腕時計を見るように腕を傾けるのはよくわかった。ありがとう。
GetWheel
>>357
rinku.htmlを見たとき以来の笑撃だ
マウスホイールの値とは?
>>357
( ゜д゜)・・・
fuck打ちまくり
356 名前:デフォルトの名無しさん[sage] 投稿日:04/08/28 13:20
SetWindowsFuckEx の使い方を教えてください。

WH_CALLWNDPROC とか、WH_GETMESSAGE
とか、Fuckの種類がいくつかあるようですが、
どういう場合にどのFuckを使えばいいのか
ヘルプを読んでもよくわかりません。

こういうときにこのFuckとか解説している
サイトがあれば教えてください。
368360:04/08/28 15:23
>>362
検索しても見つかりませんでしたが…。

>>364
ホイールをどれだけ回転させたかの値です。
WM_MOUSEWHEELメッセージのwParamの上位ワードのような。
369356:04/08/28 16:29
>>357
フックの勉強にはなりましたが、
WH_CALLWNDPROC とか、 WH_GETMESSAGE とかに
ついての解説は残念ながらないようです。

それらについて解析したページお願いします。
msdn見ろカス
システムイメージリストのイメージとオリジナルのイメージを
ひとつのリストビューで使いたいのですが、
システムイメージリストにオリジナルのイメージを追加するのが良いのか、
システムイメージリストをコピーして使うのが良いのか、どちらでしょうか?

Win2kとかだと、システムイメージリストもアプリケーションローカルのようなので、
好きなように編集してよさそうなのですが、2kとXPしか環境が無いので
どういった作法がいいのか分かりません。
>>370
知らなけりゃ、だまっていいよ。
ぐぐるだけで日本語のサイトが見つかるだろう>>356
http://www.kab-studio.biz/Programing/Codian/
SelectClipRgnした後、リージョンを削除するにはNULLを指定すればいいみたいだけど
選択前のリージョンに戻したい場合はどうすればいいのか分からないです。
SelectObjectの戻り値もオブジェクトではなく、ステータスだし・・・
375デフォルトの名無しさん:04/08/28 18:52
windowの背景色をmenuの背景色と同じにするにはどうしたらいいですか?
hbrBackground = GetSysColorBrush(COLOR_MENU);
hbrBackground = (HBRUSH)COLOR_MENU;
>>373
レスありがとうございます。

しかし、WH_CALLWNDPROC  の説明として「すべてのメッセージ」と書いてありますが、
WM_KEYDOWN は通過しないようです。
一方、WH_GETMESSAGE も「すべてのメッセージ」と書いてありますが、
WM_ACTIVATE は通過しないようです。

WM_XXXXX をフックしたいときは、WH_XXXXXみたいな対応が
わかれば助かるんですが。

それと、WH_GETMESSAGE でも、WH_KEYBOARD でも WM_KEYDOWN をフックできますが、
それならどちらを使っても同じなのか、それともそれぞれにどのような
メリット・デメリットがあるのかなどの解説は、ぐぐっても msdn でも見つけられませんでした。
(探し方が下手なのかもしれませんが)

どなたかご存じないですか?
あるいは、みなさんは、フックするときにどの WH_XXX を使うか、どういう基準で決めてますか?
よろしくお願いします。
379デフォルトの名無しさん:04/08/28 19:00
>376
できました
ありがとうございました。
>>377
+1しないとだめ
>>378
難しいことは俺もわからんのだが、
WH_CALLWNDPROCとWH_GETMESSAGEの違いは分かってる?
名前の通り、WH_CALLWNDPROCの方はウィンドウプロシージャのフック。
WH_GETMESSAGEはメッセージキューのフック。

フックしたいものが、メッセージキューを通るのか、SendMessageみたいに直接プロシージャを呼び出すのか、
によって決めればいいんじゃないかな。

WM_KEYDOWNとWM_ACTIVATEがどういう風に送られるかは知らないので、自分で調べてください。
>>380
なんで?
>382
COLOR_SCROLLBARで何が起きるか考えて試してみな。
>>208を見たところ、プロセスごとのメモリ情報は>>210, >>212の方法で取得できるようですが、
スレッドごとのスタックサイズを取得する方法はあるのでしょうか?
ありましたら、教えていただきたいです。
あるスレッドがいまどんだけスタック食ってるかって
どうやったら分かりますかね?
>>374
SaveDC, RestoreDC
>>385
開始位置のSPを憶えておいて比較したいところで引き算するしかないね。
388デフォルトの名無しさん:04/08/29 02:40
デスクトップマスコットを作っているのですが
リージョンを作成する系統の命令(CreateRectRgnなど)を
連続して呼びだすと、他のアプリの一部が無限にちらついてしまう現象が
起こります。(自作のマスコットアプリにかぎらず)
Exel2003やWord2003などの一部の図形を表示しているとかなりひどいです。
原因や回避方法をご存知のかたおられませんか?
>>378
WH_CALLWNDPROC は SendMessage() で送られてきたキューを通過しないメッセージ
しか捕まらない。だから WM_KEYDOWN は捕まらない。
反対に、WH_CALLWNDPROC はキューを通過するメッセージしか捕まらない。英語の
ヘルプやMSDNでは、キューを通るメッセージは posted 通らないのは sent と
なっているので区別できる。

>WH_GETMESSAGE でも、WH_KEYBOARD でも WM_KEYDOWN をフックできますが、
>それならどちらを使っても同じなのか

同じって言えばいえるけど、WH_KEYBOARD はキーボードメッセージ専用
なのでオーバヘッドは小さいだろうね。専用なので間に合う場合はそれを
使った方がいい。
>>388
CreateRectRgnなどのリージョンをつくるAPIは、DCハンドルと関係ないでしょう。
ちらつく理由がないのでは? もしかして、つくるたびに描画してるかクリッピング
してるんでは?
UpdateLayeredWindowを使って半透明Windowを作っているのですが、
α値を持つ画像を表示すると
(下のWindowの色)*(1−α)+(半透明Windowの色)*α
ではなく
(下のWindowの色)*(1−α)+(半透明Windowの色)
となってしまうのは仕様でしょうか?
α値を持つ画像のR・G・Bに前もって自分でα値を掛けておかなくては駄目なのでしょうか。
ダメじゃありません
むぅ。何がいけないですか。
BLENDFUNCTION?BITMAPINFO?
そんだけで分かったらエスパーだ
ttp://azumaya.s53.xrea.com/index.php?page=doc/win32api/layeredwindow
ここに書いてあるとおりにやったのですが…。
…なんでDIBSection相手にGet/SetDIBitsしてるんだ?

>>391
後者のほうが描画時の演算コスト低いだろ? そういうことで納得しとけ。
Get/SetDIBitsは意味なさそうな感じだったのでやめておきました。
やっぱり前もってαを掛けておかないと駄目ですか…。
DLL側から、それを呼び出しているEXE側の使用しているメモリ範囲を
取得するようなAPIはないでしょうか?

やりたいことは、呼び出し元プログラムの使用しているコード領域と
データ領域から特定のバイト列を検索したいのですが範囲がわからないと
どこまで読み取ればいいのか決められません
>>398
VirtualQueryを駆使すればできそう
>>389
>キューを通るメッセージは posted 通らないのは sent と
>なっているので区別できる。
ここで見分ければいいんですね。勉強になりました。

ひとつのフックですませる方法はなさそうなので、
WH_CALLWNDPROC と WH_GETMESSAGE 両方フックすることにします。

>同じって言えばいえるけど、WH_KEYBOARD はキーボードメッセージ専用
>なのでオーバヘッドは小さいだろうね。
違いがオーバーヘッドだけなら、WH_GETMESSAGE でフックしておいて
パフォーマンスに問題がでたときだけ WH_KEYBOARD に変えるような
使い方にしたいと思います。

仕様の違いではまったりするのはイヤなんで・・・・。

ありがとうございました。
>>384
GetThreadContextでスタックポインタを拾って
VirtualQueryExでスタックポインタを含むメモリ領域のサイズを拾う
実際に試してないのでうまくいかなくても知らんが
INIファイルのセクション名を変更することってできますか?
MSDNを読んでみてもkeyに対する値の変更や削除については発見
できたのですがセクション名の操作に関しては発見できませんでし
た。
>>387
>>401
ソレしかないですかね。。。
ただ、ソースに手を出せないライブラリがスタック食ってるっぽいので
直接は無理そうです
VirtualQueryExで辿ってみます・・・
>>402
GetPrivateProfileSection(A, buffer)
WritePrivateProfileSection(B, buffer)
WritePrivateProfileSection(A, "")
ではどうだろう、と思ったが元のセクション名が残っちゃいそうだな。
テキストファイル操作で書き換えるのが早いんでないの。
>>404
WritePrivateProfileSection(A,NULL,filename)
で完全に削除できなかったっけ?
406402:04/08/29 13:03
>>404-405
レスありがとうございます。
完全に削除する場合は>>405さんの言うようにすればいいのですが、
特定のセクション名だけを変更したかったので無理みたいですね。
テキストファイル操作のほうが早いみたいなのでそうしてみます。
ありがとうございました。
407405:04/08/29 13:52
>>406
いや、特定のセクションだけ削除できるんだけど…。

セクションじゃなくてキーの名称を変更したいのかな?
408388:04/08/29 14:37
>>390
どうやらさらに調べると
CreateRectRgnではなくて
ウィンドウの形状を定義するSetWindowRgnを繰り返しよぶと、
Exeelなどで相性が悪いようです。

うーん、何でだろうなあ
>>408
形状をいじりたいだけなら、LayeredWindowにしてはどうですか?
これならパフォーマンスあまり落ちませんよ
>ウィンドウの形状を定義するSetWindowRgnを繰り返しよぶと

そりゃ、描画に影響するクリッピングを繰り返すわけだから当然。なぜ、まとめて一回に
しないのか不思議。
411388:04/08/29 16:06

>>409
ありがとうございます、しらべてみます



>>410
アニメーションさせたいからです
便乗して質問したいのですが、
レイヤードウィンドウを使う仕様にした場合でも、
win98やMEで動作させる方法はあるんですよね?

友達の家のPCで動かしたいんですが、
user32.dll?がなかったので動きませんでした。
調べても説明が端折られてて理解できなかったので、
1から学びたいのですが。
> アニメーションさせたいからです

アニメーションするのにクリッピング? 透過描画はできないの?
プリンタのスプーラの状態を監視するプログラムを作りたいのですが
どういったAPIを使えばいいのでしょうか?

作りたいプログラムはAというプログラムで、別にBとCというプログラムが
存在し、例えばBというプログラムが印刷をプリンタに依頼したら、
Aプログラムがリアルタイムにそのイベントを察知し、なおかつ印刷を
Bが依頼したという事をわかるようにしたいのですが・・・

抽象的な質問でスマソ
415387:04/08/29 21:13
>>403
>ソレしかないですかね。。。
単純にSPだけ見たいのなら
int dat;
_asm mov dat, esp
でできるよ。VC6+x86系

>ただ、ソースに手を出せないライブラリがスタック食ってるっぽいので
>直接は無理そうです
デバッガで追うしかないな。
>>412
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp
>WS_EX_LAYERED
>Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows.
> Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
普通のウィンドウを子ウィンドウとして作成すると
ウィンドウプロシージャにWM_CREATEメッセージが送られてしまいます。
これを何とか送られないようにする方法はありませんか?
作成しないか、WM_NCCREATEでFALSEを帰す
>>415
というかGetThreadContextというキーワードはすでに与えたんだがなあ
>>419
ソースのないライブラリの奥底で呼ぶことはできんでしょ。
>>420
それはインラインアセンブラでesp見るのも同じでしょ
InvalidateRectでたとえばA(0,0)-(20,15)、B(100,0)-(20,115)の二つの領域をアップデートしたいのですが、

InvalidateRect(hwnd, A, TRUE);
InvalidateRect(hwnd, B, FALSE);

とすると、両方とも背景が消去されてちらついてしまいます。
それぞれのInvalidateRectにUpdateWindowを挟むと
WM_PAINTを二回呼び出す事になって無駄が多すぎます。

何か良い手はないでしょうか
WM_ERASEBKGNDをどうにかする。
>>422
そこでInvalidateRgn()の登場ですよ
タスクバーのように、デスクトップの作業領域を少し狭めたいと思っています。
RECT r = DefaultWorkArea;
// r設定
SystemParametersInfo(SPI_SETWORKAREA, 0, &r, SPIF_SENDCHANGE);
とかやってみたのですが、少し足りない感じです。たとえば、最大化していて
スクリーンセーバーになり、セキュリティの関係でログオン画面に戻る設定に
してあると(今使ってるのはXP)、再びログオンしたときに最大化していた
ウィンドウがめり込んでいます。
何が足りないのでしょう。
AppBarかDeskBandにしとけば?
そもそもタスクバーとかは特別なウィンドウなんですか。
じゃあしょうがないのかなー。
今やってるのはランチャーの改造です。
具体的にはNCW。やっぱソース公開していただくとありがたいですね。
>>426が言うように SHAppBarMessage の説明みて AppBar にするのが吉。
ini関連のAPIについての質問です。
GetPrivateProfile〜やWritePrivateProfile〜は、WinNT系OSでは
レジストリにマッピングされることがあるそうですが、実際上
どのくらいの頻度でそのような設定になっているのでしょうか?
頻度ってなんじゃ?
3回に1回はiniに書き込まれたりするのか?
何かすごく勘違いしている模様だ
WindowsAPIを使う上でWindows特有の型がたくさんあるわけですが
文字列ひとつとってもPTSTR、PCTSTR、LPCSTR、LPSTRなどなど
この辺の変数を使うときに、結構適当な扱いをしても動いてしまうため
もしかすると間違ったまま使っているかもしれません

型定義について詳しく正確に書かれているWEBや本はないでしょうか?
探した範囲では、どの資料も正確さに欠けていて
いまいち期待通りのものがありませんでした

一度きちんと勉強したいので・・・
433429:04/08/31 20:17
申し訳ありません。言葉がなっておりませんでした。先ほどの質問の
意図するところは、「ini関連のAPIにおいて、レジストリにマッピング
される条件はどのようなものか確認したい」ということです。Platform
SDKのヘルプを見る限りでは、私は「独自にiniファイルを作った場合
にはレジストリには書き込まない」という解釈を行ったのですが、
それでよろしいでしょうか。
>>432
ヘッダを読めば?
>>422
というか、レジストリにマッピングするためにはそのように設定しなきゃ
ならない。そう設定しない限りはマッピングされない。
>>432
MSDNに全部書いてある。
俺、TCHAR * と const TCHAR * しか使ってないや…
LPSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters.
LPWSTR Pointer to a null-terminated string of 16-bit Unicode characters.
LPTSTR An LPWSTR ifUNICODE is defined, an LPSTR otherwise.

LPCSTR Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters.
LPCWSTR Pointer to a constant null-terminated string of 16-bit Unicode characters.
LPCTSTR An LPCWSTR ifUNICODE is defined, an LPCSTR otherwise.
↑LPを脳内でルプって呼んでたけどやっぱエルなんだ。>>432のばか
InitCommonControlsExにICC_STANDARD_CLASSES渡したら
失敗する・・・。
というか、このフラグに何の意味あるのか分からんが。
>>440
Win98だけど別に失敗はしないよ。

> ICC_STANDARD_CLASSES
> Load one of the intrinsic User32 control classes.
> The user controls include button, edit, static, listbox, combobox, and scrollbar.
確かにわざわざ指定する意味はないように思えるね。
そうですか、動きますか
うちはXPなんですが
manifestでコモンコントロールを6.0.0.0に指定してるのが
いけないんだろうか
ググってもそれらしい情報ないし、
それともうちの環境が変なだけなのかもしれない
443デフォルトの名無しさん:04/09/01 09:17
RichEditコントロールで保持しているRTFフォーマットのサイズを取得したいのですが、、
現状ではコールバックではデータをファイルに書き込まず、
コールバックに渡されるサイズを合計して合計を求めていますが効率がいいとは言えません。
もっと他にサイズを求める手段はありますか?

RTFデータをファイルに単体のRTFファイルとして書き込むのではなく、
メモリーに出力する為の確保するメモリ量を知りたいんです。
コントロールパネルに表示されるアイテムのコメントや、
ごみ箱内のファイルの「元の場所」や「削除した日」を取得するAPIってありますか?
445デフォルトの名無しさん:04/09/01 10:04
質問です。

SendMessage(hWnd, WM_GETTEXT, 256, lpszTmp);
とやって、他アプリケーションのエディットコントロール内の文字列を取得してみようと試みました。
メモ帳やEdMax(フリーメーラー)のものは簡単に取得できたのですが、
IEやOutLookのエディットコントロールから取得しようとすると""が返って来てしまいます。

例えばIEでGoogleで検索文字列を入れる部分などです。
IEなどのMS製品は、何か特殊なことがされていて、取得できないのでしょうか?
>>445
そもそも、IEの入力フォームがウィンドウかどうかって問題があるが・・・

spy++で試したが、どうもウィンドウじゃなさげ
447デフォルトの名無しさん:04/09/01 10:15
>>444
IShellFolder2::GetDetailsOf ?
>>445
わかってるかとは思うが他のアプリに素のSendMessageは
巻き込まれキケンのおそれ。質問に関係ないけど一応。
>>445
CB_GETEDITSEL
EM_GETTEXTEX
あたりは試した?試して報告してみて。
>>446
エディットコントロールって言ってるんだから、アドレスバーとかの話じゃないの?
アドレスバーだったら、コンボボックスだから、さらにその中のエディットコントロールを
取得しないとダメだったきがする。
451446:04/09/01 10:34
>>450
>例えばIEでGoogleで検索文字列を入れる部分などです。
って、あったのでフォームかな?、と

よく考えれば、Googleツールバーてのもあったな
漏れは使ってないけど・・・
452デフォルトの名無しさん:04/09/01 10:40
test
453デフォルトの名無しさん:04/09/01 10:45
test
454444:04/09/01 11:00
>>447
ありがとうございます。期待どおりの結果を取得できました。
ビットマップについて質問です。

BITMAPINFOの説明なのですが、biCompressionがBI_RGBの場合、
bmiColorsはNULLであると言う説明がいまいちわかりません。
bmiColors[0]の各要素が0である事を指すのか、それともbmiColors自体が存在しないで
メモリイメージはBITMAPINFOHEADERと同一のものに鳴るのか、どちらなのでしょうか?
456デフォルトの名無しさん:04/09/01 11:08
やや、ありがとうございます

>>446
なんと、ウインドウではないのですか?
hWndはとれて、SendMessageでWM_CHARなどを送ると反応するので、Windowだと思いますが

>>449
他アプリに勝手に干渉するあたり、危険は承知です

>>449
今から試してみます

>>450-451
やや、失礼しました。フォームのことです。
>>456
君はプログラマの素養がないので、今すぐあきらめた方がいいな。
>>457
ヤメレ、無駄に煽るのは。
>>446での指摘の通り、どうも普通のウインドウではなさげです。
>>449での指摘の通り、通常のウィンドウとは違く、リッチテキストかもしれません。
リッチかな?という方向で調査してみようと思います。

特になければしばらく調査ですのでカキコしないと思いますが、
何か情報ありましたらよろしくお願いいたします。ここ自体は見ていますので。
>>459
リッチテキストですらないけどな。
たとえばゲームの中のメニューの内容を外部のアプリケーションから取得できるか?

IEのウインドウからDOMを取得して構造解析するしかない。
461446:04/09/01 12:25
>>459
フォームに値を設定・取得することなら
IEコンポーネント使えばいける

IEコンポーネントスレなくなっちゃってるんで、
過去ログだが、この辺読むと少しは分かるかも

http://pc5.2ch.net/tech/kako/982/982930049.html
>>455
なんかまるっきり間違ってるが、どこの何を参考にした?
>>462
どこが間違っているのかわっぱり見当つきません。
よろしければ教えてもらえませんか?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_1rw2.asp
biBitCount
16 If the biCompression member of the BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL.
24 The bitmap has a maximum of 2^24 colors, and the bmiColors member of BITMAPINFO is NULL.
32 If the biCompression member of the BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL.

です。

非パレットベースのビットマップファイルの場合はRGBQUADに相当するデータが存在しないのはわかるのですが
DIB関数に渡すときはどう指定するべきなのかが分からないんです。
>>463
一般にbmiColorsが必要ない場合にはBITMAPINFOHEADERを確保して、それへのポインタをBITMAPINFO*にキャストする。

ただし、biBitCountが16以上で、biCompressionがBI_RGBであってもbiClrUsedが0でないの場合にはbmiColorsが使用される。
MFCを使わないで分割ウィンドウを作るにはどうしたらいいのでしょうか?
MFCを使えばCSplitterWndで出来るようなのですが使わない場合については
わかりません。
やり方のわかる方、説明お願いします。
>>456
SendMessageTimeoutとかモアベターよぐらいの意味>危険
PostMessage()でいいやん?
>>468 ハァ?

って言えばいいのかな。
470465:04/09/02 07:51
>>467
ありがとうございます。
教えてもらったページを参考にやってみたいと思います。
タスクバーもどきを作りたいのですが、
他プロセスのウインドウのアイコンの取得方法がわかりません。
検索キーワードとかでもいいのでヒントだけでもお願いします。
472デフォルトの名無しさん:04/09/02 16:01
WindowProc(メッセージ処理コールバック関数)に渡されるメッセージID(uMsg)をメッセージ文字列に変換する関数はありますか?
例えば、WM_CREATEなら"WM_CREATE"にするような。
イベントの発生状況を知りたいのだけれど、数値IDだと読み解くのがめんどくさい。
>>472
API としては存在しないと思うので、
http://cvs.sourceforge.net/viewcvs.py/peace/peace/dll/ui.so/dumpmessage.c?rev=1.4&view=markup
からコピペで。
474デフォルトの名無しさん:04/09/02 16:13
>>473
うおっ、速攻ありがとう。
やはり無いのか。。。。それ使います。サンクス!
セーフモードで起動したときも、
自作プログラムを自動実行させられる手段ってないのでしょうか?
>>475
ウイルスでも作るつもりか糞野郎
簡単に釣られすぎ。
478デフォルトの名無しさん:04/09/02 16:59
>>471
思い切り勘だけで答えると
1.プロセスからモジュール取得(EnumProcessModuleとか?)

2.モジュールからアイコン取得(SHGetFileInfoとかLoadIconとか?)
という手順かなあ?
外してたらごめんな
>475
何しぇるために必要なのかにゃ?
DrawCaptionつー、わりとまんまなAPIがあったりするわけだが。使ったことないから詳細は知らんが。
481475:04/09/02 17:15
普段、特殊な認証をして社内のリソースに繋いでいるんですが、
マシンのメンテの時にそれをいちいち手動でやらなきゃいけないので。
マシンの数が多いんですよ。

方法がないんだったらしようがないんですが。
意味がわからん。
セーフモードにしてメンテする理由がわからん
>>475
漏れはこれ、ないって認識なんだがそれであってる?他の人。
(あっても内容を答える必要はないと思うが。)
ウィルス駆除とかじゃないの?
>>484
2個ほど思いついたけど。
Tで設定するのとSの設定変えるのと。
487486:04/09/02 17:48
本当に出来るかは試したことないからわからないです
>>478
それだと目的のウインドウで使われているアイコンと関係ないアイコンしか取れないですよね
DLL Injection使うしかないんでしょうか
>>488
普通に WM_GETICON じゃダメなんですか?
490デフォルトの名無しさん:04/09/02 19:39
EXCELでAPI使いたいんですが、
APIビューアがないんです。
どこにあるんでしょうか?
491デフォルトの名無しさん:04/09/02 20:59
SetWindowRgnでキャラクタの形をしたウインドウを作りました。
そこに時刻を表示して、今では時計の役割をしています。
非常に愛着があって、いつも画面の右上に置いているのですが少し問題が
あります。
パソコンを起動するたびに、このEXEを実行する必要があるのです。

この問題を解決する方法はないでしょうか。
表示位置はINIファイルに記憶しているので大丈夫です。
スタートアップ
>>490
探してみれ。そして見つかった場所をここに書き込め。
IEってどういった描画の構造をとっているんでしょうか?
BeginPaintとEndPaintをフックしてWM_PAINTを投げてみたのですが、
全く描画されないばかりかフックした関数が呼ばれません。
メモ帳などではきちんとフックに成功してるんですが・・・
普段 SendMessage の WM_CHAR を使ってキーイベントを送っていたのですが、
とあるアプリケーションがどうやら DirectInput でキーを拾っているようで、
SendMessage では反応してくれません。
こういう場合、どういう API でキーを送ればいいでしょうか?
keybd_eventは反応したっけ
CreateDIBSectionで作った画面が何故か真っ黒なんだけどどこでも指定したつもりはないんだけど
どうゆうことでしょう?
498デフォルトの名無しさん:04/09/02 21:47
age
>>496
keybd_even も反応しないみたいです。
>>494
IE のブラウザ部分は全てオフスクリーンに描画して画面へ転送ってな感じでやってるみたいです。
(除く windowless に対応していない ActiveX の部分)

ページの中身の絵が欲しいのなら、WebBrowser コントロールで表示して GetDocument した
IHTMLDocument (?) あたりで OleDraw すると描けたような記憶があります。
また、時間と興味があるなら、IHTMLPainter インタフェイス辺りから調べていくのもアリかもしれません。

でも BeginPaint も呼んでいないってのは面白いですね。
>>497
どうなってれば納得できます?

で、黒ってデータ(数値)としてはどうなってると思います?
>>497
Windows 9X、Millenium ではゴミデータが入ってたような気がする。
NT 系の OS ではセキュリティ上の配慮のため、確保されたメモリは既にクリアされてる。
>>499
>keybd_even も反応しないみたいです。

反応するよ。
仮想キーコードじゃなくてスキャンコードを送信すればいい。
dinput.hに書いてある、仮想キーマクロ DIK_????? を参考にしてみれ。
ちなみにキーボードデバイスでサポートしてないキー入力送信は無理。
英語キーボードの「半角/全角」キーに相当するアンサン・グラブ(DIK_)は、
日本語キーボード環境だとうまくDirectInputに送信できない。

「A」キーのキー入力を送信する例:
#include <dinput.h>
WORD key = DIK_A;
keybd_event(0, key, 0, 0);
keybd_event(0, key, KEYEVENTF_KEYUP, 0);
504デフォルトの名無しさん:04/09/02 22:36
>>501,502
画面全体が真っ白になって欲しいです。
メモリはクリアされていて黒ってことはデータ的には0が入っているってことですかな?

具体的に白くするにはどうすればいいんだろ。
>>504

24ビットDIBSectionなら

FillMemory(lpPixel, iWidth * iHeight * 3, 0xff);

とか(lpPixelがピクセル列のバッファの先頭アドレスね)。
>>505
あー。なるほど。32で作ってましたけど出来ました。thx!
>>503
おーなるほど。これで上手くいきました。
あとは文字列からスキャンコードへの変換ルーチン書けば行けそうです。
ありがとうございました。
つーか、WM_PAINTを横取りしようと思うと無効領域も手当てせんといかんやろ。
>>508
乗っ取ったFakeBeginPaintで領域を制限しなければ良いと思うんだけど、、、

HDC FakeDC = ...;
HDC WINAPI FakeBeginPaint(HWND hwnd, PAINTSTRUCT* ps)
{
 ::ZeroMemory(ps, sizeof PAINTSTRUCT);
 ::GetClientRect(hwnd, &ps->rcPaint);
 return ps->hdc = FakeDC;
}
なんだかこちらのスレに誘導されたので、失礼します。
http://pc5.2ch.net/test/read.cgi/tech/1093996761/41-42

なんだかこっちでもスレ違いな気がして気が引けます…
スレは違わないと思う。
512デフォルトの名無しさん:04/09/03 03:44
プログラムになにか法則みたいなものありますか?

これを書いたらこれを書けみたいな

513デフォルトの名無しさん:04/09/03 04:11
(を書いたら)を書け。
[を書いたら]を書け。
ぬるぽを書いたらぬるぽを書け。
>>514
ガッ
右の頬をかいたら左の頬をかけ。
「たらちねの」の次には「母」と書け
「真剣」と書いたらマジと読め
拝啓と書いたら敬具と書け
肉を煮込んだら灰汁を取り除け
鰹節をかいたら鍋を火にかけ
「姉さん」と書いたら「事件です」と書け
流れをぶったぎって失礼します。
RegisterClassにわたすクラス名は
ユニークでなければいけませんか?
524523:04/09/03 11:26
しっかり書いてありました。
すみません、すみません。
恥をかいたら頭を掻け
526デフォルトの名無しさん:04/09/03 12:32
BitBltとかStretchBltで、転送元、先のHBITMAPが同じでも大丈夫なんでしょうか。
画面のスクロールの処理の時に、そうなってしまうのですが。
>>526
スクロールの方向によってはえらいことになる。
528526:04/09/03 12:45
>>527
詳しくお願いします。
方向ということは、もしかしたら、端を飛び越したときとかですかね。
なぜ転送先にHBITMAPが?
530526:04/09/03 12:51
>>529
言葉が足りませんでした。SelectObjectしたHDCです。
531526:04/09/03 13:00
>>529>>530
あっ、そういう意味ではないですね。
裏ビットマップに書きたいのでHBITMAPと言いました。

スクロール前の裏ビットマップの、スクロールしても残る位置を、
同じ裏ビットマップに描いて、残りを部分は新たに描くという感じです。
>>528
527じゃないが

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for(int i = 0; i < 9; ++i)
a[i + 1] = a[i];

多分こんなようなことになると思う。
そういうことなら、「重なる部分は自分で考慮しないと何が起こるかわからん」が答えでないかと。
重ならない領域の転送なら、なんも問題無いよ。
んなもんBitBlt側で考慮してくれて、重なろうが問題なさそうだけど。
MoveMemoryみたく。
535526:04/09/03 13:15
>>532
詳しく説明していただき、ありがとうございました。

>>533
自分もそんな感じに考えていました。
変更前の物を転送した後に、変更されるならいいのですが、
逆だとどうなるのかなと。実験してみます。
536526:04/09/03 13:16
>>534
そうだといいのですが。実験してみます。
スクロール操作だとわかるならScrollDCすればいいんじゃないんですか?
538526:04/09/03 13:34
おなじHBITMAPだと絵が変更されていませんでした。戻り値は正常でした。
ただ、別のプログラム中に、強引に作ったので、
ちゃんとすればできるかもしれません。

>>537
ありがとうございます。調べてみます。
質問です。
デスクトップカレンダーのように、常に背景に表示されているソフトを作りたいと考えています。
「常に最背面に表示」はできるようになったのですが、
「デスクトップの表示」ボタンを押すと隠れてしまいます。
何かいい方法はないでしょうか。
MFCで作ったアプリって、別段ライブラリを一緒に配布したりしなくても動きますか?
541526:04/09/03 13:42
>>537
RECTが分からないので勉強してみます。
>>540
faq

static link
>>539
壁紙をカレンダーに摩り替える。
544(・∀・)ニヤニヤ:04/09/03 13:54
>>539
WM_SIZEで最小化されたことを検知して、
自分で元に戻してやればいいんじゃねーの?
>>542
そのものに組み込めと言うことですか・・・
MFCってMSのライブラリのくせに、標準じゃないんでしょうか・・・
イヤだったら付けずに出して、「動かない」と文句言ってきた客には
「あなたの環境は標準的ではありません」と突っ返せばよし。
>>545
スレ違いだ

MFCスレに行きやがれ
>>545
パソコンは起動時にWINDOWS.EXEを実行して起動されます。MFCはこの中にはいっています。
それでも動かないのならあなたは不正なVisualStudioを使っていることになります。
恐らくコピー版を使っていると思われるのでMicrosoftに通告しときます。ご愁傷様でした。
すんません
お騒がせしました
550539:04/09/03 14:16
>> 543
新しい壁紙にすると、カレンダーをD&Dで移動させるときに難しそうなので避けてました。

>>544
「デスクトップの表示」ボタンを押したときには、WM_SIZEのメッセージはこないみたいです。

そういえば、自分のパソコンに始めから付いていたDrag'n Drop CDも、
デスクトップの表示ボタンを押すと消える。
別の何かを開くと、復活するけど。
同じような現象なのかな。
552539:04/09/03 14:32
>> 551
同じ現象だと思います。
例えばSamurizeなんかは理想の挙動になっているのですが・・・
>>552
spy++でどんなメッセージが来てるか調べれば?
554539:04/09/03 14:48
>>553
はい。調べました。
「デスクトップの表示」ボタンを押してもメッセージは送られていないようです。
>>554
本当に調べた?
思いっきりWM_SIZE送られてるんだけど。
WM_SIZE(SIZE_MINIMIZEDとSIZE_RESTORED)がキッチリ来るな。
何を調べたのかと(ry
557539:04/09/03 15:30
>>555
>>556
すいません。確認してみたら、普通のアプリケーションだったらメッセージがくるようですね。
調査不測でした。

調べてみたところ、私のプログラムでは親ウィンドウを作成する際に、WS_EX_TOOLWINDOWを指定していたため、
子ウィンドウにWM_SIZEがこなかったようです。
(WS_EX_TOOLWINDOWを指定したのは、親ウィンドウをタスクバーに表示させない為です)

ここら辺を直せばメッセージをキャッチできそうですね。
お手数おかけしました。
mallocと書いても、freeと書かなくてもよい
windows.exeって何
>>559
windows.comのこと?
windows.mpg
562560:04/09/03 20:38
win.comだったorz
MFCって別の(ry

一応、張っておきますね
■MFC相談室 mfc11.dll■
ttp://pc5.2ch.net/test/read.cgi/tech/1088084875/
int型の変数をTextOutで描画しようとするとエラーになってしまうのですが、
intを描画するにはどうすればいいですか?
>563
wsprintf
565デフォルトの名無しさん:04/09/04 01:16
>564
sptintfとの違いはあるのでしょうか?

それと、MFC使うよりもWin32APIで作った方がプログラム実行が僅かに
速いって本当なんでしょうか?
wsprintfはfloat使えないぞ!気をつけろ!

> プログラム実行

何のプログラムだ?
本日のマツケンショーのプログラムでは最後にマツケンサンバが入っています。
568デフォルトの名無しさん:04/09/04 01:57
画面を描画するのに、
CreateCompatibleBitmapやCreateCompatibleDC
で裏画面を作成し描画しているのですが、
画面全体を新たに再描画(真っ白に)する場合、
それまで使っていた裏画面を破棄して新しくメモリを作成する方法と、
画面を背景の色で塗りつぶす(FillRectとかそんな感じで)方法があると思うのですが、
どちらが速いのでしょう??
環境はWinXP+VC6.0+APIです。
>>565
MFC固有のdllの初回読み込み(OS起動以後)に時間がかかるってだけでしょ。
2回目以降の起動ではほとんど関係ないかと。
実行パフォーマンスを理由にしてMFCを使わないというのは稀。
2次配布問題やファイルサイズ・カスタマイズ効率の面からMFCを使わないというのはあるけど。
ウィンドウプロシージャべた書きでいけるような極単純なものならMFC使わないほうがほんの少し効率がいいんじゃないか?
大して意味はないレベルにせよMFCのウィンドウ−C++オブジェクトマッピングはコスト0じゃない。
定番の言い方だと、体感できるほどの差ではない、かな。
572568:04/09/04 03:59
>>571
どちらでも大差無いって感じですかね。
MFCはサンクじゃなくてマップを使ってるから
検索の分遅いんじゃないか?
>>568
後者・・・じゃないかなぁ。
せっかくだから、測定してみるといいんじゃない?
それ以前にCreateCompatibleBitmapで作成したてのビットマップって何色かで塗りつぶされてる保証なんかあったか?
どのみち作成後に塗りつぶすなら再作成の意味は無い気がするんだが。
>>575
NT系ならセキュリティ上の理由から塗りつぶされてると思うが
期待しちゃいけない気がするな
577568:04/09/04 17:00
そうですね,確かにCreateCompatibleBitmapの後に塗りつぶしてましたorz
FillRectで塗りつぶす方法で良さそうですね.

あと話が変わるのですが,
複数のウインドウプロシージャで変数を共有したいのですが,
どうすればよいでしょう?
変数のポインタを渡せば良さそうなのですが,
どこで渡せばいいのやら・・・
>どこで
好きなところで。

グローバルにしてもいいし、
上位のオブジェクト(たとえばアプリケーションクラスのインスタンス)とかに持たせて、
その上位オブジェクト経由でアクセスするとか。

どちらも嫌な場合は、CreateWindowの最後の引数とか。
> 複数のウインドウプロシージャで

複数のウィンドウクラス間で、ということ?
580568:04/09/04 17:42
>>578
今はグローバルで宣言していますが,変数が多くなってきたので
クラスか構造体のポインタを他のプロシージャに渡せればいいなと思いました.
とりあえず,CreateWindowの最後の引数に渡す方法をやってみます.
>>577
速さを気にするんだったらブラシ用意してFillRectより、CDC::FillSolidRectみたいに
SetBkColor→ExtTextOutの方が速いはず。
>>581
あれ、背景色を元に戻してないよな。
いいのかMicrosoftがそんなことで…
まぁ、塗りつぶしに使いたい色=背景色にしたい色って状況のほうが多いだろう、と。
でも、一言注意書いといて欲しいよな。
少なくとも 2001/10以降のMSDNには
 >メ モ FillSolidRect を呼び出すと、以前に SetBkColor を使って設定した背景色が、
 >clr で指定した色に設定されます。
と書いてあるケドナー
MSDNはネットで見ろってことなんだろ。
よろしくお願いします。
プログラム実行中に Windows が休止状態に入った場合、その状態から
復帰した後に特別な作業を行いたいんですが、これを感知する方法が
あれば教えてください。
動作させたい OS は Windows 2000 SP4 です。
wm_powerbroadcastとかなんとか
他のアプリケーションにメッセージを送るにはどうすればいいですか?
メッセージを送ればいい。
メッセージを送りたいアプリのHWNDを取得して
SendMessage() でいいんでしょうか・・・?

取り合えずHWND取得からやってみます。
ありがとでした。
ただしポインタが絡むものは普通に送っても無駄だからな。
システムイメージリストについて教えてください。
これはアプリケーションが破棄してはいけないと言われますが、
(9x系だけかな?)それって全部のプロセスで中身が共通だからですよね?

と言う事は、アプリケーションから勝手にアイコンを登録したりすると
再起動するまで残りつづけるって事なんですか?
2000では破棄しても問題ないし、アイコンを好きなだけ追加しても
プロセスを起動しなおすと中身が初期化されています。

それでもやっぱりいじらない方がいいと思うのですが、
システムイメージリストとアプリケーション独自のアイコンを
ひとつのツリービューやツールバーで利用したい場合、
どうするのがいいのですか?
質問です。
トップレベルのモードレスダイアログを同時に2つ作成しようとしています。
メッセージループには2つの IsDialogMessage() を組み込んでいるものとします。
このとき、片方のダイアログの上で MessageBox() 等でモーダルダイアログを表示すると、
独自のメッセージループに突入してしまうため、もう片方のモードレスダイアログでは
TABキーによるフォーカスの移動ができなくなってしまいますよね。
スレッドを分ければ解決するのですが、できればマルチスレッドにはしたくないのです。
シングルスレッドでこの問題を回避するいい方法があればご教示ください。
>>592
システムイメージリストから必要なアイコンをコピーして使えばいいだけでは?
595 ◆Z0vd5w812U :04/09/06 00:00
>>593
両方ともモードレスにして、モーダル風にふるまわせれば?
>>593
>もう片方のモードレスダイアログでは

モーダルダイアログを表示したら、モードレスダイアログは inactive なんじゃ・・・
>>593
自前でTABキー等を処理する。
598ほんたま:04/09/06 06:13
おみゃ〜らよ、APIをパブリック名でDLL内から文字列検索すると、
9割方のAPIはヒットする。
だが残る1割のAPIは文字列検索してもヒットしないぞ。
ちゃんとそのDLL内に記述されているのにだ。
これがどういうことかわかるかな?
そんなこともわからんのか
>>598
自分じわかるかな?
>>595
うーん、確かにそういう手もありそうですが…結構面倒になりそうですね。

>>596
最初はアクティブではありませんが、表示されたモーダルダイアログは
もう片方のモードレスダイアログとは被所有関係にないため、
表示中でもアクティブにすることは可能なわけです。

>>597
自前で処理するのは最後の手段かなと思っていたのですが…考えてみます。

レスをいただいた皆さん、どうもありがとうございました。
602593:04/09/06 10:49
>>601>>593 の書き込みでした。
>>601
WH_KEYBOARD のローカルフックで TABキーだけ一括処理する。
Windowsのロックが解除されたことを知るにはどうしたらよいのでしょうか。
LockWorkStationでロックをして
ロックが解除されたら別の処理に移るようにしたいのですが・・・。
605593&601:04/09/06 12:56
>>603
どうもありがとうございます。
自分がローカルフックを使おうとしなかった理由は、
グローバル変数を導入することを避けたい気持ちもあったからです。
でもシングルスレッド限定だとフックを使うのが一番よさそうですね…。
>>604
OpenInputDesktopでwinlogonデスクトップがアクティブかどうか
調べるとか
>>605
グローバル変数なんか必要ないけど? 
608605:04/09/06 14:01
>>607
え…そうなんですか?
モードレスダイアログのハンドルをフックプロシージャに渡すのに必要な気がしますし、
少なくとも SetWindowsHookEx() の戻り値であるハンドルを
フックプロシージャ内の CallNextHookEx() に渡すためには
グローバル変数の導入は避けられないような気がしていたのですが…。
609デフォルトの名無しさん:04/09/06 15:35
あるプロセスがAdministrators権限で動いているとして、子プロセスを別ユーザーで実行したいのですが
その別ユーザーのパスワードを知らない状況でそれは可能でしょうか。
UNIXのsuみたいに、権限をもっているユーザならパスワードがいらない方法を探しています。
お知恵を拝借されてください。
CreateProcessAsUser
のMSDN解説をよく嫁

俺は読んだが分からなかった。スマソ
611586:04/09/06 18:14
>>587
遅くなりましたが今日対象のパソコンで試したところ
WM_POWERBROADCAST で通知を受け取ることができました。
ありがとうございました。
Administrators権限ではそもそも必要な特権がないので
CreateProcessAsUserは無理
2000以降ならCreateProcessWithLogonWでできるけど
これもパスワードが必要
>>607
グローバル変数を使わない方法、私も興味があります。ぜひ教えてください。
>>613
プロセス間通信で共有してもいいし、
今回のケースはローカルフックなんだからハッシュとかに突っ込んでも良い。
んでもって、CallNextHookExは第一引数を無視する。
>>614
調べてみたら、確かにCallNextHookExは第1引数を無視するようですね。
新たな収穫でした。サンクス!!
SetDlgItemTextで自作ダイアログのEDITTEXTに改行されたテキストを送っても
改行されないで表示されてしまいます

スタイルの設定は
ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL
にしてあって、ES_READONLYをES_WANTRETURNにして
手入力すれば改行されるんですが、何が問題なのでしょうか

あと改行に成功してもたぶん1行目の行頭から表示されると思うんですが
最終行を一番下に表示する方法は何かあるのでしょうか
(見た目はチャットウィンドウっぽいものです 機能は全然違いますが・・・)
617616:04/09/07 03:56
すみません、検索の仕方間違えてたようです・・・
\r\nじゃないと改行できないんですね
最初の質問は取り下げさせていただきます

2つ目の質問も
まずEM_SETSELにMAKELONG(0xFFFF, 0xFFFF)渡して
直後にVK_HOMEも送るという方法で回避できましたが、
こんなまどろっこしい方法しかないんでしょうか
>>617
EM_SETSELで最後を選択して、EM_REPLACESELかな?
>>617
良くwカランけど、その2つのコンボって単純に EM_SETSEL に 0, 0 でいいんじゃない?
>>618
何を置換するんですか・・・?NULLを渡したらアクセス違反で落ちました

>>619
それだと1行目の行頭にキャレットが行ってしまいます

やりたいことは、3行表示できるエディットに5行送り込んだとして、
_____
| I1行目
| 2行目
| 3行目        ←こうではなくて(Iはキャレットのつもり)
 ̄ ̄ ̄ ̄ ̄
_____
| 3行目
| 4行目
| I5行目        ←こういう状態にしておきたいんです
 ̄ ̄ ̄ ̄ ̄
621616:04/09/07 14:00
>>618
あーわかりました
EM_SETSEL,MAKELONG(0xFFFF,0xFFFF)でEDITの最後に移動して
EM_REPLACESEL,0,<追加する文字列\r\n>の後VK_HOMEで
望む挙動を実装できました ありがとうございます
EM_SCROLLCARET
623デフォルトの名無しさん:04/09/07 17:49
Win32でCreateWindowにてComboBoxを作成して
それをサブクラス化したのですが
置き換えたコールバックプロシージャに
WM_KEYDOWNが送られてきません。
これはなぜでしょうか?そういう仕様?
キー入力を取得したいので解決法を教えて頂けませんか?

*Edit,Button,ListView,TreeViewなどはちゃんとWM_KEYDOWNが送られてきています。

よろしくお願いします。
624623:04/09/07 17:57
上記にからんだ事なのですが
リソースエディタを使わずに動的にダイアログボックス上のリソースを作成した場合に
Tabキーを押したときに次のリソースにフォーカスが移動という機能を
自分で実装しなければならないために上記のような手段にでました。

親ウィンドウに子リソースのキー入力状況などは通知されないのでしょうか?
WM_NOTIFYなどでNM_KEYDOWNなどはありますが、
あくまでもコモンコントロールであって
Editなどがあてはまらず一貫した実装に出来ません。
一番手っ取り早いのは親にTabキーが押されたことを通知する機能が実装されていれば
よいのですが・・
見た限りないようなので、サブクラス化して子からWM_KEYDOWNのときに
SendMessage(hParent,WM_KEYDOWN, wParam, lParam);
とするぐらいしか方法は思いつきませんでした。

どうしたらよいのでしょうか?
ドロップダウンリストにすりゃ送られてくるだろ。
コンボボックスで送られてこないのは、インプットフォーカスがあるのが
コンボボックスそのものではなくて中にあるエディットだから。

で、ダイアログの機能を実現したいなら
IsDialogMessageとかモードレスダイアログで検索しなさい。
624 CreateWindowでWS_TABSTOP立ってないのでは?
627623:04/09/07 18:51
>>626
セットしてます
ランチャなんかでよくあるような、
起動するとポップアップメニューが出て、項目を選択すると
それに応じた作業をこなした上で終了する、というツールを作りたいんです。
ポップアップメニューだけを表示させるにはどうしたらいいのでしょうか?

今は試しに何もしないウィンドウをCreateWindowしておいて
そのWM_CREATEのところでCreatePopupMenuしてメニューを作成して
TrackPopupMenuした上でPostQuitMessageしてみてるんですが、
当然一瞬何もしないウィンドウが表示されてから終了します。
ウィンドウをSW_SHOWしないでおくと、メニューがカーソルと重なっただけで消えてしまって
メニューを選択できません。
何か上手い方法はないものでしょうか?
>>628
冷やかしは(・∀・)カエレ!!
630628:04/09/07 23:20
>>629
…一応マジなわけですが。
>>628
もう寝るので質問だけ。
PostQuitMessageしている理由は何ですか?
しなければいいのでは?と思うので…
>>631
メニューを選択して、それに応じた作業をこなし次第終了させたいからです。
>>628
0x0か1x1のサイズで作れば見えないんじゃない?
634デフォルトの名無しさん:04/09/08 03:44
C,C++の宿題スレから誘導で来ました。
DLL側のcppファイルに
declspec(dllexport) int flag;
を宣言して、
EXE側のヘッダファイルに
declspec(dllimport) int flag;
を宣言して、cppにインクルードしました。
EXE、DLLの両方で共通のフラグを使おうと思ったのですが、
デバッガでトレースすると、EXE側で1に設定したflagが
DLL側の関数に入るとflagの値が0になってしまいました。
フラグのメモリアドレスを見ると、DLLとEXEで異なっていて
別領域が取られているようです。EXE、DLLの両方で共通の
同じフラグを使用するには、どのようにexport,importをすれば
よいのでしょうか?長くなってすいません。
>>634
フラグ用のインターフェース関数を用意して
exeとdllでのフラグのやり取りはその関数経由で行えば良いのでは?
>>634 こんな感じで。
[exe]
#include "dll.h"
int main(void)
{
printf("%d\n", dll_get_flag());
dll_set_flag(1);
return 0;
}

[dll]
int flag;
dll_get_flag(void){ return flag; }
dll_set_flag(int f){ flag = f; }
>>634の通りやって、ちゃんと意図どおりになったど。
>>635-636
ありがとうございます。libファイルを使って静的リンクさせる場合は
[dll]の関数の頭にdeclspec(dllexport)を宣言すればよいのでしょうか?
639609:04/09/08 13:04
>>610
>>612
ありがとうございます。
なるほど。
ということは、Windowsではパスワード無しでsudoみたいなことをする方法はないって事なんでしょうか?
その辺を調べる方法はないものでしょうかねぇ

#Cygwinにsuってないんだっけ?あるとすれば、その辺のソースをみればいい?
>>639
suだってsudoだってパスワードは必要だろうが。
641639:04/09/08 13:20
上には書いてあるんですが、もちろんどのユーザーからでもということではなくて、
特権をもっている場合でいいんです。
UNIXだったら、rootからsuするのにパスワードいりませんよね?(UNIXというか僕はLinuxしかしらないのですが(汗))
そこから連想して、WindowsだったらAdministratorでできないかなと想像してます。
その辺、できるのかできないのか、できるとしたらどうすればいいのか。
ちょっとでもヒントになりそうなことがあったら、ぜひお教えください。
重ねてお願いします。
>>641
WindowsはUNIXではなくAdministratorはrootではありません。
Administrator権限を持つユーザーでしかないです。
質問です。
メニューから項目を選んでからクライアントエリアをクリックすると
座標値が得られ、それをメッセージボックスで表示させたいんですけど、

メニューの項目を選んだ時点で(クライアントエリアをクリックしてないのに)メッセージボックスが表示されてしまうんです。(座標値は0,0)
こういう場合どういうふうに組んだらいいんでしょうか?
今現在どういう変てこな造りになっているのかわからんとねー
645643:04/09/08 15:52
プログラムは、
case WM_COMMAND:
hMenu = GetMenu(hWnd);
hdc = GetDC(hWnd);
switch (LOWORD(wp)) {
case ZAHYOU:{
  case WM_LBUTTONDOWN:

  pt.x=LOWORD(lp);
  pt.y=HIWORD(lp);
  wsprintf(szBuff,"座標値%d,%d",pt.x,pt.y);
  MessageBox(hWnd,szBuff,"タイトル",MB_OK);
 }
こんな感じなんですが、わかりますでしょうか・・?;}
break;
死ね。
デバイスコンテキストで文字を表示する際に文字のフォントサイズを小さく表示するにはどうすれば
いいのですか?
>>645
わかんにゃい
何をやっているのかさっぱり
>>647
CreateFontして、SelectObject
650デフォルトの名無しさん:04/09/08 19:48
>>649
レスありがとうございます
CreateFontして、SelectObjectを調べてみます
>>643=645
かなり深刻に勘違いしていますので、
C (C++) と Win32 APIの入門書等を見て勉強したほうがよいです。
>645
こんな感じのコードでいいのかな?

// これをどっかに宣言
static bool fViewZahyou = false;

case WM_COMMAND: {
 switch (LOWORD(wp)) {
  case ZAHYOU: {
   // 次のクリックでは座標を得る処理をする、という意味で
   fViewZahyou = true;
   break;
  }
 }
 break;
}

case WM_LBUTTONUP: {
 if (fViewZahyou) {
  pt.x=LOWORD(lp);
  pt.y=HIWORD(lp);
  wsprintf(szBuff,"座標値%d,%d",pt.x,pt.y);
  MessageBox(hWnd,szBuff,"タイトル",MB_OK);
  fViewZahyou = false;
 }
 break;
}

>651 の言う通り、まず C/C++ の文法をしっかり勉強するように。
Windows XP SP2 Platform SDK でまつた。
ttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm
結局ATLのサンクはどうなったのかと。
やっと新SDK出たか
壁紙をクライアントウィンドウに表示したいので
外部画像ファイル(bmpやjpg)をクライアントウィンドウの背景に設定したいのですが
どのようにすればいいでしょうか?

画像 背景などで検索してもリソースから入手するものばかりです。

壁紙の位置を知る方法はレジストリの
マイ コンピュータ\HKEY_CURRENT_USER\Control Panel\Desktop\OriginalWallpaper
から取得する事はわかりましたが
その画像をクライアントウィンドウの背景にする方法がわかりません。

どうか教えてください
WinXPで他のウィンドウのIMEのモードを変えたいのですが、
GetForegroundWindowで取ってきたHWNDをImmGetContextに
入れてもNULLしか返ってきません。自分のウィンドウがたまたま
最前列だった場合は、自分のIME制御はできたのですが、何が足
りないのでしょうか。
>>658
NT系だと他のスレッドのIME監視するの面倒じゃなかったっけ.
>>659
どれでしょうか?
662657:04/09/09 11:27
聞くだけでは失礼だと思ったので
一応>>2のリンク先を見たところ
二つがリンク切れ(一個は表示できない?)でした。

もう二つを見てみましたが
思わしきリンクが見つかりません。
どこのどれを見ればいいか、もしくは検索のヒントを教えてください
664657:04/09/09 11:38
>>663
上下で分かれてて、下の一番上がWin32〜となってたので
下がWin32API用のリンクかと勘違いしてました
上も入ってるんですね。

ちなみに下のリンクは全部みましたが
思わしき内容がありませんでした。

せっかく張っていただいたWin32 API入門では
残念ながらリソースからBMPファイルを読み込む内容しか書かれていませんでした。

今から猫でもわかるプログラミングの方を読んでみます。
>>664
ttp://www.wotsit.org/download.asp?f=bmp
ttp://www.wotsit.org/download.asp?f=lzwexp
ttp://www.wotsit.org/download.asp?f=itu-1150
ttp://www.wotsit.org/download.asp?f=png

あとはSetDIBitsToDevice/CreateDIBSection/BitBlt/StretchBltあたりだ

いまさら教えても文句はいうけどお礼は言わないよということか>メアド欄
相当に失礼な奴だな。
666657:04/09/09 11:46
>>665
何か勘違いをしているようですが
教えてくれている方に向かって文句を言うほどバカではありません。
口は悪いですがリンク先を教えてもらったりしてるだけで心の中ではありがたく思ってます。
更に使用関数の名前まで教えていただき感謝のきわみです。
ありがとうございます
667663:04/09/09 12:03
>>664
http://black.sakura.ne.jp/~third/system/winapi/win.html
・DIB ファイルヘッダ
・DIB 情報ヘッダ
・DIB ピクセルビット
・Windows DIB
・DIB の表示

http://www.kumei.ne.jp/c_lang/index.html
の方は170〜172章

WIN32APIと呼べるかどうか分からんが、
336章にJPEGなども表示できる方法がある(環境限定)

COMだが、JPEGに関してはOleLoadPictureなども使える
>>664
蛇足。心の中でどう思ってようが構わないが表に出すな。
付け加えれば教えてもらってるのに素直にお礼言わないってどういうこった。
頭膿んでるんじゃねぇか?
あの質問を相手にするほうもどうかと思うが。
671657:04/09/09 14:12
>>667さんが>>663さんということは>>665さんは>>663さんじゃないのか…
>667さん、ありがとうございます
とりあえず色々試行錯誤してみます
ではここで新しいPlatformSDKの主な変更点をどうぞ
 ↓
>>672
「新しい Platform SDK」っていう表現は微妙。
単独では使えないし。
バージョンアップしたのがTable/MDAC/MSIだけじゃ
あんまり俺には関係ないな。
>>673
どういう表現ならいいんだ?
ナウい Platform SDK
差分とかじゃないの?
差分てことは新しいってことじゃないのか
新しいってことは差分てことじゃないのか
じゃあ「新しい Platform SDK」という表現でいいな。
改めてどうぞ
 ↓
XP SP2に対応しました。

以上
ポカーン・・・
またこっそり新しいAPI入れてるんでしょ?そうなんでしょ?
古くする差分だったらどうするニダ
>>684
新しいSDK=新しくするSDKって意味じゃないべ。
新しく出たSDKって意味だべ。
>>683
頭おかしいのか?
追加API一覧とかつけてほしいよ
どっかにあったぞ
マジでか
ウソでした
自己解決しました
spy++を使わずに届いたメッセージをフックしてくれるソフトってありますか?
どうも探しても見つかりません。
メッセージをフックした上でメッセージを表示してくれるプログラムです
>>691
おまえ神だろ
なんでspy++じゃだめなの
698デフォルトの名無しさん:04/09/09 19:23
C+Win32APIでウィンドウズアプリケーションを作っているのですが、
最大化できなくする方法(最大化ボタンを無くす)を教えてください。
WNDCLASS.styleにCS_*だと思うのですが、見つかりませんでした。
WS_MAXIMIZEBOX
700698:04/09/09 19:40
>>699
できました。ありがとうございました。
>>696
VC++持ってないので…

>>697
ありがとうございます
702デフォルトの名無しさん:04/09/09 23:09
ステータスバー上にマウスがきたら、マウスアイコンを変更させようとお
もって、WM_MOUSEMOVEが特定の位置にきたらseticonを使用して変えよう
としたのですがうまくいきません。
ステータスバーをcreatewindowexでつくったので、その前にWNDCLASSEX
にステータスバーを処理するためのメッセージ処理関数を登録して
RegisterClassExを実行しました。RegisterClassExの戻り値は0なので
うまくいくはずはないのでしょうが、そもそもこのような手順であってい
るのでしょうか?
>702
ステータスバーというと msctls_statusbar32 の事かな。
もしくは STATUSCLASSNAME か。ってか、同じだけど。
で、メッセージ処理関数を置き換えるという発想は正解。
でも方法は間違い。次のようにする事。

// msctls_statusbar32 オリジナルのプロシージャを退避させておく変数
static WNDPROC original_procedure = 0;
static LRESULT CALLBACK my_statusbar_procedure (HWND .. /* 略 */ ..) {
 /* ここでやりたい事をすればよい */

 /* 重要。自分で処理しないメッセージは必ず元のプロシージャに任せる事! */
 return CallWindowProc (original_procedure, hwnd, msg, wParam, lParam);
}

HWND create_my_statusbar() {
 HWND statusbar = CreateWindowEx ( /*略。普通にステータスバーを作る */ );

 /* こうやってメッセージ処理関数を置き換える */
 original_procedure = (WNDPROC)SetWindowLong (
       statusbar, GWL_WNDPROC, (LONG)my_statusbar_procedure,);

 return statusbar;
}
>>697
それ、Win9x系では死ぬほど重いんだよな…。
705702:04/09/10 00:31
>>703
うまくいきました〜
トンクス!
WirteFileの非同期書き込みって処理がすぐ帰って来るだけで
スレッドセーフなわけではないですよね?
>>706
WriteFile はどう呼び出してもスレッドセーフだよ。
呼び出し側のコンテキストもOS内のステータスも壊れないし、
書いただけちゃんと書かれる。

書き込みを同期化してくれるわけではないけど(先方がデータグラム型ソケットの場合を除く)。
708デフォルトの名無しさん:04/09/10 12:33
SetTimer、KillTimerがありますが、
それのタイマーを0にするAPIがあるなら教えてください。
>>708
ないと思う。

0にしてどうするの?というか、なぜ0にしたいの?
710708:04/09/10 12:44
>>709
例えば、ゲームのカーソルを0.5秒単位に点滅させる処理で、
0.5秒毎にWM_TIMERが発生しますが、
ユーザーが十字キーを動かしたときに、時間を0に戻して、
次からの点滅のタイミングを同じにしたいのです。
KillTimerした後、すぐSetTimerすればそれができると思うのですが、
APIがあればそちらの方がいいかなと。
>>710
ウィンドウに関連付けてるなら、出来そう

以下、MSDNより抜粋
>hWnd パラメータで NULL 以外の値を指定し、
>hWnd パラメータで指定したウィンドウに、
>nIDEvent と同じ値のタイマが既に割り当てられている場合、
>新しいタイマは既存のタイマを置き換えます。

>SetTimer 関数がタイマを置き換えた場合、
>そのタイマはリセットされます。
>したがって、現在のタイムアウト時間が経過すると
>1 つのメッセージが送信されますが、
>それまでのタイムアウト時間は無視されます。
712708:04/09/10 13:26
>>711
詳しくありがとうございます。
KillしてすぐSetする方法でやってみたいと思います。
POPサーバーにアクセスするAPIを教えてくださ
>>712
711を読む限りkillしないてもいいんでない?
>>713
gethostbyname(), socket(), connect(), send(), recv(), close()
MAPI を提供するメーラがあって、そのアカウントが使いたいなら MAPI 経由でもいいかも。
標準スタイルのボタンやチェックボックスはDrawFrameControlで描画できますが、
同様にタブを自前で描画する方法はありませんか?
>>715
あ、それ系のAPIでやるんですか、ありがとー
718デフォルトの名無しさん:04/09/10 14:29:32
>>716
uxtheme
嫌ならボタンの上半分とかでそれらしく描画するしかないな
719708:04/09/10 15:49:06
>>714
それでもいけました。ありがとうございました。
720デフォルトの名無しさん:04/09/10 18:55:29
WM_PAINTがキューにもう一つあるなら、
その回は描画しても無駄なのでスキップする

という処理をしたいのですが上手くいきません
どのようにすれば良いのでしょうか?今はこうやって失敗してます。

case WM_PAINT:{
 MSG m;
 if( PeekMessage( &m, hWnd, WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) return 0;

 //以下描画処理
}
721デフォルトの名無しさん:04/09/10 18:57:17
WM_PAINTはキューにひとつしかないけど何がしたいの?
722デフォルトの名無しさん:04/09/10 18:59:24
システムが勝手に1つにまとめてくれるわけだな
723デフォルトの名無しさん:04/09/10 19:06:15
つーか、ウィンドウの無効領域を自動的にまとめて、暇そうなときにWM_PAINTを発行するんじゃなかったか?
724デフォルトの名無しさん:04/09/10 19:08:42
>>721-722
レスありがとうございます。まとめてくれるんですね。道理で上手くいかないわけだ。

ヘルプ見ても該当の記述が見つからないので、重ねてすいません。
WM_MOUSEMOVEとかならば、この方法で良いのでしょうか?
725デフォルトの名無しさん:04/09/10 19:21:49
APIとSDKはどう違うんですか?
726デフォルトの名無しさん:04/09/10 19:48:18
猫でウインドウに関連付けられているメニューは、ウインドウ破棄と同時に捨てられるみたいな事が書いてあるのですが、

HMENU menu1=CreateMenu();
HWND hwnd1=CreateWindowEx(..., menu1, ...);

HMENU menu2=CreateMenu();
HWND hwnd2=CreateWindowEx(..., menu2, ...);

と二つのオーバーラップウインドウを作った場合、どうも最後に作られたメニューは破棄されるけど
それ以前に作ったメニュー(この場合はmenu1)は破棄されないようなのです。
以下3, 4...と作っていくと、menu2のDestroyMenuが成功するようになります。

何か大きなミスをしているような気がするのですが、ウインドウメニューと破棄の関係について
正確に掛かれているページってどこかに無いでしょうか?
727デフォルトの名無しさん:04/09/10 19:50:57
そのウィンドウに関連付けられたメニューだけが破棄されるのは
分かってるか?
728デフォルトの名無しさん:04/09/10 20:05:35
ウインドウが閉じた(WM_DESTROYが送られた後)タイミングで破棄されるから
明示的に閉じたウインドウ以外は、破棄される前にDestroyMenuが呼ばれてるのかな
だからDestroyMenuが成功してるんだと思う。
729デフォルトの名無しさん:04/09/10 21:33:57
タブコントロールにスライダーコントロールが乗っかっているWINアプリがあるのですが、
このスライダーコントロールを別のWINアプリを作りたいなあと思っています。
このときにスライダーコントロールのハンドルをどうやったら取得できるのでしょうか?
730デフォルトの名無しさん:04/09/10 21:47:18
>>729
自分の書いた文章読んで意味わかるか?
731デフォルトの名無しさん:04/09/10 21:55:48
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
上ので、WndProcはどこで呼び出しているのでしょう。
732デフォルトの名無しさん:04/09/10 21:57:17
ですぱっち
733731:04/09/10 21:59:48
>>732
ありがとうございました。
734デフォルトの名無しさん:04/09/10 22:27:50
>>729
なんかなぞなぞみたいでつ
735デフォルトの名無しさん:04/09/10 22:50:10
>>729
スルーですね。
736デフォルトの名無しさん:04/09/10 23:16:55
SetWindowsHookExを使って"コピーされた"ってのを知りたいんですけど
WH_CALLWNDPROCRETを使ってWM_COPYを見ていればいいんですか?
737デフォルトの名無しさん:04/09/10 23:22:34
だめ
738デフォルトの名無しさん:04/09/10 23:34:33
C+ウィンアプリは、イベントがあるまでOS?で待ちながら、
イベントが発生すると、GetMessageでそれを得て、
TranslateMessageで使いやすく翻訳し、
DispatchMessageでWndProcを呼び出し実行する、
という感じでいいのでしょうか。

また、TranslateMessageとDispatchMessageの引数が、
constポインタなのはなぜでしょう。

TranslateMessageはGetMessageで得たものをポインタで渡し、
中で書き換えるとイメージしたのですが、
constだと書き換えられないような気がするのですが。

また、DispatchMessageは実行するだけだから、
書き換える必要が無く、ポインタで渡す必要が無いと思うのですが。
739デフォルトの名無しさん:04/09/10 23:42:04
TranslateMessageはメッセージを書き換えないで、
WM_(SYS)KEYDOWNからWM_(SYS)CHARを生成したりしてキューにポストする。
書き換えちゃったらKEYDOWN系がこなくなる。
740デフォルトの名無しさん:04/09/10 23:44:47
ポインタなのは構造体コピーより速いから。じゃねーかな。
741738:04/09/10 23:50:43
ありがとうございます。

>>739
そういえば、キーを押した時、2回メッセージが来ているような
気がする事があったのですが、もしかしたらそれかもしれません。

>>740
なるほど。
自分は、引数がNULLでも動く関数の時は、constポインタにする事が
ありますが、そういう利点もあったのですか。
742デフォルトの名無しさん:04/09/10 23:52:05
>>738
> TranslateMessageで使いやすく翻訳し、
TranslateMessageはただWM_KEYDOWN/UPなどからWM_CHARなどのメッセージを作り出しているだけだから、それじゃ間違い。
WM_CHARなどのメッセージが要らなければ、TranslateMessageを呼ぶ必要も無い。

> TranslateMessageはGetMessageで得たものをポインタで渡し、中で書き換えるとイメージしたのですが、
そうじゃない、PostMessage(それかWin内部でごにょごにょ)で送り出すので書き換える必要は無い。

> 書き換える必要が無く、ポインタで渡す必要が無いと思うのですが。
構造体を直接関数の引数にすると、いちいちコピーする時間が掛かる。
なので代わりにポインタ(あるいは参照)にするのごく一般的に行われる。(sizeof (MSG)は28だがsizeof (MSG*)なら4)
その場合、通常の値渡しのように関数に渡した変数の中身が変わらないことを表明するためにconstポインタ(あるいはconst参照)にするのは常識。
743738:04/09/10 23:59:26
>>742
さらに詳しくありがとうございます。
すごく勉強になりました。
744デフォルトの名無しさん:04/09/11 09:57:30
次スレはスレタイにWin64の文字も入れてください
745デフォルトの名無しさん:04/09/11 10:56:10
Win64は別スレにした方がよくね?
746デフォルトの名無しさん:04/09/11 11:05:55
んだ
747デフォルトの名無しさん:04/09/11 11:11:14
>>745
話題が分散するだけで、あんまり意味ないような感じがするけどどうでしょ。
しかも物凄く過疎な予感もするし。16->32みたいにそんなに違うわけでもないし。
748デフォルトの名無しさん:04/09/11 13:20:57
質問する前に、「Win64についてですが・・・」とでも
書き添えてくれるのならいいけど、ここじゃルール守るヤツの方が
少数だからなぁ。
749デフォルトの名無しさん:04/09/11 13:21:40
一緒が良いよ。
750デフォルトの名無しさん:04/09/11 13:49:51
当面は【Win64可】をスレタイに入れればいいんじゃない。
751デフォルトの名無しさん:04/09/11 14:29:10
別でいいよ。
752デフォルトの名無しさん:04/09/11 14:31:49
実際にWin64の質問が増えてからでいいって。
今までほとんど無いんだから今のところ現状維持で。
753デフォルトの名無しさん:04/09/11 14:41:47
ただ単に「WindowsAPI質問箱」にするだけじゃ駄目なん?
754デフォルトの名無しさん:04/09/11 14:49:50
それじゃWinFXも入る予感
755デフォルトの名無しさん:04/09/11 14:58:02
俺の持ってるWindowsプログラミングに関する唯一の本は
パラメータの型としてSIZE_Tとなってるところが、全てDWORDです。
そろそろ新しい版を買えことかな。AdvancedWindows3edです。
756デフォルトの名無しさん:04/09/11 14:58:57
( ´_ゝ`)フーン
757デフォルトの名無しさん:04/09/11 15:25:01
マウスボタンをLR同時押しするとWM_*BUTTON〜メッセージが来ないマウスと、
両方通知されるマウスがある。
ハード依存なのか、それともドライバなのかなぁ。
何か情報ないでしょうか?
758デフォルトの名無しさん:04/09/11 15:26:28
どっちもありうる
759757:04/09/11 15:42:00
ドライバだった。
同時押し時にホイールとして機能するようになってたよorz
760デフォルトの名無しさん:04/09/11 18:29:07
Cのウィンアプリで、コールバックを使わずに組むのはダメなのでしょうか。
以下のプログラムのような感じなのですが。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1086258254&res=6

うまく言えないのですが、タイトルの時は、タイトルの処理だけに当たり
フィールドの時は、フィールドの処理だけとしたいのです。
普通のやり方だと、グローバル変数、static変数を
使わなければいけない所もでてきてしまいます。
手続き型っぽくしたいのです。
761デフォルトの名無しさん:04/09/11 18:46:09
ウィンアプリはイベントドンブリが基本だから、
注文したカツどんがすぐ出てくるとは限らないぞ
762デフォルトの名無しさん:04/09/11 19:18:46
>>760
ゲーム進行用のスレッドを作ってそこであれこれやるのじゃだめか?
763760:04/09/11 19:35:53
>>761
詳しくお願いします。

>>762
スレッドが難しくて分からないです。
眼で追いやすい手続きっぽいのがいいです。
764デフォルトの名無しさん:04/09/11 19:48:04
>>755
DEPなんて影も形もなかったころから将来PAGE_EXECUTEをサポートする
プロセッサが現れるかもしれないからちゃんとVirtualProtectしておけと
書いてありましたね。
765デフォルトの名無しさん:04/09/11 20:30:50
LR同時押しは依存症
766デフォルトの名無しさん:04/09/11 20:44:48
>>764
あれはいい本だ。ところで
ttp://www.wintellect.com/about/instructors/richter/prog_apps.aspx
に第4版の訂正が載っていて、
「DLL の注入と API フック」の章では
オリジナルでは単に WriteProcessMemory だけだったが、
VirtualProtect で PAGE_EXECUTE_READWRITE を設定しろと書いてある。

この訂正の理由が DEP 関係なら理解できるんだけど
> The sample fails to hooks some applications.
「一部のアプリで失敗する」っていう理由がよく分からない。
同じ環境でも成功するアプリと失敗するアプリがあるの? なんで?
767デフォルトの名無しさん:04/09/11 22:52:46
WS_EX_CLIENTEDGEのスタイルを指定したときの内側の枠の幅はどうやれば取得できるのでしょうか?
EDITとかに好みのフォントを設定した後、最適な高さにリサイズしたいのですが、
GetTextMetricsではフォントグリフの高さしか取得できず、ウインドウをその高さにリサイズすると
当然文字が欠けてしまいます。
768デフォルトの名無しさん:04/09/11 22:57:15
化けるわけないじゃん
769デフォルトの名無しさん:04/09/11 23:34:48
>>767
GetWindowRect()
GetClientRect()
ClientToScreen()
これらを使えばスタイルが変わってもプロシージャの使いまわしが化膿。
770デフォルトの名無しさん:04/09/12 00:19:59
透過転送を使いたいがためだけにイメージリストを使うのってアリですか?
771デフォルトの名無しさん:04/09/12 03:14:14
SendInput関数・INPUT構造体について質問です。
これを使用したいのですが、なぜかコンパイルエラーに
なってしまいます。ヘッダにしっかりと定義の記述があるのですが、
「error C2065: INPUT' : 定義されていない識別子です。」
のようなエラーになってしまいます。user32.libなども、
読み込む設定になっています。

どうすればよいでしょうか?

環境
winxp vc6.0 sp6
772デフォルトの名無しさん:04/09/12 03:40:19
>>771
#if (_WIN32_WINNT > 0x0400)
773デフォルトの名無しさん:04/09/12 03:41:29
>>771
_WIN32_WINNT
774773:04/09/12 03:42:03
すまん、かぶった
775デフォルトの名無しさん:04/09/12 03:55:54
_WIN32_WINNT 0x0500 と定義してあります。
それでも、ダメなようです。

変数の.を打ち込んだときに、リストは出てきます。
(インテリジェンス機能?)

それでも、コンパイルが通らないんです…。
776デフォルトの名無しさん:04/09/12 04:04:43
>>775
ヘッダのインクルードより前に#defineしてるか?
777760:04/09/12 08:49:46
>>760の書き方はなぜいけないかまだ分かりません。

HandleTitleの所のメッセージチェックの所に、
DispatchMessage(&msg);を書いて、
WndProcにif(game == Title)を条件に、
そのメッセージチェックを書けば同じ処理になると思うのですが。

DispatchMessageが、ただWndProcに行くだけと考えているので
そう書いたのですが、他にも何か処理をしているのでしょうか。
778デフォルトの名無しさん:04/09/12 08:58:47
モードレスダイアログをたくさん開いているとき、
IsDialogMessage(hwnd)をダイアログの数だけ実行するのですか?
それともNULLとかを指定すれば自動ですべてのウインドウに適用されるのでしょうか?
779デフォルトの名無しさん:04/09/12 12:29:53
>>777
世の中にはメッセージキューにたまらないで直接WndProcへ行くメッセージもあるからな。
(つまりGetMessageからじゃ取り出せない)
780デフォルトの名無しさん:04/09/12 12:43:51
>779 に先に簡潔に書かれちゃったけど,どうせ書いたから書き込んじゃえw

>777
きみはゲームで使うウィンドウを作るために RegisterClass(Ex) でウィンドウクラスを登録するだろうから
どうしても WndProc コールバック関数を書く必要がある。

それに上等なゲームなら欠かせないいくつかのメッセージは SendMessage() で送られて来る。
それらはメッセージキューにポストされるものではなく,つまり GetMessage()〜DispatchMessage() を
通過せず直接コールバックを呼ぶもののはず (だよね?少なくとも,今の時点では致命的な間違いではないはず)。
例えば WM_MOUSEACTIVATE,WM_CAPTURECHANGED,WM_ERASEBKGND,それに WM_(QUERY)ENDSESSION。
(他にも SendMessage で送られて来るものは多数)
マルチタスク環境にてユーザに親切なゲームを作りたいなら,これらのメッセージも的確に処理するべき。
781デフォルトの名無しさん:04/09/12 13:06:07
>760==777
ゲームで使う色々な変数だが,グローバル変数を使うのがいやなら
構造体にまとめて SetWindowLong() で GWL_USERDATA にでも入れておけばいい。
WndProc の中で GetWindowLong() で取り出すんだ。

入れるタイミングは,そうだね,WM_NCCREATE でどうだ。
 if (msg == WM_NCCREATE) {
  SetWindowLong(hwnd, GWL_USERDATA, (LONG)new GameData());
  return 0;
 }

破棄するのは WM_DESTROY でもいいだろう。
 if (msg == WM_DESTROY) {
  GameData *gameData = (GameData *)GetWindowLong(hwnd, GWL_USERDATA);
  delete gameData;
  SetWindowLong(hwnd, GWL_USERDATA, 0); // 安全のためにな
  PostQuitMessage(0);
  return 0;
 }

GameData が,必ず適切に処分しないといけない特殊なリソースを使っているならば
WM_ENDSESSION でも delete gameData; を忘れてはいけない。
少なくとも WM_DESTROY は送られて来ないからね。
 (確か WM_CLOSE すらも送られて来なかったような。。。)
782デフォルトの名無しさん:04/09/12 13:38:37
>>776
神!!!!!!!!

…というより、こんな基本的なことを忘れていたモレは
いったいなんなんだろうかと小一時間。

マジで反省してきます。スレ汚しすいません。
783760:04/09/12 13:52:37
ありがとうございます。

>>779
そうだったのですか。それだと、あのやり方だとダメですね。

>>780
同じく、あの方法だと、より詳しく知っていないと危険ですね。

所で思ったのですが、myProg.lpfnWndProcをTitleの時ならTitleWndProc、
Fieldの時ならFieldWndProcと、ゲームルーチン切り替え時に一緒に変えれば、
コールバック先を変える事が出来るのでしょうか。
それなら、TitleWndProcにタイトルの事だけ書くことが出来、
自分の考えに近いものが出来そうなのですが。

>>781
知らないやり方でした。勉強してみます。

ただ、うまく組めば、キャラクターのHPとかのデータを、
ローカル==autoで置いて置けるので、何か悔しかったもので。

アイテムのデータとかは、グローバル、staticになるので、
その方法が使えそうです。
784デフォルトの名無しさん:04/09/12 14:26:53
MCIを使ってオーディオプレーヤーを作成してますが、
ミュートのプログラムの作り方がよくわかりません。
教えてください
785デフォルトの名無しさん:04/09/12 14:36:27
よく考えるとスレタイの「API質問箱」ってわかりにくいタイトルだよな.
テンプレに「Win32APIとはなんぞや」ぐらい書いてあった方が良いかもね.
このページへの直リンでもいいけど.
http://black.sakura.ne.jp/~third/system/winapi/win1.html

786デフォルトの名無しさん:04/09/12 14:41:31
宣伝はやめてください。
787デフォルトの名無しさん:04/09/12 14:53:56
>>786
リンク張らなければいいだけでしょ
788デフォルトの名無しさん:04/09/12 14:56:29
今、785にリンク貼ったこと自体が宣伝ですね。
789デフォルトの名無しさん:04/09/12 14:57:21
Win32APIが何かわからん奴はそもそもここに来ないだろ。
790デフォルトの名無しさん:04/09/12 15:00:05
>>783
> 所で思ったのですが、myProg.lpfnWndProcをTitleの時ならTitleWndProc、
> Fieldの時ならFieldWndProcと、ゲームルーチン切り替え時に一緒に変えれば、
> コールバック先を変える事が出来るのでしょうか。

SetWindowLongPtr(hwnd, GWLP_WNDPROC, FieldWndProc);でできる。
791760:04/09/12 15:24:57
>>790
ありがとうございます。やってみます。
792デフォルトの名無しさん:04/09/12 17:39:54
>>786
いやなら見なきゃいいだけでしょ。
793デフォルトの名無しさん:04/09/12 18:43:13
Web上のテキストファイルをファイルに保存したいのですが、
URLからメモリに取り込むところがわかりません。
CreateFileもURLでは無理みたいなので、どうしたらいいでしょうか。
794デフォルトの名無しさん:04/09/12 18:46:04
FileMappingを使ってプロセス間通信を行いたいのですが、
テンポラリファイルを作らないでファイルマッピングを行う場合最大サイズを指定しなければなりません。
状況によってこのサイズが極端に変わるのですが、
目いっぱい大きくとって4Gとか指定してもいいのでしょうか。
795デフォルトの名無しさん:04/09/12 19:11:12
796デフォルトの名無しさん:04/09/12 19:12:42
>>792
宣伝必死ですね
797デフォルトの名無しさん:04/09/12 23:30:39
リッチエディットコントロールについて質問です。
「文字列」という単語をマウスで前方からゆっくり選択していくと「文」「字列」という風に、
1文字づつ選択されずに一気に2文字や3文字が選択される事がよくあります。
これはリッチエディットのバグ(仕様)なんでしょうか?
それとも何か設定を与えると回避できるものなんでしょうか?
ワードパッドでも確認できます。
798デフォルトの名無しさん:04/09/12 23:36:50
クソ仕様
799デフォルトの名無しさん:04/09/12 23:43:32
>>797
IEでもなるよね。イライラする。
800797:04/09/12 23:48:02
最悪ですね。
エディットコントロールを拡張するか自作するか。
いや、今日はもう寝よう…。
801デフォルトの名無しさん:04/09/12 23:49:55
ワードパッドでは「単語を自動選択」のチェックで動作を変更できるから
方法はありそうな気がする
802797:04/09/12 23:55:46
>>801
そういやMFCのサンプルでワードパッドのソースコードありましたね。
ちとダイヴしてきます。
803デフォルトの名無しさん:04/09/13 00:31:30
ツリービューに LVS_EX_CHECKBOXES オプションを付けてチェックボックスを表示させたのですが
チェックボックスがチェック/解除されたタイミングを知るにはどうすればいいのでしょうか?
WM_NOTIFYにそれらしいメッセージは飛んできませんでした。
WM_NOTIFYのNM_CLICK等を拾って自分で変更があったかを確認してやるしかないのでしょうか?
804797:04/09/13 00:56:20
原因がつかめました。
ECO_AUTOWORDSELECTION
リッチエディットにこのオプションフラグが設定されているとテキスト選択に不具合が出るようです。

フラグが立っているようならばフラグを下げてやればいいですね。
SetOptions(ECOOP_AND, ~(DWORD)ECO_AUTOWORDSELECTION);

>>801
ヒントありがとうございました。
805デフォルトの名無しさん:04/09/13 01:00:38
>>803
http://www.codeproject.com/listctrl/listcheckbox.asp
WM_NOTIFYでLVN_ITEMCHANGEDが通知されるのを捕まえる
806803:04/09/13 01:55:53
>>805
感謝感謝!!
807デフォルトの名無しさん:04/09/13 09:32:00
MCIを使ってオーディオプレーヤーを作成してますが、
ミュートのプログラムの作り方がよくわかりません。
808デフォルトの名無しさん:04/09/13 09:33:40
そうですか
809デフォルトの名無しさん:04/09/13 09:39:35
ワロタ
810デフォルトの名無しさん:04/09/13 10:04:35
スタートメニューの終了オプションや、他のアプリケーションが
スタンバイ移行の要求をした場合に、それを止める方法は無いの
でしょうか?

電源プロパティのアイドルタイマーによるスタンバイ移行は、
SetThreadExecutionStateで止めることができるようですが、
↑のスタンバイ要求は止められないようです。

どなたか教えていただけないでしょうか。
811デフォルトの名無しさん:04/09/13 10:37:53
WM_POWERBROADCASTを処理する
812デフォルトの名無しさん:04/09/13 10:42:23
>>811
ありがとうございます。WM_POWERBROADCASTに関連したMSDNを
見てきてがんがります。
813デフォルトの名無しさん:04/09/13 13:59:03
入力デバイスが接続されたのを関知したいのですが、デバイスインターフェイスGUIDであるところの
GUID_CLASS_INPUTの定義がどこにあるのか判らず、困っています。
誰か教えてください。
814デフォルトの名無しさん:04/09/13 14:09:15
GUID_CLASS_INPUTでIncludeディレクトリをぐぐる
815デフォルトの名無しさん:04/09/13 14:12:54
>>814
その「ぐぐる」の使い方は始めてみた
816デフォルトの名無しさん:04/09/13 14:14:38
grepすると書こうと思ったら反射的に「ぐぐる」になってしまったorz
817813:04/09/13 16:28:57
>814
残念ながら見つかりませんでした。
Webでもググってみたんですが情報が全然ありません(辛うじてDDK関連の情報があるのみ)。
悲しいのでしばらく寝込みます。
818デフォルトの名無しさん:04/09/13 16:45:21
>>817
うん、DDKに入ってるヘッダ(hidclass.h,poclass.h)に定義されてる
819デフォルトの名無しさん:04/09/13 16:49:31
>>813
DDKのhidclass.hにて(゚∀゚)ハケーソ!!
820デフォルトの名無しさん:04/09/13 17:53:21
ウィンドウについてるスクロールバーの端っこの部分(三角が書いてあるところ)
っていつ描画されるんですか?
821デフォルトの名無しさん:04/09/13 17:57:29
描画すべきとき
822デフォルトの名無しさん:04/09/13 18:01:42
もしくは、スクロールバーの端の部分を再描画する方法・APIを教えてください。
SetScrollInfoだと端っこは再描画してくれません。
823デフォルトの名無しさん:04/09/13 18:14:53
>>822
ぜんぜん検証してないテケトーな意見だが、
ウィンドウごと再描画すればいいんじゃね?
824813:04/09/13 19:11:15
>818,819
ありがとうございます。しかしDDKってWebで配布してないんですよね…
ググったときにヘッダファイルが引っ掛かっていたので、それを使ってみることにします。
825デフォルトの名無しさん:04/09/14 00:12:47
CreateThreadで作ったスレッド内ではCランライム関数を使ってはいけないそうですが、
newや__try __catchやSTLも使えないんでしょうか。
だめな場合wsprintfの1024バイトの壁を破る簡単な方法ってありませんか。
_beginthreadexにするのは他人が作ってる部分なので無理なんです。
826デフォルトの名無しさん:04/09/14 07:56:01
>825
s(n)printfするためだけにもう一個自分で_beginthread(ex)してスレッド作れば?
827デフォルトの名無しさん:04/09/14 09:37:22
>>825
>だめな場合wsprintfの1024バイトの壁を破る簡単な方法ってありませんか。

1行ごとに処理するとかなんとかして、そこを改善した方がヨサゲ・・・
828デフォルトの名無しさん:04/09/14 10:17:49
>>825
CreateThread()を使ってるアフォに_beginthreadex()を使うよう説得する。
CreateThread()と_beginthreadex()は引数の並びが同じなので、変更は楽。
(ただし、スレッドに渡す関数の型が違うのでキャストする必要がある。)
この仕様変更を受け入れるよう、きつく催促することをお薦めする。
829デフォルトの名無しさん:04/09/14 10:28:53
>>825
どうあってもだめな場合は、Shlwapi.hの関数群を使う。
MSDNをStrCpy StrCat などでググってみれ。

ん?それ以前に、wnsprintf()は本当にstdio.hのを使ってるのか?
同じ名前の関数が、Shlwapi.hもあるぞ。確認しる。
これらはIEのコンポーネントの一部だ。
830デフォルトの名無しさん:04/09/14 12:17:23
>>825
スタティック変数が他スレッドからの呼び出しで破壊される等の深刻な問題ではなく、
リソースリークを起こすだけなので気にしないで使っちゃうってのもまぁありかも。

リソースが深刻なほど少ない環境や、長期間連続稼動させてる環境で使用される
のなら考え物ですが。
831デフォルトの名無しさん:04/09/14 12:48:26
頭のゆるい人があらわれた!
832デフォルトの名無しさん:04/09/14 19:38:51
('A`)ヒロシです…

MCIを使ってオーディオプレーヤーを作成してますが、
ミュートのプログラムの作り方がよくわかりません。

('A`)ヒロシです…
833デフォルトの名無しさん:04/09/14 19:59:37
>>832
もうそのネタ飽きた
834デフォルトの名無しさん:04/09/14 20:34:55
MCIでのミュートはボリュームを下げろ。
835デフォルトの名無しさん:04/09/14 20:58:24
>>825
CreateThread でつくったスレッドで使っちゃいけないのは、
Cライブラリ関数の中でも、
内部的にグローバル変数を使用している一部だけ。
sprintf は問題なし。new や try〜catch も使っていい。
それに、たとえ問題になる関数を使っても >>830 の通りなので、
常駐アプリでもない限り構わないんじゃない?
836デフォルトの名無しさん:04/09/14 21:07:46
>>835
スレッド毎に独立した errno を TLS に割り当てる必要があるから、
実質ほぼ全ての C ライブラリ関数がダメだったと思う。
もちろん処理系次第だけど。
837835:04/09/14 22:22:05
>>836
errno か、確かに言われてみれば…。
なるほど、835は取り下げます。
でもさすがに try〜catch は問題ないよね?
838デフォルトの名無しさん:04/09/14 22:41:24
ダメだって書いてあるんだからtry catchは使うべきではないだろ
__try __exept __finallyで代用するのがいいんじゃないの?
839760:04/09/14 22:49:13
>>760です。
C+ウィンアプリを、static、グローバル変数を使わず、
手続き型っぽく作りたいと言っていたものです。
以下のプログラムはどうでしょうか。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1086258254&res=7

>>760のでは、>>779-781で、送られてこないメッセージがある等の
ご指摘を受けたのですが、そういう致命的なエラーはあるでしょうか。

>>783>>790のコールバック先を切り替える方法では
うまく出来なく、新しい方法を考えていました。
840デフォルトの名無しさん:04/09/14 22:49:56
OLE DragDropで、アプリケーション内でのドロップと
外部アプリケーションへのドロップで動作を変えたいのですが
この場合って適当なクリップボードフォーマットをでっち上げるのと、
フラグかなんかで場合分けするの、どっちがいいんでしょうか?
841825:04/09/15 01:37:28
皆さんレスありがとうございます。

最初は少しぐらいリークしてもいいかと思ったんですが、呼び出し毎に
新スレッド生成・終了して蓄積されていくのでちゃんと対応することにしました。
スレッド生成元を変えてもらうのは不可能なのが困りものです。

一番変更が少なそうに思いますので、sprintf系については教えていただいた
Shlwapiのを使うことにしてみます。MSDNをちょっと読んだ感じではサービスでも
使えそうですし。
842825:04/09/15 01:46:59
>>841 のつづきです。

__try, __except の使用はOKなのでしょうか?
libcmt.libとかをつけないとリンク時にエラーが出るので、もしかしたら
Cランタイムの一部なのかと不安だったのですが、機能的にはふつうの
ランタイム関数とは趣が異なるので大丈夫なんでしょうか。

C++のtry, catchはlibcmt.libなしでもリンクは通ったのですが、
なんか不安なのでnewやSTLも合わせて使用をやめておきます。
843デフォルトの名無しさん:04/09/15 03:53:21
>839 いろいろ考えるなあきみは (;´Д`) 発想の方向はちょっと間違えているけど、
きみのような人は嫌いじゃない。

たとえば WM_PAINT の時、DefWindowProc で何をやられているか、怖いな。
そのコードだと、WM_PAINT も一度 DefWindowProc を抜けた後に
きみ自身の WM_PAINT 処理を行う事になるよね。
しかし、1度の WM_PAINT で 2 度以上 BeginPaint() をしてはいけない。
さもないと思うようには描画されない。もれは経験済みだw
# いや、DefWindowProc が何をやっているか知らないから、何ともいえないけど。

そもそも、きみのコードはすでに手続き型ではなく
普通の (でも下手に喘いでいる分、滑稽な) イベントドリブンに見える。
そんなきみに漏れが一番すすめるソリューションは、大まかにこんな感じのなんだ。

LRESULT CALLBACK
WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
 if (g_scene == BATTLE) HandleBattle(hwnd, msg, wParam, lParam);
 else if (g_scene == SELECT_ITEM) SelectItem(hwnd, msg, wParam, lParam);

 return DefWindowProc(hwnd, msg, wParam, lParam);
}

HandleBattle や SelectItem の中身は >839 のコードからメッセージポンプを外したもの。
あ、HandleBattle から SelectItem を呼び出すんじゃないよ。
代わりに g_scene = SELECT_ITEM; と書く。
844デフォルトの名無しさん:04/09/15 08:11:16
自前のウインドウクラスライブラリで、ダイアログを実装しようとしているのですがうまくいきません。
下のようにすると、ダイアログを閉じたときに、
なぜか親ウインドウが他の関係ないウインドウ(エクスプローラから起動したらエクスプローラウインドウの下、VisualStudioでデバッグするとVisualStudioウインドウの下)に隠れてしまいます。
TopMost属性をもたせてから解除する方法を試しましたが、一瞬ちらつきます。APIのDialogBoxより不自然です。
どうすればいいのでしょうか。


int WND::ShowDialog()
{
EnableWindow(m_hParent,false);
bool m_EndDialog=true;

MSG msg;
while (GetMessage(&msg, NULL, 0, 0) && m_EndDialog == true)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Hide();
EnableWindow(m_hParent,true);
return DialogResult;
}
845760:04/09/15 08:52:46
>>840
ありがとうございます。

>WM_PAINT の時、DefWindowProc で何をやられているか、怖いな。
>1度の WM_PAINT で 2 度以上 BeginPaint() をしてはいけない。
そういえば。逆に、WM_PAINTが来た時、BeginPaint〜EndPaint、
DefWindowProc、両方ともを行なわなかった時も、おかしくなりますよね。

では、以下のはどうでしょうか。
while((getMsgRtn = GetMessage(&msg, NULL, 0, 0)) > 0)
{
  TranslateMessage(&msg);

  if(msg.message == WM_KEYDOWN && ...)
  {
    *item = selectItem;
    break;
  } else if(msg.message == WM_PAINT) {
    ・・・
  } else
    DispatchMessage(&msg);
}

>漏れが一番すすめるソリューションは、大まかにこんな感じのなんだ。
こういうタイプのも考えていました。
ただ、これだと、SelectItemに行くとき、HandleBattleのキャラデータが、
ローカルに置いておくと当然分からないから、グローバルでないといけません。

HandleBattleにキャラデータがあり、SelectItemへ行く時、スタックに積んで、
戻り値(参照渡し)でどのアイテムか戻ってくる形にしたいのです。
846760:04/09/15 09:16:08
又は、>>845のDispatchMessageに行かないのがダメなら、
以下のならどうでしょう。DispatchMessage(WndProc)に変数(useMessage)を
渡せないから、g_useMessageとグローバル変数を使ってしまいますが。

while((getMsgRtn = GetMessage(&msg, NULL, 0, 0)) > 0)
{
  g_useMessage = 0; //まだゲームルーチンでメッセージを使っていない
  TranslateMessage(&msg);

  if(msg.message == WM_KEYDOWN && ...) {
    g_useMessage = WM_KEYDOWN;
    *item = selectItem;
    break;
  } else if(msg.message == WM_PAINT) {
    g_useMessage = WM_PAINT;
    ・・・ }

  DispatchMessage(&msg);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  if(!g_useMessage) return 0;

  switch(msg)
  {
    case WM_DESTROY: PostQuitMessage(0); break;
    default: return(DefWindowProc(hWnd, msg, wParam, lParam));
  }
  return (0L);
}
847デフォルトの名無しさん:04/09/15 09:26:52
>>846
結局普通のWndProcの使い方に近づいていってるなw
なんかゲームのデータ保持しときたいならWindowに持たせときゃいいじゃないか。
邪推だけど、意地でもWindosAPIなんかわかってやるもんかって感じがする。
848デフォルトの名無しさん:04/09/15 09:54:12
最初から読んでないけど、シーン管理クラス作ってループ回すのとどう違うんですか。
849760:04/09/15 10:19:29
>>847
>結局普通のWndProcの使い方に近づいていってるなw
始めのやり方から妥協してきているんですかね。

>ゲームのデータ保持しときたいならWindowに持たせときゃいいじゃないか。
>>781のやり方に近いですかね。
ただ、Cのコンソールプログラムを長くやってきたせいか、変数のスコープとかに
すごくこだわっていて、使う事がない場所からは、見えないようにしたいのです。

>意地でもWindosAPIなんかわかってやるもんかって感じがする。
確かにそうですね。必要最低限なもの以外(メッセージの部分など)は、
長くやってきたコンソールっぽく書きたいというのがありました。

ただ、逆に言うと、猫、創作プログラミングの町などの一般的な書き方は、
C言語(標準C)のセオリーから大きく離れすぎていると思います。
850デフォルトの名無しさん:04/09/15 10:27:23
>離れすぎていると思います。

どうしてそう思うか説明できますか?
それが出来ないのなら多分あなたの感覚の方がおかしいです。
851760:04/09/15 10:34:04
>>848
C++は殆ど分かりません。ローベルさんの所で少しかじったぐらいです。
ただ、ググってソースを見てみた所、何となくその意味は分かりました。

うまく言えませんが、自分がコンソール風で行こうとしているのに対し、
猫とかの一般の書き方をしつつ、スコープ等も考慮するという感じでしょうか。
852760:04/09/15 10:44:50
>>850
セオリーと大きく書きすぎたほどの事ではないかも知れませんが、
やはりstatic、グローバル変数です。標準Cでは使う事が殆ど無いですから。
一般の書き方だと、使わないと組めないと思いました。
>>845のやり方が大丈夫なら、ひとつも使わずに組めると思います。
853デフォルトの名無しさん:04/09/15 10:51:36
わからんな。
いや、わかるか。
こんなことする暇がないからC++ができたんだな。
納得したぞ。
854デフォルトの名無しさん:04/09/15 10:56:47
>>852
グローバル・スタティック変数なんて、
Windowsのプログラム書いてても滅多に使わないけどな・・・

普通は構造体を確保して、
そのポインタをSetWindowLongでウィンドウに関連付けるとかじゃね?

>猫、創作プログラミングの町などの一般的な書き方
サンプルはわかりやすくするために、
これらの手順を省いてるだけだと思われ
855デフォルトの名無しさん:04/09/15 10:59:19
>>854
C++ならそうかもしれんが、
Cだと('A`)マンドクセからけっこう使っちゃいそう。
っていうか実際使う。
856760:04/09/15 11:05:33
>>845のやり方が正しいかまだ分かりませんが、何かためしに作ってみます。
そんな致命的なエラーが出るとは思わないので。

>>853
WinSDKプログラムは、C++で作る事を前提に作られているんですかね。

>>854
>サンプルはわかりやすくするために、
>これらの手順を省いてるだけだと思われ
それもあると思います。

>>855
その通りです。
857デフォルトの名無しさん:04/09/15 11:10:22
エクスプローラのReBarの枠やフォルダツリービューの枠のように
WS_EX_CLIENTEDGEよりもずっと薄いエッジを持ったウインドウを作るにはどうすればいいのですか
858844:04/09/15 11:36:04
サムワンヘルプミー
859デフォルトの名無しさん:04/09/15 11:37:12
ノーバディヘルプユー
860デフォルトの名無しさん:04/09/15 11:53:13
普通にDialogBox使えよ
861デフォルトの名無しさん:04/09/15 12:49:38
>>860
リソースエディタで作ったウインドウではないので、DialogBoxでは駄目なんです。
.NETのクラスライブラリのような感じなんです。
862デフォルトの名無しさん:04/09/15 12:59:22
Hide()は何やってるの?
863デフォルトの名無しさん:04/09/15 12:59:57
>>857
ナントカSTYLE_FLAT
864デフォルトの名無しさん:04/09/15 13:08:11
>>862
ShowWindow(m_hwnd,SW_HIDE);
こうです。m_hwndはダイアログウインドウのハンドルです。
865デフォルトの名無しさん:04/09/15 13:16:02
>>861
だったらDialogBoxIndirect使え。
.NETのクラスライブラリみたいなやつとかどうでもいいことは言うくせに
肝心の関連しそうな周辺コードを一切出さないのは何のつもりだ?
866デフォルトの名無しさん:04/09/15 13:36:59
不謹慎かもしれませんが、教えてください。

もし仮に年号が新たに変わった場合、
GetDateFormatでその新しい年号を取得するためには、
どのようにすれば良いでしょうか?
867デフォルトの名無しさん:04/09/15 13:43:23
>>866
WindowsUpdateするしか無いんじゃないの?
868デフォルトの名無しさん:04/09/15 13:55:29
>>844
Hide() するまえに親を Enable するとどうなります?
869デフォルトの名無しさん:04/09/15 14:01:00
>>864
SetWindowPos(m_hwnd, NULL, 0, 0, 0, 0,
SWP_HIDEWINDOW | SWP_NOACTIVATE |
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
870デフォルトの名無しさん:04/09/15 14:06:29
>>865
すみません本当にすみません
>>868
ご助言ありがとうございました
>>869
そうやるとできました。本当にどうもありがとうございました。
871 ◆FIcNi4f8js :04/09/15 14:09:04
>>859
三人称単数現在のsは?
872デフォルトの名無しさん:04/09/15 15:23:12
すいません、
CreateWindowExでWS_EX_CLIENTEDGE付きのスタティックコントロールを作って
みたのですが、この境界線の幅というのは、どうやって変えれば良いのでしょう
か?
具体的には、もっと細い境界線にしたいのですが、宜しくお願い致します。
873デフォルトの名無しさん:04/09/15 16:12:33
回答を無視して繰り返し質問する奴には教えない
874デフォルトの名無しさん:04/09/15 16:38:24
>>871
その言い方、あなたは抄録か忠一ですね
875872:04/09/15 16:53:40
>>873
数スレ前まで遡ってみましたが、回答らしきものが見当たらなかったので質問
したのですが…
876デフォルトの名無しさん:04/09/15 18:36:14
>>875
>>863のことじゃない?
877デフォルトの名無しさん:04/09/15 19:06:26
マウスの移動範囲を制限できるAPIがあったと思うのですが
名前が思い出せません。どなたかご存知内でしょうか?
878デフォルトの名無しさん:04/09/15 19:13:51
ClipCursor
879デフォルトの名無しさん:04/09/15 19:47:26
880デフォルトの名無しさん:04/09/15 21:56:02
内容的には結局C#じゃなくてWinAPIなので、ここで質問させてもらいますね。

C#から任意のプログラムを最小化したりタスクバーから消したいのですが、
SendMessage(hWnd, Msg, wParam, lParam);をC#で書き直して
こんな感じでmyProcの内容を最小化させることが出来ました。
WindowsAPI.SendMessage(myProc.MainWindowHandle, WindowsAPI.WM_SYSCOMMAND,WindowsAPI.SC_MINIMIZE, -1);

myProcのアイコンをタスクバーからも消したいんですが、そのための関数はどんなものがありますか?
CreateWindowExというのを見つけましたが、これはWindowを作るときのものだから、僕の目的では使えませんよね。
881デフォルトの名無しさん:04/09/15 22:01:01
TerminateProcess
882872:04/09/15 22:12:17
>>876
ええっ

ぐぐることも出来無いようなレスが回答だったんですか…

本当に分からなくて困ってるんですが、もうすこしヒントを頂けませんか?
883デフォルトの名無しさん:04/09/15 22:19:26
VC++三日目の初心者です、APIとMFCの違いも感覚でしか理解していません
いくらでもたたいてくれて結構です
画像を加工して保存がしたいのですが
HDCで保持するのとDIBデータを扱う2つがあるのですが
この2つについての、違いをご教授願いたいのです。
884デフォルトの名無しさん:04/09/15 22:26:04
>>883
DIB も DDB も HDC で管理する点では同じだ。
読み込みは LoadImage でできるが、書き込みは自分で関数書くことになる。
詳しく説明しようとすると、ここにまんまソース晒すことになるんでやめとくが、
キーワード出しとくから、がんばってみな。

BMP形式のファイルは先頭から
BITMAPFILEHEADER 構造体
BITMAPINFOHEADER 構造体
色値の配列(型は色数によって異なる)
という形式になっている。

ファイルの取り扱いはAPIならCreateFile、MFCならSerializeかCFileだ。
885デフォルトの名無しさん:04/09/15 22:44:22
>>880を要約すると

CreateWindowExにWS_EX_TOOLWINDOWを渡すのは、
外部から操作するのには使えなさそうだから、別の方法を教えてください

ということです。お願いします。
886デフォルトの名無しさん:04/09/15 22:48:14
HideWindow?
887デフォルトの名無しさん:04/09/15 23:17:10
>>885
SetWindowLongで出来るのかどうかオレにはわからない。
あとはアレだな、最小化アイコン専用のウィンドウを
つくって、本物ウィンドウと連携させるとか。
888デフォルトの名無しさん:04/09/15 23:52:15
プロセスを終了することなく親ウィンドウを閉じて作り直すこのって
どうゆう手順になりますか?
889デフォルトの名無しさん:04/09/15 23:55:54
>>888
あなたの定義で、親ウインドウとは?
890デフォルトの名無しさん:04/09/15 23:58:36
>>888
そういうことが出来る造りにしておく。
他プロセスのウィンドウの話なら、基本的に無理。
891デフォルトの名無しさん:04/09/16 00:02:45
>>889
最初に開いたウィンドウのことです。

>>890
自プロセスでやるならどういった準備が必要になるのでしょうか?
892デフォルトの名無しさん:04/09/16 00:08:15
>>891
つまり、あなたのアプリではあらゆるウインドウが全て
WM_DESTROY に対して PostQuitMessage を発行するわけか
893デフォルトの名無しさん:04/09/16 02:01:13
>>882
Googleだけが調べる方法じゃないでしょ。

WS_EX_CLIENTEDGEが定義されているヘッダファイルから、なんとかFLATを
GREPするとか。
894デフォルトの名無しさん:04/09/16 02:33:22
アプリの多重起動を防ぐ為にCreateMutexするところまではわかったんですが
Mutexの名前をシステム内で一意にする方法はありますか?

適当な名前を引数にすると他のアプリと衝突しそうな気がするんですが・・
895デフォルトの名無しさん:04/09/16 02:49:01
GUID使うとかは?
896デフォルトの名無しさん:04/09/16 02:59:41
>>895
みんながそうしているならそれでいいんだがね
897デフォルトの名無しさん:04/09/16 07:18:11
exeへのフルパス
898デフォルトの名無しさん:04/09/16 08:35:07
リストビューについてなんですが、
もしかして隠しカラムを設定できますか?
MSDN見ても書いてないから無理なのかなぁ

LVCOLUMNのcxに0設定して擬似的にするしかありませんね?
899デフォルトの名無しさん:04/09/16 08:42:06
むかつく
900デフォルトの名無しさん:04/09/16 08:44:35
901デフォルトの名無しさん:04/09/16 09:01:36
空から星が落ちてきて直撃しそうで怖いんですがどうしましょう?

っていう質問と似てるな。
902デフォルトの名無しさん:04/09/16 09:05:46
゚・(つд`)・゚・
903デフォルトの名無しさん:04/09/16 09:20:21
とりあえず日本語(全角文字)使っとけ、くそども。
「ぬるぽ....」でもなんでもOK。バックスラッシュ以外はすべてOK。
Windowsは内部的には文字列リソースをUnicodeで持つので、
海外のアプリと衝突することはかなり回避できるはずだ。
904デフォルトの名無しさん:04/09/16 09:28:51
>Windowsは内部的には文字列リソースをUnicodeで持つので、

これと

>海外のアプリと衝突することはかなり回避できるはずだ。

これは何の関係があるの?
905デフォルトの名無しさん:04/09/16 09:29:46
というかほんとに適当に16文字くらい使えば衝突しないと思うけど。
何を指定したって確率の問題じゃないですかー。
906デフォルトの名無しさん:04/09/16 09:32:28
完全に回避することができない。たんなる確率の問題だから、星の直撃の心配
と同じ。偶然の一致を避けるような工夫をできるだけするしかない。ながーい文字列
とか、exe のフルパスもかなりいい感じだと思うけどな
907デフォルトの名無しさん:04/09/16 09:43:18
でも、exeのフルパスだとコピーされたら多重起動ができる。
抜け道が簡単に出来ちゃうからダメだと思うよ。
大型アプリなら問題ないかもしれないけど…
908デフォルトの名無しさん:04/09/16 09:48:11
>>907
セキュリティーに関連するような大事なハンドルを
デフォルトSID(=NULL)で作成する時点で駄目駄目でしょ。
親プロセスが全ての重要ハンドルを作成し、
明確に子プロセス以外アクセスできないようにするのが普通だと思う。
909デフォルトの名無しさん:04/09/16 10:09:09
>>908
Mutex作る時に使うオブジェクトの名前が違う事になるから、
違うハンドルを作ってしまうって事では?
これについてはセキュリティ関係ないのでは…?
910デフォルトの名無しさん:04/09/16 10:19:20
>でも、exeのフルパスだとコピーされたら多重起動ができる。

そうだね。VBのだとそういう振る舞いをするんだそうだ。

lihvwdghwelkihvwrhweruhakjabhojwejjw

こういう文字列を使った場合、偶然に一致するアプリがあるかも、って心配は
まぁ、したけりゃしてもいいけどな。
911デフォルトの名無しさん:04/09/16 11:13:42
>>896 >>900
こっちがユニークなら、皆どうだろうと関係ないんじゃない?
912デフォルトの名無しさん:04/09/16 11:16:02
ユニークかどうかはほかが同じことしてないかどうかに関係する
913デフォルトの名無しさん:04/09/16 12:23:41
悪意を持って多重起動の判断を混乱させようとしているのでない限り
「GUIDに見える(けどuuidgenで生成したものではない)文字列」とか
「他のexeのフルパスに見える文字列」
をわざわざ使うとは思えないんだけど
914デフォルトの名無しさん:04/09/16 13:02:06
悪意か善意かは問題ではない。ある演算なり、一定の規則(フルパスやGUIDもこれに入る)
を採用して文字列を取得した場合と、まったくでたらめな文字列の場合、一致する確率が
どっちが低いか、を考えるべき。exe のフルパスの場合は、異なるアプリ間で偶然一致する
のは考えづらいけど、他のディレクトリにコピーされた同じexeが二重起動される。これは
かなり現実的な問題ではある。
915デフォルトの名無しさん:04/09/16 13:06:38
そもそもなんで多重起動を抑止したいのかって理由にもよるだろ。
916デフォルトの名無しさん:04/09/16 13:08:15
二重起動を抑止したい理由と、名前付き Mutex の名前がユニークかどうかは関係ない
917デフォルトの名無しさん:04/09/16 13:09:28
>>892
PostQuitMessageをスローしないだけで済むのですね(^^;
どうもでした。
918デフォルトの名無しさん:04/09/16 14:25:19
>>914
本当にまったくでたらめじゃ確かに一致しない確率は最高だろうけど
自分の別インスタンスとも一致しないから多重起動の判定に使えない。
最低でも多重起動のチェックができる程度の何らかの規則は
導入しなくてはならない。問題はその規則が(他の規則を採用している
かもしれない文字列も含めて)偶然一致する可能性をどれだけ
減らせるか。
919デフォルトの名無しさん:04/09/16 14:39:55
>自分の別インスタンスとも一致しないから多重起動の判定に使えない。

何いってるの?
920デフォルトの名無しさん:04/09/16 14:41:21
>>918

すこしは頭使えよ
921デフォルトの名無しさん:04/09/16 14:42:24
>>918はGUIDを毎回生成するとでも勘違いしてるんじゃないのか
922922:04/09/16 15:04:56
IHTMLDocument等のHTMLに関わる
インターフェイスを使用しています。
現段階では、ActiveXのWebBrowserから
IHTMLDocumentを取得しているのですが、
ブラウザを介さず、
URLまたはHTMLテキストから
直接IHTMLDocumentを
取得したいのですが、
そのあたりの方法があれば教えて下さい。
923デフォルトの名無しさん:04/09/16 15:08:44
簡単なのは WinInet のAPI使うのだな。ググルといっぱいサンプルが見つかるはず。
924デフォルトの名無しさん:04/09/16 15:09:35
>直接IHTMLDocumentを取得したいのですが、

あっ、勘違い、すまん
925デフォルトの名無しさん:04/09/16 15:13:23
SetTimerで、引数のID所で0、又は既に使われているIDを指定すると、
戻り値で空いているIDが返ってきて、それを使うという事を出来るのでしょうか。
926デフォルトの名無しさん:04/09/16 15:15:58
どこをどう読めばそうゆう解釈が
927925:04/09/16 15:20:07
>>926
ありがとうございます。やっぱできないのですね。
その方法が使えれば、IDをEnumなどに定義しておかなくても、
ちょこっと使いたいときに楽かなと思いまして。
928デフォルトの名無しさん:04/09/16 16:18:12
>>893
うそ教えるな。問題のスタイルはCCS_*だから、標準的なスタイルには用意されてなくて
自前で描画するしかない。
929デフォルトの名無しさん:04/09/16 16:34:31
>>922
mfc スレでちょっと前に (レス720前後) 同じ質問にと答えた記憶あるんだけど、
あれじゃあうまくいかなかった?
930デフォルトの名無しさん:04/09/16 19:26:24
ローカルにあるプロセス間で通信をするのに今はソケットを使っているのですが
帯域がボトルネックになっているので改善方法を探しています。

名前つきパイプやメモリマップドファイルを使うことでパフォーマンスの向上は
のぞめますか?ストリームのようにデータを転送するのでメモリマップドファイル
にする場合は何かの方法で同期を取る必要があると思います。
931デフォルトの名無しさん:04/09/16 19:39:57
そのままにしておいた方が、ポテンシャル高くて後々おいしいような。
932デフォルトの名無しさん:04/09/16 19:49:54
ボトルネックになってるんだったらしゃーないような。
でも、プロセス巻通信がそんなに頻繁に起こるならいっそプロセス統合した方がよくないか?
933デフォルトの名無しさん:04/09/16 21:58:05
.NET Framework 1.1を使うアプリを公開したいのですが、
.NETのCLRがインストールされているか調べるにはどうしたらいいですか?
934デフォルトの名無しさん:04/09/16 22:10:45
>>933
漏れは VS .Net のウィザードで作ったインストーラプロジェクトの
インストーラでチェックしてるけど、API でチェックしたいってこと?
935933:04/09/16 22:51:59
>>934
そうです。
936デフォルトの名無しさん:04/09/16 23:42:33
レジストリを見るんじゃないの
937デフォルトの名無しさん:04/09/17 13:01:15
VC++6.0を使っています。
iphlpapi.hをインクルードしたいのですが
このファイルが無いようです。
どこから拾ってくればよいでしょうか?
938デフォルトの名無しさん:04/09/17 13:07:23
939デフォルトの名無しさん:04/09/17 16:20:34
>>934
レジストリ見るプログラムは何で作るの?
CLRに対応してるか確認するプログラムは
CLRを使う.NETじゃ書けないってことなのかな.
.NETって面倒だね.
940デフォルトの名無しさん:04/09/17 16:40:17
…( ゚Д゚)ポカーン
941デフォルトの名無しさん:04/09/17 17:18:58
駐在型ソフトだと、タスクバーから表示を消して、タスクトレイにアイコンを表示していますよね?
これをするにはどうしたら良いですか?
942デフォルトの名無しさん:04/09/17 17:24:33
駐在型?
943デフォルトの名無しさん:04/09/17 17:26:32
ウインドウを消してタスクトレイにアイコンを登録する。
944デフォルトの名無しさん:04/09/17 19:08:21
そのウィンドウの消し方教えてくださいよー ヽ(`Д´)ノ ウワワーン
945デフォルトの名無しさん:04/09/17 19:09:38
DestroyWindow
946デフォルトの名無しさん:04/09/17 19:17:25
ShowWindow
947デフォルトの名無しさん:04/09/17 20:39:07
ウインドウ非表示の方法ぐらい
知っててくださいよー ヽ(`Д´)ノ ウワワーン
948デフォルトの名無しさん:04/09/17 21:10:47
スタートボタンで終了したり、ShowWindow でウィンドウを消したりさせるマイクロソフトが悪い
949デフォルトの名無しさん:04/09/17 21:18:22
馬鹿は何でもMSのせいにするからなぁ w
950デフォルトの名無しさん:04/09/17 21:25:11
なんでもすぐ人のせいにするのは無能の典型
951デフォルトの名無しさん:04/09/17 21:43:15
>>950
勧告陣に言ってくださいw
次スレ〜たてて
952テンプレ1:04/09/18 04:00:01
953デフォルトの名無しさん:04/09/18 11:31:50
難民のあれか・・・。
どこかにミラーが残ってないかな?
954デフォルトの名無しさん:04/09/18 14:14:10
part15のログなら1000まで持ってるが
955デフォルトの名無しさん:04/09/18 14:25:23
part16のログなら1000まで持ってるが
956デフォルトの名無しさん:04/09/18 14:28:06
( ´_ゝ`)フーン
957デフォルトの名無しさん:04/09/18 14:32:39
part22のログなら1002まで持ってるが
958デフォルトの名無しさん:04/09/18 14:38:02
ウィンドウのどの位置にマウスポインタがあるか調べる方法を教えてください。
調べると、GetCursorPosをして、ClientToScreenで変換するとあったのですが、
ウィンドウの位置でなく、ディスプレイの位置のなのか、正しく調べられません。
959デフォルトの名無しさん:04/09/18 14:51:08
>>958
そこはClientToScreenじゃなくてScreenToClientじゃないか。
960958:04/09/18 14:55:48
>>959
ホントだ。逆の方を使っていました。
ありがとうございました。
961デフォルトの名無しさん:04/09/18 15:07:52
自分がつくったステータスバー(CreateStatusBarで作成)は、マウスを
うえにのせてもなにもメッセージをうけとったり、送信したりしないのに、
そのへんのアプリケーションのステータスバーはwm_nchittestを送信した
あとにいろいろやっています。それもどのアプリも大体共通した動作。
(メッセージのやりとりはspy++で見ました)

自分がつくったステータスバーにおいてもこれを実現するためには何を
すればいいのでしょうか?
962933:04/09/18 16:12:05
933です。
%windir%\system32\mscoree.dllのバージョンが1.1以上だったら
.NET Framework1.1がインストールされているされていると考えてよいのでしょうか。
Win32APIな話題からそれていますが、ほかの環境ではどうなのか知りたいのでお願いします。(当方WinXPSP2)
963デフォルトの名無しさん:04/09/18 16:21:39
>>961
サブクラス化しなさいよ
964デフォルトの名無しさん:04/09/18 16:43:36
パート15と16持ってる人いる?
うpってもらえれば、>>1のテンプレに追加して書いたり
965デフォルトの名無しさん:04/09/18 16:46:23
そのファイルだけコピーされてたらどうすんの?
966デフォルトの名無しさん:04/09/18 16:47:19
>>964
両方あるけど、Janeのログだから手を加えないとだめだよね?
967デフォルトの名無しさん:04/09/18 16:50:52
>>964
うぷろだにうぷっただけじゃすぐ消えちゃうよ
968964:04/09/18 16:54:10
2ch系のどっかのサイトが、基本的に消さないとかいう方針のうpロダがあったんだけど…
たしか、FLASH系サイトをまとめてるやつ

>>966
HTML化したほうがよさげ。
ttp://tatsu01.at.infoseek.co.jp/
969デフォルトの名無しさん:04/09/18 17:05:08
ほい。
ttp://up.isp.2ch.net/up/87d091951909.zip

当然すぐ繋がらなくなるから、誰か転載よろしく。
970964:04/09/18 17:42:02
15
ttp://saba.haiiro.info/uploader/file/0587.html
16
ttp://saba.haiiro.info/uploader/file/0588.html

使おうと思ってた、with2chはお休み中だった(つд`)
971ほんたま:04/09/18 19:33:36
WideCharToMultiByteを使って、unicodeをsift-jisに変えると、漢字などはちゃんと変換されるんですが、半角英数を変換すると文字化けするんですが…?
みなみなさまがた〜教えてくだされ〜♪
972デフォルトの名無しさん:04/09/18 19:39:20
沢村の新コテか
973デフォルトの名無しさん:04/09/18 19:50:31
文字化けするんですが…?

ってのはどこが質問なのかな
まあ、普通はそんなことにならないので答えようも無いが。
974ろろ:04/09/18 20:34:31
>>971さん
WideCharToMultiByte のオプションがまずいのではないかな?
どんなふうに呼び出しているの?
975デフォルトの名無しさん:04/09/19 01:28:31
プッシュボタンコントロールの外観を、
テキストではなくBMPにすることはできますでしょうか?
976デフォルトの名無しさん:04/09/19 01:59:23
出来ます。
977デフォルトの名無しさん:04/09/19 02:05:03
>>976
ありがとうございました。頑張ってみます。
978ほんたま:04/09/19 02:11:11
>>975
おみゃ〜よ、オナードローボタンにすればいいよ。
つくりかたは「猫でも…」に書いてあるよ。自分じわかる?
>>974
WideCharToMultiByte(CP_ACP,0,(unsigned short *)pctext,tempsize2,temptext,tpsize2-1,NULL,NULL);
というふうに呼び出しています。
pctextとtemptextはchar型の文字列です。
まずファイルのunicode文字をpctextに1字1字バイナリコピーします。
半角英数の「OK」なら「4F 00 6B 00」というのがその値です。
この時点で、pctextの内容を画面に表示してみると、unicode文字なのにすでに「ok」と表示されます。
でもこれを上のapiを使ってsift-jisに変換してからtemptextを表示すると、何故か「?」と文字化けして表示されるのです。
漢字や半角カタカナを変換する場合はまったく問題ないのですが…?
979デフォルトの名無しさん:04/09/19 02:18:52
S-JISのコードページはCP_ACP?
980デフォルトの名無しさん:04/09/19 02:18:55
そうですか。
981デフォルトの名無しさん:04/09/19 02:38:11
自己解決しました。
982ほんたま:04/09/19 02:38:58
「ok大下容子」という文字列の場合、
変換前のunicode文字列を表示すると「ok'Y・Nケ[P[」になり、
変換後のsift-jisを表示すると「?大下容子」になります。
つまり半角英数は変換前のほうがちゃんと表示され、漢字は変換後にちゃんと表示されます…?
みなみなさまがた〜教えて〜♪
983デフォルトの名無しさん:04/09/19 02:53:41
だから、普通はそんなことにならないから。
というわけで、終了
984デフォルトの名無しさん:04/09/19 02:55:56
>>978
tmpsize2, tpsize2 とかの実際の値はどーなってる?
WideCharToMutiByte() の返り値は?

日本語 Windows なら CP_ACP で問題はないです。
985ほんたま:04/09/19 02:59:54
勘違いでした。
エヘ♥
986デフォルトの名無しさん:04/09/19 03:04:15
他のアプリのボタンを押したいのですが
ツールバーの中にあるボタンのウィンドウハンドルはどうやったら取得できますか?
987デフォルトの名無しさん:04/09/19 03:05:05
wchar_t unitext[] = L"ok大下容子";
std::vector<char> tmp;
tmp.resize(::WideCharToMultiByte(CP_ACP, 0, unitext, -1, NULL, 0, NULL, NULL));
::WideCharToMultiByte(CP_ACP, 0, unitext, -1, &tmp[0], tmp.size(), NULL, NULL);

もんだいねぇけど。
988デフォルトの名無しさん:04/09/19 03:05:35
>>986
ありません
989デフォルトの名無しさん:04/09/19 03:09:49
ないですか
座標で押すのかな
位置が変わったりしないんだろうか
990デフォルトの名無しさん:04/09/19 03:13:11
あります
991デフォルトの名無しさん:04/09/19 03:19:08
>>989
座標からアイテムの情報が分かるから、
それを拾ってツールバーの親にメッセージを投げてやればいい。
992デフォルトの名無しさん:04/09/19 03:23:44
thx
そのやりかたであたってみます
993デフォルトの名無しさん:04/09/19 03:29:55
どうやってテキストを表示していますか?UTF-16LEだと最初の1オクテットには
oとkが含まれているので0x00を無視するような方法で出力してればokって文字列が
最初に見える。
そうじゃないのに「ok'Y・Nケ[P[」っていうのが見えるならファイル読み込みの部分
で「4F 00 6B 00」を「4F 6B」にしちゃってる。
994デフォルトの名無しさん:04/09/19 03:37:32
wifstreamを使ってないとか
ifstreamでバイナリモードにせずに読んでるとか
そんなとこじゃないの
995デフォルトの名無しさん:04/09/19 03:46:45
しかし沢村は相変わらずのズレっぷりだな
996デフォルトの名無しさん:04/09/19 04:00:35
次スレまだ〜?
997デフォルトの名無しさん:04/09/19 04:02:04
まだ
998デフォルトの名無しさん:04/09/19 04:02:20
埋めちゃうよ?
999デフォルトの名無しさん:04/09/19 04:09:06
だめ
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。