1 :
デフォルトの名無しさん :
2006/05/19(金) 11:25:09 スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
2 :
デフォルトの名無しさん :2006/05/19(金) 11:25:43
3 :
デフォルトの名無しさん :2006/05/19(金) 11:28:00
4 :
デフォルトの名無しさん :2006/05/19(金) 11:30:01
5 :
デフォルトの名無しさん :2006/05/19(金) 11:32:19
7 :
デフォルトの名無しさん :2006/05/19(金) 15:14:31
乙女
乙女座
9 :
デフォルトの名無しさん :2006/05/19(金) 16:31:35
乙女座の聖闘士
乙女座の聖闘士のシャツ
乙女座の聖闘士のシャツを着てるピザ
乙女座の聖闘士のシャツを着てるピザ食い乙女
乙女座の聖闘士のシャツを着てるピザ食い乙女座の聖闘士
>>13 ほんものならシャツいらんやんヾ(^^ヘ)
そんなことより「ピザ食い乙女座」ってなに?
なぜHSPだけ丁寧にリンク集が。
つまり乙女座の聖闘士は、自画像シャツ着たキモオタデブ
前すれ埋めようじゃないか
19 :
sage :2006/05/20(土) 02:43:23
ディスプレイの電源ON/OFFをWindowsプログラミングで行いたいのですが 参考になるサイト(もしくは書籍?)などありませんでしょうか。 ACPIというものを使うようですが探してもプログラミングについて サンプルとか情報みつまりませんでしたorz #WinAPIでは無いきもします・・・スレ違いでしたらゴメンナサイ
sage間違えゴメンナサイorz
前スレで反応がなかったのでとりあえずこちらでも・・・ BUTTONウィンドウの背景色を 灰色じゃない色(例えば、赤)に変えるにはどうしたらいいのでしょうか?
ウィンドウズのアップデートをした時に、裏で処理やってるから待ってなくていいよ的な 吹き出しみたいなメッセージが、タスクバーのアイコンから出るのがありますが あれを出す関数は何か教えてください。お願いします。
デスクトップが持つイメージを列挙しようと思ったのですが、イメージリストを取得しても イメージ保持数が0になっていて上手く取得できていないようです。 HWND hSysWnd; hSysWnd = ::FindWindowEx( NULL, 0, "Progman", "Program Manager" ); hSysWnd = ::FindWindowEx( hSysWnd, 0, "SHELLDLL_DefView", NULL ); hSysWnd = ::FindWindowEx( hSysWnd, 0, "SysListView32", NULL ); HIMAGELIST hImgList = ListView_GetImageList( hSysWnd, LVSIL_NORMAL ); int nImg = ImageList_GetImageCount( hImgList ); for( int i=0 ; i<nImg ; i++ ) { ImageList_Draw( hImgList, i, hdc, 0, i*48, ILD_NORMAL ); } hImgListにNULLは返ってきてないのでエラーではないみたいなのですが、何が原因なのでしょうか。
25 :
デフォルトの名無しさん :2006/05/20(土) 05:58:50
既存のEXEファイルにリソースを追加するプログラムを作っています。 コードを書き始めて、単に新規のデータをどこかに挿入したり、最後尾にくっつけたりするだけでは全く実現できないことに気付きました。 複雑な参照関係にあるデータが、インデックス番号ではなくオフセットアドレスを使って参照し合っているからです。 どこかにデータを挿入した場合は、すべてのオフセットアドレスを再構成しなければなりません。 そこで、リソースデータを、追加部分を含めた形で、新たに一から書き出す、という事を考えたのですが、これがかなり大変そうです。 ファイルポインタを激しく動かさなければならないのです。 ツリー部から、ID文字列領域から、リソース本体領域へと激しくジャンプしなければなりません。 その際にまだ書き込んでいないデータのサイズを正確に予測してきちんとファイルポインタ位置を決定しなければなりません。これはかなり複雑な状況ではないか、と思いました。 そこでちょっと考えてみました。 オフセットデータだけが問題であるならば、 ツリー部分にストアされているすべてのオフセットデータ値に対し、 1. データ挿入がなされる位置より前であるなら変更しない 2. データ挿入がなされる位置より後ろなら変更する という方法でごく簡単にリソースデータを再構築できるのではないか、と。 挿入すべきデータはツリーの構成員の構造体だけで、ID文字列やリソース本体は最後尾にくっつけるだけでよさそうです。 こういう方法でやった人は誰かいるでしょうか? そしてうまくいったでしょうか?
>>25 >ファイルポインタを激しく動かさなければならないのです。
一旦メモリ上にファイルの最終イメージを完成させてからファイルに書くか、
CreateFileMapping()使えば?
子ウィンドウの数を求める関数があったような気がするのですが思い出せません。 EnumChildWindowsで調べるものをつくってもいいのですが、 思い出せないものが本当にあったのかどうかわからないので教えてもらえないでしょうか?
ないです
30 :
19 :2006/05/20(土) 13:33:35
>>21 ありがとうございます。
トップレベルウィンドウにメッセージを送るだけで消せるんですね。
>>29 なかったですか。
つまり自分の勘違だったんですね。
CreateWindowのウィンドウのサイズ指定は 枠やキャプションも含めたサイズですか??
33 :
32 :2006/05/20(土) 16:22:14
キャプションや枠のサイズはどうすれば取得できますか?
GET SYSTEMMETRICS
ここは「Win32API質問箱」なのですが、C/C++前提だったりしますか。 Dとかでも質問可だったりしますか。
どうぞ
BeginUpdateResource UpdateResource EndUpdateResource あたりは?NT系だけだが
39 :
デフォルトの名無しさん :2006/05/20(土) 18:55:58
ダイアログボックスの右上にある「×」を使用不能にしたり、可能にしたり切り替えるにはどうしたらいいんですか?
メッセージフック
>>39 メニュー(システムメニュー)から外せばいいよ
42 :
デフォルトの名無しさん :2006/05/20(土) 19:35:05
wsprintfがあるので普通にwsscanfもあると思ってソースを書いていました。 それでコンパイルしたとき「そんな関数ないです」とコンパイラに言われました。 wsscanfじゃなかったらなんになるのさ??
猫を見て思った・・・。 char szBuf[64]; wsprintf(szBuf, "差し手 = %s", szSashite); これはいいのか?
UNICODE考えてなかったら別にいいんじゃない?
wsscanfじゃなかったら結局なんなの?
似たようなものもないってことですか? 勘違いしていました。
子ウィンドウがアクティブ状態になったときメニューのところが親ウィンドウみたいに 青くなるようにするにはどうしたらいいのでしょうか?
,、i`ヽ ,r‐'ァ `ヽ:: ::´ ヽ ヽ , -‐--、 / / ヽ \ I:::::::I_ _ / / ヽ ヽ i,(;;;ノI、;;;)l ,,/ , ' ヽ ` ー 、.,,ゝ´ヮ`,ノュ_, - ' r' フォ━━━━` 、_ /::: `山'::::: /━━━━!!! カス ヽ:::::::::::|::::::::"",r‐' 〉::::::::|::::::::::¨/ /;;;;;;;/;;;;;;;;;;/ /;;;;;;;/:::::::::::《 <;;;;;;;《:::::::::::::ヽ / ヽI,r''"""^~ヽ / ,/ ヽ ヽ
ウィンドウAの上にまったく同じサイズのウィンドウBが被さっていて、ウィンドウAが見えません。 その時、ウィンドウAを上にするにはどうしたらいいのでしょうか? ShowWindow以外でなにかあれば教えてください。 ウィンドウAとウィンドウBの親ウィンドウは同じです。
SetWindowPos
SetWindowPos ていうか何故以外?
2つ重ねたウィンドウが必要になりそうだとおもったからです。 だけどそのウィンドウが途中からウィンドウの順序が逆になりそうな気がしたのです。 ありがとうございますです。
こういうことだろ? UNICODEでコンパイルすると TCHARがwchar_tになる。 つまり、 wsprintf(wchar_t *, const wchar_t *, ...); ということになる。 wchar_t *のところに、char szBuf[64]をいれたら コンパイルエラーが出る。 といいたいいんだろ?
>>59 Windowの何の順がだ?
って言うか、試してみてダメだった時に考えろや。
2002年のサンプルじゃないか
ツールバーのIndexからボタンのチェック状態を調べるにはどうしたらいいのでしょう? TB_GETSTATEはIDからしか無理みたいですし・・・ だからといってIndexからIDを調べる方法もわからないし・・・ TB_COMMANDTOINDEXは逆だし・・・ 調べてみたのですがさっぱりわかりません。 教えてもらえないでしょうか?
>>64 TB_GETBUTTONでindexからIDを調べる
オォ!! ちゃんと出てる! ありがとうございます! でもやっぱしID調べてからだったのですか・・・ 処理回数増えるけど仕方ないか・・・
エディットコントロール内にかなりの量の文字列を表示させる際 大きいバッファを用意し、その中に全ての文字列を格納して SetDlgItemTextで一度に表示する方法しかないんでしょうか? 行単位で送り出せればいいんですが。
EM_SETSELとEM_REPLACESELで追記
>>68 なるほど。EM系のメッセージ調べれば良かったんですね。
どうもありがとうございました。
行単位だとむちゃくちゃ遅くて使い物にならない
エディットコントロール使っちゃだめ
MFCのソースを見たら win95はSetWindowTextだったのが それ以降はエディットコントロールのメモリへ直接セットしてますね おそらくそれが一番高速でしょう
Error: 'C:\DXSDK\SDK\LIB\DDRAW.LIB' contains invalid OMF record, type 0x21 (possibly COFF) このエラーメッセージは何ですか? コンパイルは出来たのですが、リンク時にこのメッセージが出てエラーになります
失礼、ぐぐったら簡単に見つかりました
うわお、ほんとだ。スミマセン・・・
76 :
デフォルトの名無しさん :2006/05/22(月) 16:14:08
質問させてください。 メニュー選択で case IDM_AAA: OnCreate(hWnd); //スレッドを作ってダイアログボックスを呼び出す関数 TESTMAIN( ); //計算する関数(時間がかかる) //////// void OnCreate(HWND hWnd) { DWORD ThreadID; ZeroMemory(&myThread, sizeof(THREAD)); myThread.hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)hWnd, 0, &ThreadID); if(myThread.hThread == NULL){ MessageBox(hWnd, "スレッドの作成に失敗しました", "スレッド作成", MB_OK | MB_ICONERROR); SetDlgItemText(hWnd, IDC_EDIT4, "失敗"); return; } myThread.bValid = TRUE; } DWORD WINAPI ThreadProc(HWND hWnd) { DialogBox(hInst, (LPCTSTR)IDD_joukyou, hWnd, (DLGPROC)joukyou); return 0; } として、計算している最中にダイアログボックスを表示させたいのですが、 TESTMAIN( )が終わらないとダイアログボックスを表示してくれません。 スレッドを作っているのになぜでしょう? 長くてすいません。
>>76 計算をしている最中にダイアログを出したいなら、
計算を別スレッドでやれよ。
メインスレッドで計算してるから計算終わるまでメッセージ受け付けないわけだね
79 :
76 :2006/05/22(月) 19:07:38
>>77 計算をしている間はウインドウを触って欲しくないので別スレッドにやらせたくないんです。
>>78 スレッドってそんなもんなんですか?
80 :
デフォルトの名無しさん :2006/05/22(月) 19:10:24
スレッドが終了したかどうかは、 WaitForSingleObject系などを使って判定。 なお、キャンセルを受け付けるならWaitForMultipleObjectsがいいかもね。
>>79 おま、決定的な勘違いしてんぞ?なんだ「そんなもん」て?
別スレッドでやってんのはダイアログ作る関数呼び出してるだけで
メインスレッドでその作ったダイアログ表示するためのメッセージ処理してないんだろ?
そりゃ表示されるわけねーじゃんよん。もう全体的にダメぽ。
あと別スレッドで計算させたってウィンドウの操作無効にする方法はくらでもあんだろ?
さわらせたくないなら、DisableWindowでもしとけばいいじゃん。 メッセージループが回らなきゃ、描画も移動も入力も、何にも回らんよ。
スレッドと言うものを理解してないな・・ API以前の話。 Cの初心者スレできちんと勉強した方がいいよ。
84 :
デフォルトの名無しさん :2006/05/22(月) 21:02:22
>>79 @.スレッドを操作するクラスを作る。
A.スレッド生存判定するメソを作る。WaitForSingleObject(m_hThread, 0)を使って判定。
B.@を扱いやすいとこで宣言。とりあえずグローバルで。
C.メニューの選択処理で、Aのメソでスレッドの生存判定。
D.Cでスレッドが生きてなかったら、スレッドを生成し処理を走らせる。
まずは、こんなかんぢで?
んで、好きなように工夫してみれあ?
DialogBoxのparent指定を止める手もあるが。
そういえばダイアログのみならメッセージループなくても動くね
>>79 計算中にWindow触って欲しくなかったら、ダイアログ出す必要ないじゃん。
計算中にダイアログを出したいなら、メッセージループを回さなければならない。
メッセージループが回らないと、ダイアログを表示することすら出来ない。
君はWindowsの基本から勉強した方がいい。
Windowsはモーダルダイアログを表示している間は、 メッセージループ(GetMessage)を独自に回し、 ダイアログ用ウィンドウプロシージャを呼び出しています。
DLLの関数内で確保したメモリを アプリケーション側で解放したりするのはマズイですよね? 今のところ動いてるんですが、例えばDLL側でリンクしているcrtと アプリ側でリンクしているcrtが違ったりするとマズーな予感がするんですが
>>89 newだのmallocを使うならマズイ。
Win32API使うならダイジョブ?
ん、GlobalAlloc とか HeapAlloc とかならおk
ところでboost::shared_ptrなら、DLLを跨いでも平気ということを知ったときには驚いた。
>>81 >別スレッドでやってんのはダイアログ作る関数呼び出してるだけで
>メインスレッドでその作ったダイアログ表示するためのメッセージ処理してないんだろ
も前様もナニか勘違いしていると思われます。
ウィンドウメッセージは、ウィンドウを作ったスレッドのメッセージキューに
送られますよ。
79の問題は、「ウィンドウ触られたくないから」って言ってメインスレッドのメッセージ処理を止めてしまっている点。
ワーカスレッドはダイアログを表示してメインスレッドのウィンドウを非アクティブにするべく
WM_NCACTIVEメッセージをメインスレッドのウィンドウに送り、それの返事をずっと待っている。
95 :
デフォルトの名無しさん :2006/05/23(火) 00:23:38
質問です。 IEのフレームに代表されるような「つまんで領域の大きさを左右や上下に調整する」区切り線は、 ウインドウスタイルの中で指定できないのでしょうか? (正直、どういうメッセージが飛んでくるのかいまいち想像つきませんが) 用意されている可能性がある程度には、一般的かなと思うのですが…。
96 :
デフォルトの名無しさん :2006/05/23(火) 00:26:28
スプリッタ
あ、はい。Googleで検索かけたらその通りだったようです<スプリッタ でもこれMFCなんですね。Win32APIオンリーだと自力実装になりそうですね。
>>99-100 ご丁寧にありがとうございます。
以前から何回か質問させていただいてますが、いつも丁寧な返答が帰ってきて嬉しい限りです。
まだペーペーですが、質問に応えられる側になるようがんばります。
>>98 VCLにもあるよ。
ローカルフックでWindowsキーの入力を検知、シェル側で反応しないようにしたいのですが無理でしょうか?
WH_KEYBOARDで入力は取れるもの0返そうがスタートメニューが反応してしまいますorz
グローバルフックでファンクションキーは殺せたんですが‥‥
103 :
デフォルトの名無しさん :2006/05/23(火) 10:05:42
ウイルス ブラクラのたぐいに認定
105 :
デフォルトの名無しさん :2006/05/23(火) 11:54:57
質問させてください。 ユーザーのwindowsの設定を取得したい時ってよくあると思うんですけど、 基本的には、レジストリから読み込めばいいんですかね? それとも、専用の関数がある場合はなるべく、レジストリ系の関数は使わない方がいいんですか?
106 :
102 :2006/05/23(火) 11:59:04
>>103 RegisterHotKeyで設定するホットキーの設定用に押したキーの組み合わせを取得したいのですがWindowsキーが問答無用でスタートメニュー開いてくれるので。
アクティブなコントロール上でWindowsキーが押された場合にスタートメニューを開かせないようにしたいのですが。
>>104 ローカルフックでどうやったらそんな物が作れるのか詳しく。
108 :
105 :2006/05/23(火) 12:17:20
>>107 レスどうもです。質問の仕方がちょっと悪かったと思うので変えます
1.書き込みはせずに読み込みだけする場合でも、レジストリにアクセスする事は危険で、なるべく避けた方が良い行為ですか?
2.専用の関数がある場合はなるべく、レジストリ系の関数は使わないようにした方がいいですか?
>>108 1.必要があるなら使う、そうでなければ使わない
2.うん
Windowsのバージョンによって、格納されているエントリが異なることもある
専用の関数はそれらの差異を吸収している場合が多い
110 :
105 :2006/05/23(火) 13:04:46
>>109 よくわかりました。ありがとうございました。
>>102 WH_LLKEYBOARD のフックプロシージャで TRUE 返せばキーは無効になると思うよ。
これのフックプロシージャは(他プロセスに進入する他のグローバルフックとは異なり)、
SetWindowsHookEx を読んだプロセス(スレッド)のメッセージポンプ経由で呼ばれるので注意。
EXE に普通に書けてラクだけど。
112 :
デフォルトの名無しさん :2006/05/23(火) 15:35:46
質問です。 あるウインドウの子として、 CreateWindowにて WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION | WS_MINIMIZEBOX な子供ウインドウを作りました。 その子供同士の重なりなのですが、ウインドウの「タイトルバー」をクリックしない限り、前後が入れ替わりません。 クライアント領域であろうと(例えば)スクロールバーであろうと、どこかをクリックされたら、そいつが(子供ウインドウの中で)最前面にくるのかと思っていたのですが、これは仕様なのでしょうか? それとも設定ミスでしょうか?
WM_COMMANDについて質問させてください。 猫などのサイトを見ているとWM_COMMANDでのButtonクリックの処理は ButtonのIDで処理していますよね。 それで本題なんですけど、 とあるサイトでWM_COMMANDのlParamのデータを見たのですが その中にはhwndControl(コントロールからの場合、ウィンドウハンドル(HWND)が入る)と書いていました。 ですのでHWNDを変数に入れてある場合、IDよりHWNDで判定したほうが 安全な気がするのですが(IDが被る心配がいらないとか?) 実際のところはどうなんでしょうか?
>>113 何を問題としているのかが理解できんな。
IDとHWNDを比べてみても意味はないし。
何かをしたいが「IDでやる方法がわからない」と言う事なのか?
>>114 これは単なる疑問で「IDでやる方法がわからない」というわけではないのです。
説明が下手だったみたいです。
ID=定数。
定数ということはプログラムが大規模になると数字が被るような気がする。
被ったら変な動きがするかもしれない?
それだったらウィンドウハンドルはひとつのプログラム内だったら被ることはまずないような・・・
とか思ったのです。
逆にかぶせられて便利という考え方もあるけどね
まぁ確かにそうですけど・・・ 自分で被るようにしたのはいいのですけど、 気づかないで被っていたらやばくないかなぁって思いません?
>>115 被らない様に付けるからID(識別子)と言うのだ
確かにIDのおかげでいろいろ応用が利く
う〜ん、つまりこれは、 つまらない疑問だったのですね・・・ ようはうまく使い分けろってことですかね?
ケースバイケースだな。 HWNDで判定したければすればいい。
そもそも一意に振られたIDと親ウィンドウのハンドルがあれば、 コントロールのHWNDを取得できるわけだし、 コントロールのHWNDを管理する手間が減ってイイ! と思うのだが・・・
あぁ〜、 それに気づかなかったのか自分は・・・
>>111 hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, GetModuleHandle(NULL), 0);
で行けました。ありがとうございました。
>>115 被るのが心配ならenum使えば勝手に連番を割り振ってくれるよ。
タイトルバーのあるウィンドウの位置を固定して、 移動できないようにするにはどうしたらいいのでしょうか? 最大化や閉じるなどは使えるままにしたいとおもっています。
>>126 WM_MOVINGでlParamを固定したい位置に書き換えればいいよ。
>>126 移動できないようにするのに最大化はしたいとは、また無体な要望をw
そうすればいいんじゃね?
>>126 EnableMenuItem(GetSystemMenu(hWnd, FALSE), SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
ここのやり取りを見てるだけでも結構な勉強になりますね。
>>126 EnableMenuItem()じゃ効かなかった
RemoveMenu(GetSystemMenu(hWnd, FALSE), SC_MOVE, MF_BYCOMMAND);
>>132 何度しても無理だったのでやり方が間違っているか考えてました。
RemoveMenu(GetSystemMenu(hWnd, FALSE), SC_MOVE, MF_BYCOMMAND);は動きました!
・・・EnableMenuItemはなぜ出来ないのでしょうかね?
予想通り最大化&Windowsキー使えなくする超DQN仕様
業務用アプリなんだろ。
136 :
デフォルトの名無しさん :2006/05/23(火) 19:21:25
>>113 わんわんわんわん わわわん わんわん
(HWNDは各々のPCのWindows毎に値が異なりますが、IDはユニーク値が付けられます。)
わんわん わわん わんわん
(メッセージやアイコンとか、別のリソースDLLでもっておけば、)
わんわんわんわん わん わわん わわん
わんわんわん わわわん クーン わんわん
(他国間で動かせるアプリケーションを作成したとき、リソースの差し替えは動的に行えますからね。)
わん!
黙れ犬共 朝鮮人呼ぶぞ
140 :
デフォルトの名無しさん :2006/05/23(火) 21:28:11
うにゃー
なーご
142 :
デフォルトの名無しさん :2006/05/23(火) 22:03:47
猫でも本みながらテキストエディタ作ったのですが UNICODEベースだと、かなり変わってくるのでしょうか あいまいな質問ですいません。
>>142 きちんとUNICODE対応を念頭において作られたのならば、ソースコードに変更は生じない。
猫でもはちっともUNICODE対応を考えていない。
(しかし猫を書いた本人は現在知らないわけではなさそうだ)
144 :
デフォルトの名無しさん :2006/05/23(火) 22:46:26
>>142 ASCIIと互換を考えるなら、
アプリケーションの実行地域(ロケール)、
あとファイル操作を気をつけなければなりませんね。
>>142 似たような御仁がおられる。edit control を使ったものは分かりませんが、
rich edit control を使ったものは分からないことだらけ。
自分は文字を色付けしたりして使っていますが、rich edit control では
UNICODE 対応はまじめにやってないんではと思うときがあります。
ファイルの扱いやダイアログなどでの文字の扱いは問題ないです。
すいません。
どなたか
>>112 わかりませんでしょうか。
単純に「親ウインドウ作って、子ウインドウ2つ作って」というだけのアプリを作っても、ダメでした。
とあるアプリケーションの、入力補助アプリを作ろうと模索中です。 対象アプリの入力欄のハンドルが欲しいのですが、同じクラス名が沢山あり捕まえられませんでした。 入力欄はテキストボックス?で、フォーカスが当たり入力カーソルが点滅している状態です。 これを利用して、ハンドルを取りたいのですがどうすればいいのでしょうか?
GetGUIThreadInfo
チャイルドをアクティブにせなアカン
150 :
147 :2006/05/24(水) 00:18:56
>>148 ありがとうございます。
明日やってみます。
コレをヒントに何とか解決できそうです。
正直ウィンドウ情報だけでやろうとして煮詰まっていました。
初心者ゆえ、しらない概念がある事がわかって勉強になったしだいです。
質問です。 タブコントロールのタブの部分をマウスで右クリックしたらポップアップメニューが出てきて 削除を選ぶとそのタブ項目が削除されるようにしたいと思っています。 ですので、タブの右クリック取得方法(NM_RCLICK)や タブの削除方法(TCM_DELETEITEM)は調べました。 しかし、右クリックしたタブが左から何番目かを調べる方法がわかりません。 どうやったらいいのでしょうか? よろしくお願いします。
さっそく試してみました。 case NM_RCLICK: GetCursorPos(&(HitTest.pt)); ScreenToClient(hTabWnd,&(HitTest.pt)); SendMessage(hTabWnd, TCM_HITTEST, 0, (LPARAM)&HitTest); wsprintf( str, TEXT("%d番目"), TCHT_NOWHERE); MessageBox(NULL , str, TEXT("タブコントロール"),MB_OK); break; としたら"1番目"としか返ってきませんでした。。。 どっか間違えたみたいです。 どこだろ・・・ まぁ、明日もう一度英文見直すか〜
154 :
153 :2006/05/24(水) 02:59:05
wsprintf( str, TEXT("%d番目"), TCHT_NOWHERE); ↓ wsprintf( str, TEXT("%d番目"), HitTest.flags); です。 戻し忘れてました。
155 :
153 :2006/05/24(水) 03:16:15
ちょっとTCM_HITTESTを見直したのですが、 このメッセージはタブ内にマウスポインタがあるだけしかわからないような・・・ 返ってくる値はTCHT_ONITEMとTCHT_ONITEMLABELだけだし・・・ う〜ん、なにか別のとセットで使うものなのですか?
ヒント:返値
ここには賢人しかいないのか わん
タブブラウザのまねっこだったらソースみりゃいいじゃん
160 :
153 :2006/05/24(水) 13:05:58
アッ!
戻り値見忘れてた!
>>156 >ヒント:返値
それってもう答えじゃないですか(笑)
>>112 DefMDIChildProcは、WM_CHILDACTIVATEを処理しています
>>133 大昔の仕様です。「なぜ」に答えるのはむつかしいです
SendMessage(hTabWnd, TCM_HITTEST, 0, (LPARAM)&HitTest); の返り値で何番地かわかるようになりました。 ですがそのあとでポップアップメニューを出しても何番地かの情報を送ってはくれません。 ですのでこういう場合は下のように、 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, 0, NULL, NULL); として出てきたIDと組み合わせて処理をしたらいいのでしょうか?
>>162 試してないけど、こんな感じでどう?
case NM_RCLICK:
GetCursorPos(&(HitTest.pt));
ScreenToClient(hTabWnd, &(HitTest.pt));
PopupProc(hTabWnd, TabCtrl_HitTest(hTabWnd, &HitTest));
break;
BOOL PopupProc(HWND hTabWnd, int iItem)
{
int nID;
if (iItem == -1) {
return FALSE;
}
/* 中略 */
nID = TrackPopupMenu(hSubMenu, TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, 0, NULL, NULL);
switch (nID) {
case IDM_DELETE: /* 削除を選択 */
TabCtrl_DeleteItem(hTabWnd, iItem);
break;
}
return TRUE;
}
Delphiにある、コンポーネントの作成ってCとかで出来る? わん
166 :
デフォルトの名無しさん :2006/05/24(水) 15:36:19
カスタムリソースについて調べています。 「猫でも・・・」や「WisdomSoft」にあるソースを見てもLoadResource の後処理らしき処理がわかりません。検索もしてもいまいちわからずです。 LoadResouraceに対応した解放処理は不要なんでしょうか?
168 :
166 :2006/05/24(水) 16:07:14
>>167 ありがとございます。解放の必要はないようですね。
お手数おかけしました。
メッセージをDispatchするループの後って絶対に通るよね。 まさかWM_QUITが来た時点でプロセスが終了するわけじゃないよね。 えーっとつまり、 { while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } MessageBox( NULL, "通るかな", NULL, MB_OK ); } これでどんな時にも(エラー終了以外で)「通るかな」と表示されますか?
>>169 シャットダウン要求があってしばらく終了しないでいると
プロセスが強制的に殺されることがある。
>>169 例外が発生したら一気にブロックの外に飛ぶ気がする
172 :
76 :2006/05/24(水) 18:00:18
遅くなりましたけど、希望に沿うものができました。 ありがとうございます。
173 :
デフォルトの名無しさん :2006/05/24(水) 18:05:30
>>169 新規作成→Win32アプリで 標準的な"Hello World!"アプリケーションを選択し、
適当にメニュー項目を作成。
んでWndProcでそのメニュー項目の処理にでNULLをスローしてみた。
>>171 の言うとおりだった。
サブクラスかについて質問があります。 サブクラス化をしたときは既にWM_CREATEが終わった後ですよね? ですのでサブクラスのプロシージャでWM_CREATEをしてもなにも起きない! そこまではわかります。 こっから本題。 サブクラスのプロシージャ内で初期化をしたいのですが、 WM_CREATEは使えません。 ですのでどこで初期化をしたらいいのでしょうか? ご教授願います!
>WM_CREATEをしても 自分でするもんじゃない
何かメッセージ送ればいいじゃん
177 :
174 :2006/05/24(水) 18:31:27
>>175 言葉のあやです。
サブクラスのプロシージャでは、WM_CREATEはひろえない。
>>177 サブクラス化したあとにメッセージでも送るか、何かのフラグを持つか。
WM_INIT
そういえば確かSetWindowLongで、 値を変えたときにくるメッセージがあったような・・・ それを使ったら出来るかもしれんけど名前忘れた
そんなんあったか? 初耳だ。
182 :
180 :2006/05/24(水) 19:25:19
やっと見つけた! WM_STYLECHANGED
183 :
180 :2006/05/24(水) 19:31:41
けど使い方わかんない
184 :
180 :2006/05/24(水) 19:34:37
あぁ〜 もしかしてこれって GWL_STYLEとGWL_EXSTYLEしか判別してくれにゃいとか?
MSDN見ろ
186 :
180 :2006/05/24(水) 20:06:01
いやぁ〜、英語版のMSDNでちらっと見ただけだったので勘違いしていました〜 どうもすみませんでした。
スクロールバーのついたウィンドウにて、スクロールバーをのぞいたサイズの取得方法を教えてもらえないでしょうか? GetClientRectをしても スクロールバーを含めたサイズしか求められないので・・・
GetClientRectの結果からスクロールバーの分を差し引けば良かろう。
スクロールバーのサイズって一定なのかもわからないですし、 もしかしたらWS_VSCROLLだけとか、WS_HSCROLL | WS_VSCROLLのもあるかもしれないので TabCtrl_AdjustRectと同じようなものがないかなぁって考えてたのですが・・・
ヒント: GetSystemMetrics
InvadeRectで指定した無効領域の「外に」、LineTo等で描画した場合、 OSが勝手にクリップして、描画処理を省いてくれるのでしょうか。 それとも自前でクリップするべきでしょうか。
やってみれば〜
おまいら、円弧や曲線でも自力でクリップする気ですか?
いや別にできるだろw
侵略すんのかよ!
無効領域って BeginPaint が設定する PAINTSTRUCT の rcPaint でしょ? ウィンドウに直接描画するならクリップもクソも無いんでない?
一つのコマンドプロンプトに複数回コマンドを渡すにはどうしたらいいのでしょう? 以下勝手な予想。 ShellExecuteEx(コマンドプロンプト起動&1回目のコマンドを渡す) ↓ 何らかのAPI?(2回目のコマンドを渡す) ↓ 何らかのAPI?(3回目のコマンドを渡す) ↓ : ↓ GetExitCodeCodeProcessで終了
猫でも〜の言うとおりにやっても画像表示できません 試しにサンプルをコンパイルしてみてもやっぱり真っ白でした エラーは出てません このスレにエスパーさんがいたら教えて下さい
ここって「こういう関数を作ってみたんですけど、改善点はありますか?」的な事も答えてくれますか?
>>187 標準スクロールバーは非クライアント領域の一部だから、
GetClientRectでその分を除いたサイズが返ってくるですよ。
>>199 CreatePrcessでコマンド/DOSプロンプトを起動させて、
パイプを使ってリダイレクトしてでコマンドを流し込めばいいと思う。
或いは簡易的だけど一時的なバッチファイルを書き出して、それを実行させるという手もある。
誤訳の宝庫として天下に名を馳せてますが。
206 :
片桐摩美 :2006/05/24(水) 23:33:28
すいません質問させてください。 ウインドウクラスの wc.lpszClassName = "window"; の部分に↑のように入力したら e:\make_game\game1\main.cpp(44) : error C2440: '=' : 'const char [7]' から 'LPCWSTR' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 ↑のようなエラーがでました。 char szClassName[]="window"; とやって再び wc.lpszClassName = (LPCWSTR)szClassName; と入力したらビルドは通りましたが クラスネームの配列の中に"䥗䑎坏"っていうわけのわからん文字が入ってました。 いろいろネットやMSDNで調べましたが原因がわかりません。お願いします、原因が わかる方教えてください。 あと環境はVisual Stadio 2005でC++です。
char の代わりに TCHAR 使う リテラル文字列は TEXT マクロ
212 :
デフォルトの名無しさん :2006/05/25(木) 09:56:34
最近、ワイド文字とマルチバイト文字系の問い合わせが多い気ががする。
VS2005でプロジェクト作成すると、 UNICODEが使われるようになったからね
それほど、マルチバイト文字とワイド文字の区別もついていない低脳が多かったわけだ。
おまえ低脳?
216 :
199 :2006/05/25(木) 10:47:42
>>203 ありがとうございました。
早速取り入れてみます。
218 :
デフォルトの名無しさん :2006/05/25(木) 11:53:05
APIの関数の引数でLPTSTRについて・・・ winnt.hの中で、 typedef WCHAR *LPWSTR, *PWSTR; typedef CHAR *LPSTR, *PSTR; となっている。 んで、マルチバイト環境では、LPTSTRはLPSTR(TCHARはchar)と解釈され、 ワイド文字環境では、LPTSTRはLPWSTR(TCHARはwchar_t)と解釈される。 APIの関数も、GetCurrentDirectoryの場合、 リファレンスでは DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer); となっているが、実際winbase.hの中では、 DWORD GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer); DWORD GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer); の2つの関数が宣言されており、 これを環境に応じて、GetCurrentDirectoryAとGetCurrentDirectoryWを切り替えている。 コード書く奴は、LPTSTRとWCHARを巧く利用せんとね。 あと、スレ違いだが、 #include <tchar.h> #include <clocale> #include <cstdio> void _tmain(void){ _tsetlocale(LC_ALL, _T("jpn")); _tprintf(_T("Hello World!\n")); } この説明をしているサイトが少ないかも。
リストボックスの背景色を変えるにはどうしたらいいんですか?
>>218 地域化を深く考えるわけでなければロケール文字列は""で十分だと思う。
あと、C++を使うのならstd::locale::globalだろ。
Bluetoothの電波強度を取得するようなプログラムって書けますかね? 参考になるようなサイトがあったら教えていただければ幸いです
222に付けたしです OSはWindows XP SP2で動作して欲しいです
224 :
デフォルトの名無しさん :2006/05/25(木) 19:06:50
>>221 WinNT系って、
setlocaleせんと日本語表示できないんだっけ?
コンソールに限るけど。
225 :
デフォルトの名無しさん :2006/05/25(木) 19:28:16
WriteConsoleOutputWを直接たたくなら、setlocaleは関係ない
227 :
224 :2006/05/25(木) 20:09:23
>>226 WriteConsoleOutput!?
これは知らんだった!
ナイスです!
PSDKのファイルを見るとZeroMemoryがmemsetのマクロになっていたのですが 明示的リンク以外でkernel32.dllのRtlZeroMemoryを呼び出す方法はありますか? 環境はVisual C++ 2005 Express Editionです。
undefして自分でプロトタイプ宣言すれば?
>>225 WMIで検索してみましたが良い情報は得られませんでしたorz
>>228 でもなんでkernel32のRtlZeroMemoryを使いたいの?
玄人っぽくみえるからです
>>230 ハードウェア毎に違うんじゃないの?
ドライバ直接叩くとかしないと
>>229 ありがとうございます。
一応思ってたことはできました。
>>231 CRTを使いたくないからです。
CRTを使うと素人っぽいからです。
236 :
デフォルトの名無しさん :2006/05/25(木) 21:34:36
”ディレクトリを開く”ダイアログを作成するAPIってありますか? ”ファイルを開く”ダイアログがあったから、ディレクトリもあるかと 思ったんですが、見つからないのでよろしくお願いします。
あります
なんていうAPIですか?
SHGetPathFromIDList
SHBrowseForFolder
memset で crt なんか使われるかな・・・?
memset自体がcrtでしょうに。
組み込み関数だからCRTいらないんじゃ インライン展開されるはずだし
gcc でも VC でも凝ったオプションつけなければビルトイン関数として その場にインラインで展開されると思うけど。
インライン展開されようがどうだろうが、crtはcrtだぞ。
>>245 ZeroMemory って書いておけば、コードにも crt 由来の行はないし、
出てくるオブジェクトにも存在しなくなる。
それはともかくとして、memset とか memcpy は AMD のサイトに有る
プリフェッチ使って最適化した奴使うのが良いと漏れは思うな。
入れ替えるだけで僅かながら高速化されるからラク。
>>239 ,240
ファイルと違って難ずくわからん。でもサンクス。
#pragma intrinsic (memcpy)
251 :
デフォルトの名無しさん :2006/05/26(金) 01:23:31
>>250 んで、結局Sockにたどり着くんじゃなかった?
わたしはTCHARやTEXTマクロをウィンドウズアプリケーションでしかつかったことはありませんでした。 ですので、windows.hがかってにtchar.hをインクルードしているものだとばかり思っていました。 それで先日久しぶりにコンソールのプログラムを作ろうと思いました。 そしたらTCHARやTEXTマクロはないといわれました。 _tcharや_Tマクロはありましたけど・・・ もしかしてTCHARやTEXTマクロはウィンドウズアプリケーション固有のものなのでしょうか?
ところでCRTって何?
>>253 マジレス: Cランタイムライブラリ
ネタレス: 栃木放送
好きなほうを選べ
ネタレス: 陰極線管
リストビューって一列目しか選択することは出来ないのでしょうか? LVS_EDITLABELSのあるリストビューで二列目のデータを変えたりしたいのですが
PlatformSDKってどこからダウンロードできるんでしょうか?
ググってみると
ttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/ ってリンクが色んなところから張られているんですが、
今この先には、Server 2003 SP1 Platform SDKしかないようです。
Download Centerで「core platform sdk」と検索しても
ヒットしないですし、公開終了してしまったのでしょうか・・・。
getaddrinfoを使おうと思ってWinsock2のヘッダをインクルードしても
見つからないよって言われてしまい、仕方なくMSDNに載っていた
関数の宣言をそのままコピペして使ってみたのですが、
危険な呼び出しだとか言われてしまい途方に暮れています。
公開終了してしまっているなら、
winsock2.hかws2tcpip.hにあるgetaddrinfoの宣言を
どなたかコピペしていただけませんか・・・?
> Server 2003 SP1 Platform SDK これのどこがPlatform SDKじゃないんだよ。
>>260 ありがとうございます。
え、Win98とかに対応していないみたいだから違うのかと思ったんですが、
これでよかったんですか。
Serverとか思いっきり書いてあるので、なんか入れたらアプリが
NT系専用になってしまいそうで、不安で・・・。
getaddrinfoの宣言にWINAPIつけたら問題なく動くようになってしまったので、
とりあえずこのまま行こうと思います。
自己解決すみません。
Win98とかに対応していないみたいだから違う
>>261 Platform SDKに書かれているWindowsのバージョンは対応している一番新しいものを表す。
古いWindowsのプログラムを書くのには使えないということは決してない。
流石にWin16は無理だけど。
古いVCを使ってると、PSDKの古いのが必要だが
そのためにMSDNにこのAPIは○○以降でしかサポートされていませんとか 断り書きがあるわけだしな
266 :
デフォルトの名無しさん :2006/05/26(金) 08:01:01
>>264 新しいのだと、
WTLやATLでコンパイルエラーが出たりするんだよね。
>>259 MicrosoftR Windows Server 2003 R2 Platform SDK - March 2006 Edition
も出てるよ
268 :
257 :2006/05/26(金) 13:14:10
リストビューで一列目以外は値を通常のやり方では変更できないということがわかりました。 ですので リストビューのセルの上でクリックしたときにエディットコントロールを表示し そこに入力した値をそのセルの値にしようと考えました。 それで下記のものが作りかけのソースです。 static HWND hList, hEdit; LVHITTESTINFO HitTest; case NM_CLICK: GetCursorPos(&HitTest.pt); ScreenToClient(hList, &HitTest.pt); ListView_SubItemHitTest(hList, &HitTest);//押したセルを取得 lvColumn.mask = LVCF_WIDTH; SendMessage(hList,LVM_GETCOLUMN,HitTest.iSubItem,(LPARAM)&lvColumn);//列の幅を得るため(高さはどうやって取得するの?) lvItem.iSubItem = HitTest.iSubItem; lvItem.iItem = HitTest.iItem; lvItem.mask = LVIF_TEXT; SendMessage(hList, LVM_GETITEM, 0, (LPARAM)&lvItem);//選択したセルの文字列取得 SetWindowText(hEdit, lvItem.pszText);//取得した文字列をhEditに格納←一列目はちゃんと文字列が表示されるのに二列目はなぜか文字化けする MoveWindow(hEdit, わかんない, わかんない, lvColumn.cx, わかんない);//選択したセルの上にhEditを被せる SetFocus(hEdit);//hEditにフォーカス移動←これをしたらなぜか文字列がかわらない break; 見てもらったら最初に目に付くと思われるMoveWindowの「わかんない」ですが これは選択したセルの左上の座標がわからないのと、セルの高さが取得の仕方がわからないということです。 だれかこのソースにこうしたらいいと思うと指摘してもらえないでしょうか? 根本的に間違っているところがあるならそれも指摘お願いします。
>>255 exeのベースアドレスをkernel32.dllと同じにし、再配置情報を付けなかった場合、下記のエラーが発生する。
>app.exe - システム DLL の無効な再配置
>システム DLL kernel32.dll がメモリ内で再配置されました。アプリケーションは正常に動作しません。
>再配置が起きたのは、DLL app.exe が、Windows システム DLL のために予約されているアドレス範囲を
>使用していたためです。この DLL のベンダに連絡して、新しい DLL を入手してください。
しかし64bitプロセスと32bitプロセスでは、ベースアドレスや関数アドレスも違いそうだ
271 :
268 :2006/05/26(金) 14:39:18
BUTTONコントロールのフォントサイズだけ変えたいと思っています。 そういうことをするには、 SendDlgItemMessageのWM_GETFONTでフォントを取得。 フォントサイズを変える。 SendDlgItemMessageのWM_SETFONTで新しいフォントを入力。 ということをしないといけないのでしょうか?
いけないのです。
めんどくさいですね。 もっといい方法があったら楽なのに・・・
リソースファイルでボタン記述してる場合はフォントサイズ指定出来た様な
277 :
268 :2006/05/26(金) 18:09:14
もしかしてLVM_GETEDITCONTROLを使ったら、 自分でエディットコントロール用意する必要ない?
278 :
277 :2006/05/26(金) 18:54:42
こんばんわ。 winsock2のWSASocketにてWSA_FLAG_OVERLAPPEDを指定したいのですが、当方VB6につき自前で値を指定しなければなりません。 Googleで検索したのですが見つからず、とうとう根負けしてしまいました。 ご存知の方、もしくは調べるヒントなどお持ちの方がいらっしゃいましたら教えて頂けませんでしょうか? 何卒宜しくお願いします。 板違いでしたら申し訳有りません。
#define WSA_FLAG_OVERLAPPED 0x01 調べ方としては、Platform SDKをインストールしてヘッダ見るのが確実かな。 あとは、Googleで"define WSA_FLAG_OVERLAPPED"みたいに defineを付けて""で括って検索してみるとか。
早速の返信有難う御座います。 ""で括る・・・でしたか; ""無しでは検索かけてみたのですが。。。 Platform SDKという物も早速見てみたいと思います。 有難う御座いました!
VB6でオーバーラップソケットを扱うためにAPIを叩くというのはなかなか骨だろーなー
ありがとうございました。これで何の迷いもなくNASMで書きまくれます。 後はTEBとPEBですね・・・Webには断片的な情報しかないみたいです。
自作のほうで処理したくないことを元々のやつに押し付けることは可
つーかそのページに書いてあるじゃないか
いや、その元々のウィンドウプロシージャの定義はできないのかな?と思って。ダイアログボックスみたいに。 なんで、わざわざ別のウィンドウプロシージャを定義して入れ替えたりしてるんだろう、と思いまして、、
>>287 元をどうにかすることができないから、サブクラス化で後付するんだ。
DefaultWindowProc をただのおまじないだと思ってませんか?
おぉ、、そういえば、、、そういう事だったのか、、、、すっきりしたよ
リストビューにてLVM_GETITEMTEXTを使ってテキストを取得しようと思っています。 それで受け取るbufサイズを出来るだけで抑えたいのですが 調べた限りGetWindowTextLengthと同等の動きをするメッセージが見当たりません。 これはもしかして最大サイズのbufを用意するしかないのでしょうか?
構造体にサイズがあったはず
LVITEM.cchTextMax は渡すバッファのサイズだぞ?
294 :
291 :2006/05/27(土) 22:24:55
ちょっと確認させてください。 LVM_GETITEMTEXTのマクロ、ListView_GetItemTextは void ListView_GetItemText( HWND hwnd, //リストビューのウィンドウハンドル int iItem, //行 int iSubItem, //列 LPTSTR pszText, //バッファのアドレス int cchTextMax //バッファのサイズ ); ですよね。 つまりpszTextに指定するバッファを 自分で用意しなくてはいけない。 cchTextMaxの文字数も自分で指定しなくてはいけない。 ということではないのでしょうか? ですので前もってバッファを用意するためには文字数を取得しなくてはいけないですよね? どっかまちがってるのかな・・・
>>294 pszTextが指すバッファをオーバーして書き込まないように最大文字数を指定してね、ということ。
入りきらない場合は切り詰められる。
文字数を取得する方法は無い(と思う)ので、十分な大きさのバッファを用意するか
全部取得できるまでバッファを拡張しつつループするようにする。
MFCやWTLでは後者の方法を採っている。
296 :
291 :2006/05/27(土) 22:34:31
cchTextMaxに2を指定したら1文字+\0がpszTextに入りますよね? ということは十分なバッファとサイズを指定しなくてはいけない! そういうことだと思ったのですが・・・
バッファが足りてなけりゃ切り捨て。ほとんどのWin32APIはそうなってるはず その為のバッファ長なんだから。
>全部取得できるまでバッファを拡張しつつループするようにする。 ということは下記のような同じ処理を何回もするということですよね? 1.GlobalAllocで領域確保 ↓ 2.LVM_GETITEMTEXTで文字列取得 ↓ 3.領域が足りなかったら領域を開放をして1に戻ってやり直し ↓ 4.取得した文字列をどっかに表示して領域の開放 という処理をするのですよね? そういうことをしたら遅くなりませんかね? つまりこういうことですか? 最初にこれぐらいあったら充分だろと思える領域を確保! それから1をする・・・のかな?
LVM_GETITEMTEXTの返り血が文字数返さなかったっけ?
>>299 >it returns the number of characters in the pszText member of the LVITEM structure.
俺は英語苦手なんで合ってるか分からないが、あくまで取得できた文字数を返すと書かれてるように思える
>>298 GlobalAllocを使う理由がわからんが、そういうこと。
文字列長によるが、バッファ長を2倍2倍していけばそんなに回数かからないと思う。
OCX内の関数Aから、DLL内の関数Bを呼び出し、その関数BからDLL内の関数Cを呼び出すと、 OCXの登録ができなくなりますが、 それはなぜでしょうか? OCX void FuncA() { FuncB(); } DLL void FuncB() { FuncC(); } DLL void FuncC() { }
>>301 WINAPIって領域を確保するのにmallocではなく、
GlobalAllocを使わないといけないのではないの?
それとC++ではないのでnewを使えないからというつもりだったのですが・・・
もしかしてまたなんか間違えたかなかな?
>>303 今はGlobalAlloc/LocalAllocよりもHeapAllocのほうが推奨されている。
また、mallocやnewだって使いたければ好きに使ってよい。
日本語版のMSDN Libraryは余計な文章付け加えてたり 逆に重要なのを消しちゃったりするから困る まぁその部分については問題ないが
英語が多少読めるならこれくらいどうってことないだろうし 読めなないならこれを機会に英語を勉強してもらおうと思った。 日本語版MSDNは不完全で訳がイマイチだし。
あぁ、そういうことか〜
>>305 の文章読んだことありました!
翻訳サイトでちょっと読んだだけだったので
「依然としてグローバル関数・・・」のところを見て
まぁいいかぐらいにしか思ってませんでした。
DDE 関数とクリップボード関数ではだったのですか・・・
すいません、くずたれな質問ですが教えてください。 ダイアログを表示さし、入力終えてOK押すとダイアログは消え 別に用意しておいたウィンドウにスイッチしてそのウィンドウに 結果を表示させたいのですが まず、最初にウィンドウクラスでバックグラウンドをNULLで塗って その登録したやつを、クリエイトウィンドウでつくってその真上に ダイアログを表示させて...... この最初の時点でつまづいてます。 ふつうにウィンドウのメニューからダイアログを表示させる事は できるのですが..... オーナーウィンドウがクリエイトをメッセージした時 リソースからダイアログのハンドルを作って ShowWindowして、描画したいオーナーウィンドウを ダイアログがデストロイした時にオーナーをShowWindow すれば良いのか、もうわかんなくなってしまって。 くずたれで、質問内容も中途半端なのは承知してます。 ただ、何かヒントを頂けないでしょうか。お願いします。
311 :
デフォルトの名無しさん :2006/05/28(日) 02:42:46
>ウィンドウにスイッチして >クリエイトをメッセージした 意味不明
わらた
313 :
デフォルトの名無しさん :2006/05/28(日) 09:57:24
>>310 @.OK押したら消えるダイアログを作成しる。
A.ウィンドウの上に、@を表示し動作を確認する。
B.ウィンドウの上に、@をA回連続で表示するように改造してみる。
作成途中に気付くと思うが。
くずたれって何だ
お前にお似合いのスレのこと
>>313 わかりました
とにかく一個ずつの処理を追って確認していきます。
一気に作ろうと思った、俺の頭がどうかしてました。
>>316 Win32/64ではGlobalAllocは内部でHeapAllocを呼び出すという実装になっている。
だから直接HeapAlloc呼べばいいだろということ。
そういう意味だったのですか〜。 つまり無駄な処理はなくそうってことですね!
普通のapiならスタックでもいいわけだし
321 :
デフォルトの名無しさん :2006/05/28(日) 19:13:14
GetProcAddressって2番目の引数が LPCTSTRじゃなくてLPCSTRなんだが GetProcAddress(hDLL,_T(
322 :
デフォルトの名無しさん :2006/05/28(日) 19:14:28
すまん、切れた。 GetProcAddressって2番目の引数が LPCTSTRじゃなくてLPCSTRなんだが GetProcAddress(hDLL,_T("HogeHoge")); じゃなくて GetProcAddress(hDLL,"HogeHoge"); で呼べってこと?
英数字のみでいいからそうなんだろう。
なのにWindows CEではLPCWSTRという罠
325 :
322 :2006/05/28(日) 20:04:39
LPCWSTR版のGetProcAddressを呼ぶ方法はありませんか
WinCEに乗り換える。
>>325 W版自体が無いから、自分で文字コード変換する。
328 :
322 :2006/05/28(日) 20:24:13
おk。 がんばる。
「関数の引数すべてLPCTSTRに統一してくれたらいいのになんでしないのかな?」 とか考えてる自分は間違っているのでしょうか?
むしろME以前など切り捨ててUNICODEだけにすればいい
実行時ならまだしもコンパイル時に切り替えて対応じゃなぁ 結局9x系とNT系でバイナリ2つ用意しないといけないのが面倒
9xとかMeなんてまだ使ってる方がおかしい
>>332 俺の知り合いにもいるな
未だにMe使ってる奴
まぁそれでも俺は9x系はばっさり切り捨てるが
対応する必要もメリットも無いしな
>>325 の質問はつまり
非Unicodeの文字列をUnicode版のapiで読めませんかということだろ
非Unicodeの文字列なんだから非Unicode版のapiを使うのは当たり前じゃないか?
ん? 普通に善意的に解釈すれば MultiByteToWideChar
というよりTCHARバージョン作ってくれたらそれでいいのにと思う
作っても馬鹿以外は使わないだろうから
>>330-333 つMicrosoft Layer for Unicode
全く動かないというのは勘弁してくれ。
俺は今でも9xを使うこともあるんだ。(流石にメインPCはXPだけど)
>>339 参考までに何に使ってるか教えて頂けないでしょうか?
そりゃお前WinXPで動かない古めのエロ(ry
>>339 俺も敢えて9xマシンを残しておく理由を聞きたい
古いソフトでもなければ大抵はXPで動くんだし
動かなくてもVMwareとかでどうにかできるんだし
9xマシンさっさと対象から外してほしいよ! 試験をする身になって考えてみろよ! 98、Me、2000、XPをサービスパックごとに試験しろって鬼じゃん? 98すぐ変な動きするし!
1.PC-9821使いだから 2.FM-TOWNS使いだから
早く棄てれ
ttp://nienie.com/~masapico/api_InternetReadFile.html のサンプルソースをborlandC++にてコンパイルしたら
Error: 外部シンボル 'InternetOpenA' が未解決(C:\DOCUMENTS AND SETTINGS\OWNER\デスクトップ\A.OBJ が参照)
Error: 外部シンボル 'InternetOpenUrlA' が未解決(C:\DOCUMENTS AND SETTINGS\OWNER\デスクトップ\A.OBJ が参照)
Error: 外部シンボル 'InternetReadFile' が未解決(C:\DOCUMENTS AND SETTINGS\OWNER\デスクトップ\A.OBJ が参照)
Error: 外部シンボル 'InternetCloseHandle' が未解決(C:\DOCUMENTS AND SETTINGS\OWNER\デスクトップ\A.OBJ が参照)
となりました。
これはなにをしたら動くのでしょうか?
wininet.hはインクルードしています。
>>346 Wininet.libをリンクすれば動くんじゃないかな
>>343 貧乏ですみません。
使い続けてすみません。
生(ry
僕は2000、NTを切り捨てている。98、Me、XPのみ。
>>344 1. PC-9821用Windows 2000もある(XPはないが)
2. TOWNS版Windows 98なんてあったっけ?
>>340 >>342 Windows 98
使っている理由はそのPCの性能が低すぎるから。
あと、結構最近までそれが家のメインPCだったこともあって、
俺は9xで動かないソフトを作るという気にならない。(9xで動作する保障があるかどうかは別問題)
そのPCへ試しにWindows 2000とVS .NET 2003を入れてみたが、
何か操作しようとする度にHDDはガリガリ言うし、
Boost.Lambdaを使ったプログラムをビルドすればいつまで経っても終わらない。
けど不要なサービスを止めたりすれば、メモリ64MBでもWin 2kが意外と使い物になったのは驚きだった。
Win9x/MEを切り捨てたとしても、Unicodeを使うメリットってなんかあるのか? _MAX_PATHを超えるパスが使えるぐらいしか、思いつかないんだが・・・・・
>>352 NTカーネルのネイティブはすべてうにこーど。
ANSI版のAPIは、たんに文字コードを変換しているだけのラッパ。
>>350 1.使ってるデバイスによってはWin2k用のドライバがないので9xを使わざるを得ない場合がある。
2.Windows95ならある。
>>352 Shift JISに無いUnicodeの文字をファイル名に使われても読み書きできる。
まぁトラブるのは、ハートマークみたいな記号系ぐらいだと思うけどさ。
質問があります。 ログイン画面やCTRL+ALT+DELで出る画面をキャプチャしたいのですが。 ・アプリケーションをサービス化(SERVICE_WIN32_OWN_PROCESSとSERVICE_INTERACTIVE_PROCESS権限) ・OpenWindowStationとOpenDesktopにてWinlogonのデスクトップハンドルを取得 ・EnumDesktopWindowsにてウインドウの列挙 ・列挙したウインドウのからGetDCにてHDCの取得 までは出来たのですがGetPixelでピクセルの取得ができません。 GetDeviceCapsでGetPixelは使用可能のように見えるのですが・・・。 気になる事はSetThreadDesktopとSwitchDesktopを使用するとBUSYでエラーになります。 何か必要な処理が他にあるのでしょうか? 宜しくお願いします。
357 :
デフォルトの名無しさん :2006/05/29(月) 14:40:12
>>356 まずは、BitBlt関数でやるべきだと思うが。
2000とXPでFindFileの列挙する順番が違うことに気がついた…。 XPだと名前順にソートしやがるorz 勝手にソートさせないことってできますか?(要はそのフォルダへの 転送順や生成順に取ってきたいのです) 似たような問題にぶつかった人いませんでしょうか? 気のせいだろうか…
元々ファイルシステムが返す順だろ?
>>359 XP(NTFS5.1?)だとファイルシステムレベルで名前順にソートされてる…?
変なことしてるのは承知なんだけどね。
自分でソート
364 :
356 :2006/05/29(月) 16:04:16
>>357 もちろんBitbltも試しましたがダメでした。
通常のdefaultのデスクトップウインドウでは動きました。
どうも勘違いしてたくさいです。
NTFSとFATの差のようだ…。
>>363 どうもでした。
ゲームを作ろうと思って、fpsを制御しようと思ったら、タイマは95とNT系では精度に差があるとききました。 何か巧い方法はないですか。 あと、検索してて思ったんですが、esy link libraryってどうですか? VS2005でうまく動きますか?
> あと、検索してて思ったんですが、esy link libraryってどうですか? それを検索できません
easy link library ではないかと脳内補間
371 :
356 :2006/05/29(月) 16:55:33
>>366 「デスクトップとの対話を許可」=「SERVICE_INTERACTIVE_PROCESS」
だと思われます。
あと上でGetDCが成功してると書きましたがひょっとすると無効な値かもしれません。
GetLastErrorでは特に何も返ってきてないのですが。。。
ウインドウハンドルはGetWindowTextで「SAS window」などを取得できてますので大丈夫だと思われます
ソスどっかにうpしてくれんかのう
373 :
367 :2006/05/29(月) 17:09:21
をー、easy link libraryです。すみません。
374 :
356 :2006/05/29(月) 17:57:14
>>375 timeGetTime使った方法ってCPU馬鹿食いせんの?
あと、タイマーの精度上げるイヤーな関数使わないと
精度上がらなかったんじゃあ…。
378 :
デフォルトの名無しさん :2006/05/29(月) 19:19:49
猫でもや、wisdom以外のサイトで、ソースを参考できる サイトってありませんか? APIに関する事柄を参考にしたいのではなく、どういう風に 他の人は作っていってるのかを参考にしたいです。 一つの処理に対して一つの関数を作るにしても、その関数の 名前付けとか戻り値をどうしてるとか、ある変数を グローバル変数(関数それぞれで使いたいからそうするのは わかりますが)にしとくか、staticにしとくか、うまくグローバルや staticを使わず処理してるとか、人それぞれだと思うのです。 そういう意味で、勉強のために人のソースを見てみたいんです。 海外、国内とわずそういう、ソースを公開してるページを 知ってる方教えてください。 猫でもの本を買って一通り例題等を打ちながらASCIIからでてる リファレンス本見て、APIに関する内容を理解しつつ勉強してた のですが、いざ自分で作ろうとすると、どうしても参考にしてきた ソースが猫でもの本なので、そのクセみたいなのがついていて 他の人はどんな風にソースを書いているのかが気になってしまう ようになってしまいました。 そういう風な意味で色々なサイトを教えてほしいです。
MFCのソースが一番参考になる。
MSDNのサンプル
381 :
デフォルトの名無しさん :2006/05/29(月) 19:25:02
MFCのソースが一番参考になる。うっきー
そろそろタイマーの話は止めたいマー。
385 :
367 :2006/05/29(月) 20:16:45
SetTimerで、既に使用中のタイマ識別しを指定するとどうなるの? あと、フレームを処理させるのに 1.識別子を自前で用意して、呼び出し元の関数を識別子に記録、タイマセット 2.待ち時間が過ぎて、WM_TIMERを捕まえる 3.識別子から呼び出し元の関数にgotoジャンプ、(1へ飛ぶ) っていう、我ながらベタな方法を使ってるのですが、普通フレーム処理させるのにどうしますか?
>>378 猫は悪い見本だから反面教師にするといいよ
388 :
367 :2006/05/29(月) 20:33:06
SetTimerのlpfnTimerに自分自身の関数を指定すれば馬と思ったんですが、 これって戻り値を返さない無限再帰とかにならないんですか?
今日はもう店仕舞いだから、バカは帰っとくれ!
>>388 385 のリンク先にある MS のドキュメントを見るとまるでワンショットタイマとして動作するように
思えるかもしれないけれども、Windows の SetTimer で設定されるタイマはインターバルタイマなので、
毎回 SetTimer する必要はありません。
それから、フレームを処理させるのに SetTimer のタイマを使うのは全くお勧めできません。
(が、試してみるのも悪くはないでしょう)
いいえ
392 :
デフォルトの名無しさん :2006/05/29(月) 20:54:59
こんばんは 質問いたします。 ビットマップをウィドウに表示させるのは、できるのですが、 そのファイルの情報を,取得して,自分で、ウィンドウに書いていくことは、 できるのでしょうか。 よろしくお願いいたします。
>>392 情報というのが何なのかわかりませんが、
恐らくできます。
できる
デジカメでパシャリと
396 :
346 :2006/05/29(月) 22:29:25
>347 ありがとうございます! 本当にそれだけでした!
397 :
デフォルトの名無しさん :2006/05/29(月) 23:19:49
できるとしかいいようがないな。 >探してみます。 無理だと思うなあ。
InputBoxを表示するAPIって無いのですか?
それっぽいダイアログを作って表示させるしかない
>>400 ありがとうございます。
仕方ないので頑張ってCreateWindow使ってゴリゴリやります。
402 :
デフォルトの名無しさん :2006/05/30(火) 10:21:54
すいません教えてください。 ダイアログのコントロールから受けたデータをウィンドウの方に反映さしたいんですが グローバル変数を使わずにやりとり出来ないのでしょうか もしかしてウィンドウプロシージャの中にダイアログプロシージャ放り込んだりするんで しょうか。 関数の中での数値を静的にして処理するのは仕方がないと思うのですが 成るだけグローバル変数は使いたくないです。 良い方法があれば教えてください。
>>402 とりあえず、どういう状況なのか読み取れないけど、
メッセージ投げたらイインジャネ?
釣りのようにも見えるな。
405 :
デフォルトの名無しさん :2006/05/30(火) 11:23:13
>>402 GWL_USERDATAに、構造体でも仕込んでおいて、そこを更新するという手もある。
けど
>>403 のいうように、自分で新しいメッセージを定義してwParamとかlParamとかで受け渡した方がいい。
ダイアログに複数のコントロールを配置して、 OKを押したら各コントロールの状態を取得する。 これが猫だと全部グローバルでやってるから。
Cならそんなもの
スレッドごとにコンソールを割り当てることは可能ですか?
>>409 無理。
1プロセスで1つまでしか使えない。
何とかして割り当てられないか調べていたのですが、やはり無理でしたか。 ありがとうございました。
412 :
デフォルトの名無しさん :2006/05/30(火) 17:43:26
激しくすれ違いですみません。 VC#で、WordObjectLibraryを参照設定せずとも、 wordをハンドリングするために、 CreatObjectを使用したいと考えているのですが、 VC#とCreatObjectの組み合わせは、取り扱いが厄介らしいです。 どうしたらいいのでしょうか。 さっきからぐぐってるのに、全然わかりません。
スレ違いと自覚してるなら妥当なスレに行け
414 :
412 :2006/05/30(火) 17:53:33
>413 どこに? C#の掲示板がVBAわかるわけないし、 VBAの掲示板がC#わかるわけないし、 VBAとC#両方扱っているすれないし、 結局、ここしかないのです。
415 :
412 :2006/05/30(火) 17:56:02
416 :
デフォルトの名無しさん :2006/05/30(火) 17:58:05
417 :
412 :2006/05/30(火) 18:06:11
>416 おまえもな
419 :
412 :2006/05/30(火) 18:08:11
417は偽者です。やめてください。
420 :
デフォルトの名無しさん :2006/05/30(火) 18:15:19
>>419 むしろ、このスレ的にはCoCreateInstance関数であって、
CreateObjectはスレ違い。
C#系板で、GetTypeFromProgIDがうまくいかねーって聞いたほうがいいかも。
うまくいかんのじゃなくて面倒だそうだからいいのない?って質問だな
422 :
412 :2006/05/30(火) 18:20:02
C#系板か。 C#はそんなに偉大な存在だったのか。
424 :
412 :2006/05/30(火) 18:21:40
>421 そうです。 そもそも どうしてWord.Find find=myDoc.Selection.Find 作って、find.Executeをすると、 COMExceptionなんて出てくるのだ!! ワードのバージョンを2000から2003に うpしただけじゃないか!!九層
リア厨はさっさと所定のスレへ消えてください。
426 :
412 :2006/05/30(火) 18:37:03
>425 所定のすれがどこなのか、探してみつかってたなら いまここにいないっつーの
>412 UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
430 :
402 :2006/05/31(水) 11:50:22
すいません、根本的な質問さしてください
みなさんはC言語で書いてるんですか?それともC++で書いてるんでしょうか
C++で書いていった方が先々の事を考えると良いならそうしたいです。
あと
>>403 さんメッセージを投げるや、
>>403 さんのGWL_USERDATA
に構造体を仕込むというのも、自分のレベルだとまだ、規定の関数が
投げるメッセージを受け取る程度で、さらにGWL_USERDATAに構造体を
仕込むというのが、Set/GetWindowLongの第二引数のこの値
(GWL_USERDATA)に構造体を仕込むという方法がよくわからないんです。
ですんでGetDlgItemでハンドルを取得して、処理しようと思います。
CかC++かは個人の好みじゃないかな C++使えれば、MFCやWTLで面倒くさいGUIは楽出来るけどね > Set/GetWindowLongの第二引数のこの値(GWL_USERDATA)に構造体を仕込むという方法がよくわからないんです。 単にポインタを渡すだけ
>>430 >(GWL_USERDATA)に構造体を仕込むという方法がよくわからないんです
ヒント:ポインタ
>>430 今、わかるものでやっていくのがベストだと思います。
今のご自身のスキルで直感的にWin32APIも勉強しながら
C++も勉強してもやっていけそう。と思えるならやるべきです。
将来的な観点からみればC++で書けるほうがよいと思います。
ちなみに私はC++派です。
434 :
430 :2006/05/31(水) 12:38:44
>>431 さん
>>432 さん
>>433 さん
レスありがとうございます。
今の自分のレベルで出来る事をしながら、新たなやり方を模索しつつ
C++でもやっていけそうなら、少しずつやっていこうと思います。
しっかし、この板の人たちは親切だ。
けっこうここで質問してて、そのたびに、適切なアドバイスをくれる。
俺も知識身につけて質問に答えられるようなレベルになろう。
そして、どこかの誰かの質問にこの板で答えていくのが
直接的では無いが、質問に答えてくださってくれる方々への
恩返しだと思うから。
質問です HANDLE hFile = CreateFile(lpcszPath, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); SetFilePointer(hFile, 1024 * 1024 * 300, NULL, FILE_BEGIN); SetEndOfFile(hFile); とすれば、300MBのファイルが高速に作成できますが、これは安全でしょうか?
436 :
435 :2006/05/31(水) 15:19:55
申し訳ありません、自己解決しますた。 CAtlFile::SetSize()も同じような処理をしていたみたいです。
32APIがあるってことは、次期APIは64bitなの? それは32と互換性があるとしたら、どれくらい?
439 :
デフォルトの名無しさん :2006/05/31(水) 16:28:53
>>435 俺が過去に作ったロガーは、それで2Gのファイルを先に作成したよ。
ただ、ハードディスクの断片化には注意。
MSさえ生きていれば今まで学んだ事が無に帰ることはないのか。よかった。
まあ、それも幻想に過ぎないわけだけどな
質問です。 MDIで子ウインドウ生成の仕方を教えてください。
親ウインドウに中出し
>>435 XPでは高速だが2000ではそうでもない。
常駐させてコンピュータのロック中だけ処理を行わせたいのですが、 コンピュータがロックされたことを知ることはできないでしょうか。
できますよ
できるかどうか知らんが、思いつくのは SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, ?, ?, SPIF_SENDCHANGE);
449 :
446 :2006/06/01(木) 12:47:11
SystemParametersInfoの説明みてみました。。
ウィンドウのフラグまわりが怪しそうでしたが、それっぽいのはなさそうですね。
とおもってググり続けてたら、もうしわけない、過去に質問ありました(´∀`)
「Win32API 質問箱 Build4」
> 276 名前: デフォルトの名無しさん 投稿日: 02/06/21 18:19
>
>>270 > OpenInputDesktop→GetUserObjectInformationでOK、
> と思って試してみたら、ロックされているときはエラーになるなあ。
> はっ、そうか、エラーが帰ってきたらロックされていると思えばいいんだ。(いいのか?)
結果は書いてなかったので試してみます。
メニュー項目の横に表示できるチェックマークって プログラム内からチェック、非チェック状態を切り替えるにはどうすればいいですか?
さんくす
454 :
デフォルトの名無しさん :2006/06/02(金) 19:08:13
プロパティシートで最初のページのタブにフォーカスが移るようにしたいのですが上手くいきません コントロールはリソースで作ってるので最初のコントロールに全てフォーカスがあります 最初のページのプロシージャ内のWM_INITDIALOGメッセージ内で SetFocus(hDlg)、SetFocus(GetParent(hDlg))(一応)、どちらも駄目でした 言うまでも無いですがWM_INITDIALOGは0で返してます どちらも駄目だったので根本的に違うのかと思ったので SetFocus(GetDlgItem(hDlg, IDC_HOGE))、SetFocus(GetDlgItem(GetParent(hDlg), IDC_HOGE)) どちらともやってみましたが、こちらもフォーカスが移らず、最初のコントロールに当たってるままでした プロパティシートのタブのハンドルはプロシージャ内のウィンドウハンドルと違うのでしょうか… 何方かお知恵を貸して頂きたいです・・
>>454 PSM_GETTABCONTROL ?
456 :
454 :2006/06/02(金) 20:19:14
>>455 PSM_GETTABCONTROLで、出来ましたありがとうございます
タブのフォーカス設定はページのプロシージャで指定するのでは無く
プロパティシートのコールバックで行うようです…
最初のページのプロシージャ内でPSM_GETTABCONTROLを使ってみましたが効果が無かったです
コールバックでPSM_GETTABCONTROLでハンドルを取得してSetFocusで難なく出来ました
あとPSM_GETTABCONTROLはPropSheet_GetTabControlというマクロが用意されてますね
ありがとうございました
処理のタイムアウトを実現しようとして、専用のスレッドで経過時間をチェックしてるのですが、SetTimer()でタイマーを使うと、1msごとに設定しても1msより全然長い間隔で入るみたいです。 しかし、250msごとに設定すると250msに近い間隔で入ってくるみたいです。 これはタイマの分解能によるものだと思うのですが、実際に必要なチェックは1秒ごとで十分だと思うので、1秒ごとに設定しようかと思うのですが、1秒ごとならだいたい正しい時間が得られるでしょうか? チック割り込みだと結局だんだんズレていくはずだと思うのですが、何かMSDNライブラリを見るとちゃんとCMOS時計を参照してズレを修正するとか何とか書いてあるのですが、これは本当なのでしょうか? タイマーはやめてGetLocalTime()でチェックした方がいいのでしょうか? 後、このような事をする場合の注意点は、スレッドの優先順位を下げる、という他にあるでしょうか?
SetTimer 精度でぐぐれ
タイムアウトにも精度が必要なんだ
>>457 何の処理のタイムアウトなのかにもよるが、よく使うのは
同期オブジェクト+WaitForSingleObject()
10ms以下はミリ
タイムアウトで精度の高い関数使ってるなら、俺のスペックの低いPCは鬱。
ドラッグしているどうかの判定はどうすればできるのでしょうか? 「紙」のようにドラッグ中にウィンドウを表示させて、ドラッグが終われば非表示にさせたいのですが。
マクロ言語(UWSC)から、WIN32APIを呼び出して、 バックグラウンドのウインドウに対し左矢印キーを1秒間押し続ける ことをしたいのですが、上手くいきません。 WIN32APIの知識が全くないので、色々調べてはいるのですが、 非常に難しく分からないことだらけなので、以下の質問に お答えいただけるとありがたいです。(ちんぷんかんな質問であれば申し訳ありません) <質問> PostMessageAを使用して左矢印キーをポストしようと思い、以下のように記述しましたが、 動かないのです。各々のパラメータの設定は正しいのでしょうか? WIN32APIの部分が悪いのか、UWSCの書き方がまずいのか切分けたいのです。 Hwnd:バックグラウンドのウィンドウのID WM_KWYDOWN = $0100 WM_KEYUP = $0101 PostMessageA(Hwnd, WM_KEYDOWN, VK_LEFT, NULL) PostMessageA(Hwnd, WM_UP, VK_LEFT, NULL) *1秒間押し続ける場合というのは実装してません あと、1秒間押し続ける場合は恐らくiparamのところに記述するようにすればいいと思ってますが、 間違っているでしょうか? 以上よろしくお願いします
>>464 キーボードはメッセージを送るよりも、keybd_eventかなにかを使ったほうがいいと思う。
質問です。 インターネット上のショートカットを右クリックしたときのポップアップメニューに 自分用の項目を一つ追加したいと思っています。 その項目の内容は詳しくは書きませんが、 クリックしたショートカットのアドレスを表示するようなものです。 ですが方法がまったくもって分かりません。教えてもらえないでしょうか? メニュー自体の作り方や表示方法はわかっています。
467 :
464 :2006/06/03(土) 14:47:05
>>465 レスありがとうございます。
keybd_eventやってみましたが、アクティブウインドウへの実行になってしまいました。
バックグランドのウインドウに対してもこのAPIを使用できる方法があるのでしょうか?
>>466 インターネット上のショートカットというのが、拡張子urlのファイルのことなら関連付けを追加すればよい。
Internet Explorerで表示しているHTML上のハイパーリンクのことなら、
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt以下にキーを追加すればよい。
詳しくはググれ。
469 :
466 :2006/06/03(土) 16:19:37
>>468 質問する場所が間違っていたみたいですね。
それなのにそこまで教えてくれるとは・・・
親切にありがとうございますm(__)m
>463 static int sw = 0; case WM_LBTNDWN: sw = 1; break; case WM_LBTNUP: sw = 0; break; case WM_MOUSEMOVE: if(sw){ honyarara; }else{ honyarara; } break;
471 :
463 :2006/06/03(土) 20:34:23
ありがとうございます。 あとは、ドラッグしているものがファイルかテキストか判断できればいいのですが。。。 ご存知の方、よろしくお願いします。
472 :
470 :2006/06/03(土) 20:57:26
ごめん、寝ながら適当に書いたソースで感謝されるとは思わなかった。 お詫びとして「マウスキャプチャー」という単語を渡しておくから後は好きにしてくれ。
スレ違いだったらごめんなさい。どこに聞いたら良いか微妙だったんで。 WinAPIを呼び出すメカニズムについての質問です。 普通、システムコールをする場合eaxレジスタなどに番号を指定して、 ソフトウェア割り込みをしたすると、OSの割り込みハンドラは戻りアドレスを スタックに載せたり、割り込みベクタから適切な処理を選択したりして、、、、 というなのを習った記憶があります。 「OSの割り込み〜」以降の処理はOS内部の処理なのに、どうして各プロセスは Kernel32.dllを個別にメモリにマップする必要があるんでしょうか。 長文スマソ。
個別なんだ 知らなかった
>>473 まずはAPIと言う単語の意味から調べろ。
>>473 こいつ何なんだよー、頭良いのか悪いのかよく分からんなー。
そんな難しい事考えてる暇があったら、少しは既存の文書ぐらい目を通せよなー。
と、思ったが、ただのホームレス予備軍、現暇人か。
ちゃんと働けよ。日本の為に、地球の為に。
この世の中はお前1人が住んでるだけじゃぁねぇんだからな。
そこんとこよ〜く考えて今日は眠れ。じゃなっ!
479 :
473 :2006/06/04(日) 00:43:54
>>477 分かりやすい解説ありがとうございました。
いろいろ検索してみたのですが、一番良かったです。
MessageBox関数で表示されるウィンドウのような タイトルバーとキャプションはあって、アイコンが無いウィンドウって、 CreateWindowでどうやたら作れますか?
ウィンドウプロシージャ書いて、 RegisterClass でウィンドウクラス登録して、 CreateWindow する。
483 :
デフォルトの名無しさん :2006/06/04(日) 08:17:03
ツリービューのルートアイテムをソートする方法はありますか?
はい
仮想リストビュー使っているのですが、 CtrlやShiftを押してない状態でAとかBとかのキーを押すと 一番初めの項目へフォーカスが移動してしまいます このフォーカス移動を殺すにはどうすれば良いんですか?
気がつかなかった 俺も直さないとだめだけど 気にしないでおこう
487 :
デフォルトの名無しさん :2006/06/05(月) 21:54:43
ウィンドウの最大化の挙動を制御したいのですがここで質問 最大化ボタンを押した時の動作はWM_SYSCOMMANDのSC_MAXIMIZEを拾う事で変えられたたですが、 タイトルバーをダブルクリックした時は相変わらすデフォルトの最大化動作になってしまいます。 タイトルバーをダブルクリックした時のメッセージは何を拾うのでしょう?(´・ω・` )
WM_NCLBUTTONDOWNだったかな?良く覚えてない、間違えてたらすまん
最大化しようとしているよ、っていうWM_WINDOWPOSCHANGINGを拾えばいいんでないの?
490 :
デフォルトの名無しさん :2006/06/05(月) 22:50:15
>>489 ヘルプでWM_WINDOWPOSCHANGINGを調べましたがイマイチよく解りませぬ
lParamで渡されるWINDOWPOSのx,y,cx,cyがワークエリア目一杯だったら最大化
しようとしてると判断するんですかね?
>>488 int Ypos,upper_,lower_;
RECT rcWindow;
case WM_NCLBUTTONDBLCLK:
GetWindowRect(hWnd,&rcWindow);
Ypos= HIWORD(lParam);
upper_= rcWindow.top + GetSystemMetrics(SM_CYBORDER);
lower_= upper_ + GetSystemMetrics(SM_CYCAPTION);
if(upper_ < Ypos && Ypos < lower_) OutputDebugString("(´・ω・` ) \n");
break;
こんなコード書いちゃったよヽ(`Д´)ノ
明らかに変だ
>>490 SendMessage(WM_NCHITTEST, ...) して HT_CAPTIONだったら、
てな感じにするのが良いのではないだろうか。
>>487 挙動制御っていうのは無効化じゃないの?
最大化を無効にしたいのであれば
DeleteMenu(GetSystemMenu(hWnd, FALSE), SC_MAXIMIZE, MF_BYCOMMAND);
ちゃんとボタンも無効化させるのなら
SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_MAXIMIZEBOX);
も追加。
493 :
487 :2006/06/05(月) 23:50:29
>>491 >SendMessage(WM_NCHITTEST, ...) して HT_CAPTIONだったら、
正直具体例が無いと解り難い… orz
ヒットテストでぐぐるとWM_NCHITTESTが来たときに特定のヒットコードを返す例ばっかだった… orz
あとWM_NCHITTESTはDefWindowProc()の戻り値、つまりDefWindowProc()に渡さないと判別できず、
渡してしまうと後の祭りで制御が出来ない気が…
>>492 無効化じゃないのです。無効化だけならその例の通りで実現済みなのですが…
タイトルバーをダブルクリックした時に、最大化ではなくてウィンドウサイズを任意のサイズに変更したいのです。
MAME32というエミュでゲームをウィンドウモードで起動した時にこれができてるのよね(´・ω・`;)
494 :
492 :2006/06/06(火) 00:00:54
>>493 任意のサイズにしたいのなら、WM_GETMINMAXINFOを捕まえて
lParam(LPMINMAXINFO)のptMaxSizeを弄ればいいよ。
495 :
487 :2006/06/06(火) 00:25:03
>>494 やりたいことがこれで実現できますた、マリガトウございます。
MAME32とは挙動が違うけどもうどーでもいいや。
つか今までWM_SIZINGでトラックサイズやらウィンドウサイズ上限/下限やら一々全部計算してやってたのに、
同じ事がこんなに簡単にできたのね。 ○<\_
>>493 WM_NCHITTESTは、渡した座標が非クライアントエリアのドコにあるかを調べるメッセージ。
これ呼んだだけで最大化されたりはしません。
497 :
デフォルトの名無しさん :2006/06/06(火) 18:48:16
プロパティシート上のリストボックスで上下キー(VK_UP、VK_DOWN)を押すと、2項目ずつ移動するのは仕様ですか? (プロパティシートでない)普通のダイアログ上のリストボックスならちゃんと1項目ずつ移動してくれるのですが…
MCIは音声を同時再生できるのかしら?
499 :
497 :2006/06/06(火) 19:17:36
自己解決しました;
500 :
485 :2006/06/06(火) 20:08:53
とりあえず自己解決しました 一応解決させた方法書いときますと、ListViewをサブクラス化して WM_CHARを捕まえ、CtrlとかShiftが押されてない時には wParamに0をぶち込むことによってフォーカス移動を殺せました
501 :
デフォルトの名無しさん :2006/06/06(火) 21:11:44
ファイル(NTFS)の副ストリームを列挙するAPIっていうのは無いんでしょうか
BackupRead って調べたらすぐ出てくると思うんだけど。
503 :
501 :2006/06/06(火) 21:37:38
>>502 いやそのAPIは知ってるんですけど
一つ一つ読むの面倒だし
列挙が終わってもTRUE返さなかったりするので
一気に取得できるいいAPIないかなと思ったわけです
・・調べたところどうも無いみたいなので
ラッパクラスでも書いてお茶を濁す事にします
504 :
デフォルトの名無しさん :2006/06/06(火) 21:48:38
GetPrivateProfileSectionは、ファイルの最初からキーを列挙して その順番のままバッファに書き込んでくれるのでしょうか?ソートなどはされませんか?
何もしてくんないよ
エクスプローラライクなファイラをC#2005で作成中です。 マイコンピュータやデスクトップの項目、それらのコンテキストメニュー、 ファイルなどのプロパティの表示といったシェル拡張らしき要素はどうすれば扱えるでしょうか。 shell32.dllを利用するのかな、と見当をつけた辺りで先に進めずにいます。
>>506 msdnでIShellFolder調べてその近くにあるリファレンス等から
めぼしいのを拾ったらある程度は前進できるんじゃね?
よく知らんけど。
>>506 シェル名前空間、Shell's Namespace、IShellFolderあたりでググれ。
SHGetDesktopFolder でデスクトップの IShellFolder を得て、あとはアレコレと。 COM インタフェイス経由でいろんなオブジェクト(インタフェイス)を使うことになります。 あと「パス」に相当する ITEMIDLIST とか。 それなりにメンドクサイので頑張ってください。サンプルはググレばあるでしょう。
510 :
506 :2006/06/06(火) 23:12:39
511 :
デフォルトの名無しさん :2006/06/07(水) 12:11:17
メンバー変数の先頭に付ける「m_」ってどういう意味? 命名規則知りたい。 スレ違いでわるいけど。
>>511 メンバー変数の先頭に付ける…。
ちなみにスタティック変数には「s_」
グローバル変数には「g_」だ。
この命名規則ってなんだっけ。 確かある人が「プログラミング言語は抽象化を目的としているので、変数名にハードの情報を散りばめてはいけない」って言ってたな。
簡単な時計を作りました。背景を描画してその上に Rectangle を描いてその上に 時刻を表示させます。特に問題無く動いていたと思ったら、よく見ているとたまに チラつきます。これを抑える方法はないでしょうか。 (無知なりにググってみたら、ダブル(マルチ?)バッファリングという方法は 見つかったのですが、もしもっと簡単に解決する方法があればと思い。。)
ハンガリアン以外ってどんなのあるぅ?
>>516 では、「ない」と答えればダブルバッファを使うのか?
ちらつきに合わせてまばたきする手もある
>>516 WM_ERASEBKGNDを処理しないことで、多少は改善するかも
MSDNにwindowを開くための雛形と、 それに関する詳細な解説みたいなのはないんでしょうか? GUI周りの知識はネットで検索して雛形を見て組み込む感じでやっているのですが この方法だとネットに依存しすぎていて、 オフラインでのプログラミング時などに困ってしまいます。 MSDNで調べながらできれば嬉しいんですが 先ほどから探しても見てもそういった形ではまとめられていないようなんですが…
MSDNにサンプルがくっついてる
見つけられないやつはどこを探してるんだろうか?
MFCやATLのサンプルはあったんですが…
windowを開くための雛形だったら1つあればじゅうぶんだろ 毎回ネットでさがさなきゃならんものか?
いやwindowを開く処理は例に出しただけで その他のGUI部分を弄りたくなった場合の話です。
>MSDNにwindowを開くための雛形と、 >それに関する詳細な解説みたいなのはないんでしょうか?
CreateWindowExの引数とか、Toolbar コントロールを作ったときの 定番の初期化の仕方とかそういうの? PSDK のサンプルとかWTLやMFCのソース 読んだりするのを推奨。
Windows2000prosp4なんですが、 デスクトップなどで右クリックしたときに表示される コンテキストメニューに自分で指定したアプリを 起動するような項目を追加したいのですが どうすればよいでしょうか?
窓の手
533 :
デフォルトの名無しさん :2006/06/07(水) 20:37:48
入力補間機能を実装したいのですが、足がかりがなくて困ってます。 VC++のような入力補間機能はAPIで手軽に作れたりしますか?
あきらめなさい。
>>533 むり
ファイル解析して一覧表みたいなの作って自力表示
537 :
デフォルトの名無しさん :2006/06/07(水) 20:59:26
DLLから関数を呼ぶとき_declspecを使う方法とDEFファイル使う場合があると思うが、 おまえらはどっち使ってる? もしくは、どう使い分けてる?
何となくDEF使ってる
DEF ファイル使うのはシンボルのエキスポート名や番号を 陽に指定したいときだけかな。
どっちも使ってないけどダメなん?
>>541 どうやってるの?GetProcAddress?
それ
GetOpenFileNameでフォルダを選択することは可能ですか? もしくは、ファイルとフォルダを同一のダイアログで選択→開くできる方法は ありますか? ご存知の方がおられましたらお教え下さい。(_ _)
>Get(ry 無理。 >もし(ry そのようなダイアログを自分で作る。
> ファイルとフォルダを同一のダイアログで選択→開く フォルダの中のファイルを開きたい場合どう操作するんだろう
「開く」操作とフォルダ階層を降りていく操作を別にするとか?
>>498 Windowsのバージョンに依存だったはず。
とりあえずWindows98/2000以降はサウンドカードの種類に依存せず複数再生可能(DirectSoundでミキシング)。
95は無印だとサウンドカードの再生可能チャンネル数依存だったはず。
ダイアログ中のフォルダを右クリックして「開く」じゃダメ?
>>544 SHBrowseForFolderで、BIF_BROWSEINCLUDEFILESを指定すればよい。
ただしIE4以上が必要。
WinMain関数の戻り値の型について WINAPIとAPIENTRYがありますが、 どう違うのでしょうか?
それは戻り値の型ではありません。
554 :
551 :2006/06/08(木) 19:29:48
おれあほす どうも失礼しました ありがとうでした
最小化したメモ帳に直接文字を打ち込む(エンターなど含む) プログラムを作りたいのですが、APIを使って実現可能でしょうか?
>>555 WM_SETTEXTメッセージ送ればいい。
信じちゃ駄目だよ。
SendMessageがあれば何でもできるよ! キー入力送ったりとか
そりゃま、JNIとP/Invokeを使えばたいていのことは出来るだろう。
標準のスタティックコントロールとかエディットコントロールが内部でどんな動作してるか調べたいんですが、 ソースとか無いのでしょうか?
あるある厨氏ね
Microsoft は Windows のソースコードを一般開発者には公開していません ↑ 有るか無いか聞かれてるのに、こんな返事がいいのか?
例のソースにボタンコントロールのソースは入ってた 他はおぼえてない
おぼえてない厨氏ね
厨氏ね厨氏ね
厨氏ね厨氏ね厨氏ね
標準コントロールのソースぐらい普通に配布してくれてもいいと思うんだけどなぁ
勝手な仕様変更が出来なくなるから、却下です。
wineってどうしてんの
Exite翻訳で英語版MSDNを翻訳してもらおうとしましたが変な動きをします。 いい翻訳サイトはありませんか?
擦れ違い
そいつの名前久しぶりに見たけど どこかのスレに来てるの?
>>572 結局最後は自分だけが頼り。
いい翻訳サイト探すよりも、いい辞書サイト探すほうがいいと思うよ。
577 :
487 :2006/06/10(土) 16:52:44
以前タイトルバーのダブルクリックの件で質問した者ですが、色々と仕様を見直した所、 やっぱWM_GETMINMAXINFO拾ってLPARAMで渡されるMINMAXINFOを弄るのではなく、完全に 独自処理をしたくなってしまいますた。 タイトルバーをダブルクリックした時の処理を完全に乗っ取る方法があれば教えて下さい。 orz コノトオリ
自前のタイトルバー作れ
579 :
492 :2006/06/10(土) 17:46:30
>>577 SetWindowsHookEx(WH_GETMESSAGE, ...)でローカルフックを仕掛けて、
WM_NCLBUTTONDBLCLKかつHTCAPTIONな場合に
メッセージをWM_NULLへ変更すれば処理を無効化できる。
これを応用してお好きなように。
580 :
487 :2006/06/10(土) 18:09:56
>>492 フックは初めてなんで研究してみます
何度もスンマソン orz
>>572 断片的な日本語資料でがんばってwinプログラミングに慣れてくれば、
そのうち英語msdnも読めるようになる。
童貞が捨てられるAPIがMSDNに載ってないよ
>>582 socket
gethostbyname
connect
send
recv
shutdown
closesocket
ウィンドウのクライアントエリアのサイズを指定したサイズの通りにする方法はどうしたらいいのでしょう? CreateWindow()で(0, 0, 100, 100)とかして正方形にしようとしたんですけど、キャプション部があるので正方形になりません。
>>584 GetSystemMetricsでタイトルバーや枠のサイズを取得してそれをサイズから引く
ポップアップウィンドウを作るとか、AdjustWindowRect()を使うとか。 自分も少し前まで必死に悩んでたよ。
>>572 日本語に翻訳せずにそのまま英語で理解してしまえばおk
いや、マジで。
そんなに難しい文法は使われてないから中学レベルの英語力あれば辞書引きながら読めば読めるはず。
588 :
487 :2006/06/10(土) 20:53:53
>>584 簡単なのを一つ
1、GetWindowRect()でウィンドウのサイズを求める
2、GetClientRect()でクライアント領域のサイズを求める
3、手順1から手順2の値を引くことで縦横それぞれのクライアント領域「以外」のサイズが求められる
4、自分で調整したいサイズに手順3の結果を加えてMoveWindow();
この方法だとメニューやステータスバーの有無を一々考慮しなくても良いのでオススメ
MoveWindow()よりもSetWindowPos()のほうがよくない貝?
591 :
487 :2006/06/11(日) 00:03:23
ヒント:使い勝手
AdjustWindowRect クライアント領域の位置とサイズの指定から、その条件を満たすために必要な、 ウィンドウの位置とサイズを計算します。得られたウィンドウの座標は、通常、 CreateWindow 関数でウィンドウを作成するときに使われます。 意味がわからん・・・
593 :
590 :2006/06/11(日) 00:19:30
なるほど、頭が悪いだけか
AdjustWindowRectはメニューが折り返された場合を考慮してくれないけど
>>588 では大丈夫なのかな?
588でも駄目。588方式にAdjustWindowRect()に対する優位性はない。 同じ処理を毎回毎回書かなきゃいけない588方式は糞。 単にAdjustWindowRect()を知らなかっただけでしょ。 今度からはAPI使うようにしような。
>>594 サイズ変更後に折り返しされる事は十分考えられる。
更に
>>588 ではCreate後にしか計算出来ないから、使い勝手も問題ありだと思うよ。
598 :
デフォルトの名無しさん :2006/06/11(日) 00:47:53
>>596 のはAdjustWindowRectは折り返しも考慮してくれる、って意味でいいんだよな?
可能性としてメニュー折り返されることは十分考えられる、と言ってるともとれるんだが。
599 :
596 :2006/06/11(日) 00:52:33
>>598 言いたい事は
>>595 と同じつもりだった…。
メニューの折り返しは、どちらもプログラマが考慮する必要がある。
AdjustWindowRect()も588もメニューの折り返しは考慮されないよ。 588の方法でできない事はAWR()にもできないけど、 588の方法でできる事はAWR()にもできる。 AWR()でできない事は588でもできないけど、 AWR()でできる事は588でもできる。 AWR()の588に対する優位な点は標準APIとして提供されている事。
601 :
487 :2006/06/11(日) 00:56:06
>>595 >単にAdjustWindowRect()を知らなかっただけでしょ。
知ってて使い勝手悪いから588を書いたワケで、
>同じ処理を毎回毎回書かなきゃいけない588方式は糞。
数行のコードを一つの関数に纏めときゃ済む話なのに?
AdjustWindowRect()使う為引数考えたら588の例の方がマシ
そんなことも理解できない595が糞
>>596 >Create後にしか計算出来ないから、使い勝手も問題ありだと思うよ。
それのどこに問題があるのかわからんが…
CreateWindow前に決め打ちする必然性ってナニ?
hWnd = CreateWindow(); //位置・サイズはCW_USEDEFAULT
588の関数(hWnd);
ShowWindow(hWnd,SW_SHOW);
自分はWindowハンドルだけありゃいつでも使えるので多用してるけどな。
なお折り返しについてはAdjustWindowRect()も事情は一緒。
>>601 いい加減、ハジの上塗りはやめた方がいいよ?
おぉ怒っている・・・ つうか使い勝手を言うなら AdjustWindowRect使う奴も 関数でラップすればいいだけの話なわけだが
>>603 ラップせずに使えるモノを、何故わざわざラップするのかと(ry
>>604 書かずに実現できる処理を、何故わざわざ自前で書くのかと(ry
608 :
606 :2006/06/11(日) 01:10:16
ああ、意味判った 606は忘れてちょ
588だと、WM_CREATEのタイミングでボタンを中央に生成ってなことが出来ないからな…。 AdjustWindowRectを紹介した上で利点と共に588を紹介ってのなら、まぁ、許せるけど。 1つ気になったんだけど、588を2回やると、1度目で幅がOKで長さがメニュー折り返しで不完全な 状態になって、2回目でメニューの折り返しもOKな状態になりそうに思えるんだけど、気のせい?
一応補足。 >AdjustWindowRectを紹介した上で利点と共に588を紹介ってのなら、まぁ、許せるけど。 601だけを読んでも588に利点があるとは全く思えないんで、利点と信じてる点を紹介ってことで。
>1つ気になったんだけど、588を2回やると、1度目で幅がOKで長さがメニュー折り返しで不完全な >状態になって、2回目でメニューの折り返しもOKな状態になりそうに思えるんだけど、気のせい? 気のせいではないと思われ ところでメニューの折り返しの処理のやり方知らない… メニューバーの文字列の横の長さをどうにかして拾ってなんとかすんの?
AWR()を知ってて588を使うって どんな気持ち? ∩___∩ ∩___∩ ♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶| / (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 今、どんな気持ち? | ( _●_) ミ :/ 588 :::::i:. ミ (_●_ ) | ねぇ、無知晒されるのって ___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____どんな気持ち? ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/ / /ヽ < r " .r ミノ~. 〉 /\ 丶 / /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶 / / ♪ :|::| ::::| :::|: \ 丶 (_ ⌒丶... :` | ::::| :::|_: /⌒_) | /ヽ }. :.,' ::( :::} } ヘ / し )). ::i `.-‐" J´(( ソ トントン ソ トントン
イジメイクナイ
気になったのでメニューの折り返しについてぐぐったけど、参考になりそうなところが見つからない
でだ、584よ 結論としては、AdjustWindowRect()を使うようにしろ。 ただ、CreateWindowEx()使う場合にはAdjustWindowRectEx()を 使わなにゃならんから、そこんとこ注意な。 キャプション部が要らない場合はポップアップウィンドウを作るの がいいと思うぞ。
>>615 自分も数年前に探したけどなかったよ。。。
その時はメニューの折り返しを考慮した関数を自作したけど、XPのビジュアルスタイルで
破綻して、もう更新してないアプリだったんでそれっきり…。
メニューの折り返しについては、 1.ウィンドウを作成してからクライアント領域の大きさを取得する。 2.目的のウィンドウの大きさとの差を計算する。 3.差の分だけウィンドウの大きさを変更する。 goto 1. こんな感じだね。2回ほど繰り返さないといけない。
>618 588法x2回だな…
>>577 WM_NCLBUTTONDBLCLK は、DefWindowProc()に渡さなけりゃ無効化できる。
こんなかんじでできるんじゃね
case WM_NCLBUTTONDBLCLK:
if (HTCAPTION == wParam)
{
// ここでタイトルバーをダブルクリックしたときの独自処理
return 0;
}
DefWindowProc();
最後間違えた return DefWindowProc();
AdjustWindowRect()して その後心配ならGetClientRectで確認
624 :
588 :2006/06/11(日) 08:56:46
起きてみたらこれかい i||i(´・ω・` )
>>609 自分は単純に2回繰り返して折り返してまつ。
なおWM_SIZINGでlParam使って同じ事やる場合には2回目のMoveWindowは不要で
1回MoveWindow()したあとDefWindowProc()に渡してやると勝手に直してくれるみたい。
これをやるとWindow枠ドラッグ中にメニューが動的に折り返るようになる。(MoveWindowの第5引数はTRUEで)
#副作用として枠ドラッグ中もWindow内が更新されるけどキニシナイ
自分はこれで十分かと思ってるけどイマイチ自信が無い。他の人のメニュー折り返し部分のコード見たいが。
>>620 579で教えて貰った後でフック無しでもいけるとわかってそれでやってますた。
わざわざマリガトウ。
んじゃ名無しに戻るわ('A`)
>>622 ないよ。
>>624 1. Adjust〜でサイズ計算
2. 1で計算したサイズでCreate
3. クライアント領域サイズを取得
4. 1の元となるクライアントサイズと3との差を算出
5. SetWindowPosでサイズ変更
ここまでくるとAdjust〜のメリット無いな
通常は >625の 1 2 だけ メニューあり&横幅が狭くて2行になりそうな場合に 3 4 その結果によっては5
Createしか考慮してないと軽くジャブ
>628 >616
マジ突っ込みの上に曲解された orz ムキにならんでもいいのに
曲解してるのはどちらかと(ry
曲解っぷりならば オレの右に出る者は居ない。
すげー右曲がり
むこうのサーバが一覧かえしてくれるなら
ない。
使えねぇなw
TTPプロトコルなんて聞いたこともないな。
素直にダウンローダが作りたいと言え
>>637 Win32APIの話じゃない。
まず、ネットワークについて勉強汁。
その後は、プロトコルについて勉強汁。
>>645 すんごい幅広いですね
つまり出来ないやつは3年経っても出来ないってことか・・・
>>644 数十年勉強してHTTPの仕様に関われるぐらい偉くなれば、あるいは……。
>>644 まずはRFC2616を理解してから出直してくるがいいお(;^ω^)
ttpスキームはHTTPなのか?
650 :
デフォルトの名無しさん :2006/06/12(月) 12:45:56
アプリの実行中に終了して、再度実行すると前回の状態がそのまま復旧されるようなAPIってないですか? プロセスのメモリイメージやリソースをそのまま退避・復旧してくれるような物です。
結論だけは教えてやる。 「出来ない」 ああ、俺って親切。
OSのスリープやレジュームを叩くAPIのことじゃないの?
サブクラス化された時に、サブクラス化されたウィンドウに送られるメッセージってありますか?
656 :
デフォルトの名無しさん :2006/06/12(月) 20:47:33
WM_CREATEの時に ShowWindow(hWnd, SW_MAXIMIZE);を実行してもうまく最大化されません。 ウィンドウは画面いっぱいには表示されているが、最大化にはなっていない。という感じです。 なぜでしょうか?また、これを解決する方法はありますか?
最大化ボタンを押す
>>656 CreateWindowする時に最大化状態で作成汁
659 :
デフォルトの名無しさん :2006/06/12(月) 21:02:19
出来ればメッセージループ内のWM_CREATEの時に最大化状態にしたいのですが、無理ですか?
>>659 そもそもWM_CREATEはメッセージループ内ではない。
WM_CREATEの中でShowWindow呼ぶのってキモイ
663 :
デフォルトの名無しさん :2006/06/12(月) 21:12:14
了解しました。。。
>>656 WM_CREATEの中で何か適当なメッセージを投げて(Postして)おいて、
そのメッセージを受け取ったときに最大化したらどうか?
最大化ボタンを押す
何の役にも立たない答えを一行で書いてるバカは 面白いと思ってやってるのかね
役にも立たないと思うのは馬鹿だから
668 :
デフォルトの名無しさん :2006/06/13(火) 00:10:26
WindowのZオーダーを調べる方法を教えてください。
>>669 GetTopWindow, GetNextWindow
::LoadLibrary("RICHED32.DLL"); の時はリッチエディットが使えて ::LoadLibrary("RICHED20.DLL"); //大文字、小文字色々試したけど無理でした の時に使えないってことは2.0以降が使えないってことですか? どうすれば使えるようになりますかorz
>>671 リッチエディットコントロールは、そのバージョンによってウィンドウクラス名が違うぞ。
1.0 (Riched32)は"RichEdit"だが、2.0以上ではRICHEDIT_CLASSだ。
ってことはもしかしてVC++6のリソースエディタじゃ中身を弄らないと作れなかったりします? と思って中の"RICHEDIT"の部分を"RICHEDIT_CLASS"に変えてもダメでしたorz
× "RICHEDIT_CLASS" ○ RICHEDIT_CLASS
>>674 文字列じゃなくて定数にしなきゃいけなかったのかorz
直した後、RICHEDIT_CLASSがない言われたので、リソースファイルにも#include "Richedit.h"
したら成功しました。
>>672 ,
>>674 d
リッチエディットダブルクリックすると プログラムは終了しないけど、デバッグウィンドウにアクセスバイオレーションがでてて 怖すぎorz
try,catch,throw と Template がわかるページとかあったら教えてください。 書籍にあんまり載ってない・・
API関係なくね?
初心者はAPIと言語の区別がついてないから困る
>>678 藻前には理解できないから、今の内に辞めた方がいいよ。
マウスのホイールが回った時に飛んでくるメッセージってありますか?
WM_MOUSEWHELL
GetDiskFreeSpaceEx()APIについての質問です。 このAPIをGUI付きのMFCアプリケーションから呼び出すと Aドライブ(フロッピー)の容量取得でディスクが入っていなくても 単純にエラーになるだけですが、 GUI無しのWin32アプリケーションから呼び出すと、ディスクの無い Aドライブをチェックした瞬間に 「ドライブにディスクがありません。ディスクをドライブA:に挿入してください。」 というメッセージボックスが勝手に出てきてしまいます。 これを出さない方法はありますでしょうか?
アプリの先頭で SetErrorMode(SEM_FAILCRITICALERRORS); で出来ました。ありがとうございます。 MFCはデフォルトでこの状態なんですかね。なんか恐ろしい。
は?
は?
689 :
デフォルトの名無しさん :2006/06/14(水) 00:07:45
は?
は?
は?
ウィンドウの小ウィンドウの小ウィンドウに CreateWindowExでEDITコントロールを貼り付けたんですが、表示されなくて困っています どうすればよいでしょうか?
は?
692 つまりは、孫ウィンドウって事だな。
695 :
デフォルトの名無しさん :2006/06/14(水) 08:11:24
692 つまりは、孫がシャイで困っているという事だな。
ニートかもしれん
>>692 それだけの内容だと「ソースがおかしいんじゃね?」としか言えない。
って言うか、ちゃんと表示する様に指示しているか?
リストボックスがクリックされたときに、フォームのCALLBACK関数で 処理したいのですが、どうすればいいですか? ListBoxに LBS_NOTIFY を指定しても、 WM_NOTIFY メッセージが 送られてきていないようなのでちょっと困っています。 # ListViewなら普通に処理できそうなんですけどねぇ。。。 環境はMSVC++2005 ExpressEditionにPlatformSDKいれてやっています。
700 :
699 :2006/06/14(水) 18:50:57
自己解決しました。 WM_COMMAND で捕まえられるんですね。
便乗、ってことになるのかな? listboxでLBS_NOTIFY指定して、 WM_COMMANDでENTER捕まえることは可能ですか? 上手くいかない・・・
702 :
デフォルトの名無しさん :2006/06/14(水) 23:01:50
質問です。 現在キーボードエミュレートをするツールを開発しているのですが、キー(ファンクション) の長押しを実装方法が分からないので質問にきました。 PostMessage(hwnd, WM_KEYDOWN, VK_F1,0) PostMessage(hwnd, WM_KEYUP, VK_F1,0) 現在はこのようにPostMessage()を並べているのですが、これをどのように書き換えれば F1キーを長押し(リピート)しているように見せかけられるのでしょうか? UWSCのスクリプト内では私が求めているような挙動は以下のようにして得られています。 KBD(VK_F1,DOWN,30) KBD(VK_F1,DOWN,30) KBD(VK_F1,CLICK,40) どうぞよろしくお願い致します。 ------------------- 使用OS: windowsXP 開発環境:Bccコンパイラ 使用言語:C++ -------------------
昨日思いついたんだけど、windowsヘッダをインクルードするとき namespace Win{ #include <windows.h> } ってやったら便利かな? インテリセンスでローカル識別子と一緒にAPI関数がズラズラ入っちゃうのを防げる。
>>702 それでうまく動いてるんだったら、
PostMessage(hwnd, WM_KEYDOWN, VK_F1,0)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,1)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,2)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,3)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,4)
PostMessage(hwnd, WM_KEYUP, VK_F1,0)
で4回リピート。
>>703 Win::CreateWindowの名前をリンカが解決できると思う?
706 :
702 :2006/06/15(木) 00:12:00
>>704 さんアドバイスありがとうございます。
さっそく試してみましたが長押しだと認識しませんでした。
考えられることは
(1)Postmessage()では長押しは実現できない?
(2)Postmessage()以外にキーボードイベントを模索するべき?
(3)その他
このくらいしか思い浮かばないのですがどなたかアドバイスお
願いできないでしょうか?
LPARAM の0-15ビットがリピート情報じゃなかったっけ
708 :
702 :2006/06/15(木) 00:24:29
709 :
デフォルトの名無しさん :2006/06/15(木) 00:32:25
keybd_event使うんじゃないの?
>>708 そのサイトに書いてあるじゃん
>30ビット目は直前のキーの状態を意味します
>直前に発生したキーイベントが離されたものであれば0
>押された状態のものならば1であり、キーを離した時の状態はつねに1になります
>直前のキーストロークが押しつづけて発生したオートリピートの監視に使えます
>最後の31ビット目は、キーが押されたものであれば0、離されたものであれば1になります
>これは、WM_KEYDOWNでは0、WM_KEYUPなら1になっています
LPARAMの 0-15ビット目をなんか適当な数 30ビット目を1 31ビット目を0
にすりゃいいんでないの?試してないけど
712 :
デフォルトの名無しさん :2006/06/15(木) 10:46:02
CreateWindowで作るウインドウを、モーダルダイアログのようにしたいんですけど (親のウインドウにフォーカスいかなくなるような) どのように実装したらいんでしょうか? 参考になりそうなソースなどご存じでしたら紹介してください。
モーダルダイアログに貼り付ける
>712 CreateDialogは駄目なの? CreateDialogでダイアログ生成(仮:DialogA) 親WindowをEnableWindowで無効 ↓ 処理が終わったらDialogAをDestroyWindow()で消去前に EnableWindow()で親Windowを有効に戻す 俺はこうやってるけど参考にならなかったらシカトしてくれ
715 :
702 :2006/06/15(木) 11:39:31
>>710 さん,
>>711 さんレスありがとうございます。
>>710 さん
keybd_event()はwindowsXPではSendInput()推奨になっているようですね。
ただSendInput()のサンプルになりそうなプログラムってネットに転がってな
いようですね。。。ちなみにkeybd_event()でも試してみましたが、動作しませ
んでした。
>711さん
PostMessage(hwnd, WM_KEYDOWN, VK_F1, 0x3B0001);
for(int count=0;count<30;count++){
PostMessage(hwnd, WM_KEYDOWN, VK_F1, 0x203B0001);
}
PostMessage(hwnd, WM_KEYUP, VK_F1, 0);
こんな感じでビットの内容を指定したのですが動作しませんでした。
ちなみに走査コードは実際にF1キーを入力したときに確認した値を
代入しています。
まだ考えられる方法はあるでしょうか?
>>702 その入力先がゲームとかじゃないだろうな。
DirectInputでキー拾ってるアプリだとキーメッセージ投げても反応しないぞ。
717 :
712 :2006/06/15(木) 12:20:33
レスありがとうございます。 >713、714 表示したいダイアログが、Layerウインドウでアルファーチャンネルを持ったウインドウなんですが、 可能でしょうか?、childで指定でダイアログに貼り付けて、親のダイアログのVisibleをオフにするとか? 何か情報ありましたらお願いします。
>>709 ATLやMFC(MFCは使ったことが無いけどたぶん)
では、Win32 APIがグローバルな名前空間にあるという前提の元コードが書かれているので、
問題になる。
719 :
デフォルトの名無しさん :2006/06/15(木) 14:07:49
ダイアログが生きているか削除されたか調べる方法ない?
>>719 ウインドウハンドルに対してIsWindowをかけるとか
721 :
719 :2006/06/15(木) 14:27:05
>>705 extern "C"が指定されているから、問題ない。
>>722 そうなんだ。extern "C"するとnamespaceって完全無視なの?
724 :
デフォルトの名無しさん :2006/06/15(木) 18:52:48
アンインストール情報。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall の中をのぞくとDisplayName,UninstallStringの2つしかないアプリがありますが 「プログラムの追加と削除」プログラムは該当アプリのアイコンを何の情報を元に取得しているのでしょうか?
>>723 そういうこと。
だから関数名は問題ない。
でもWinMainとか些細な問題はまだいくつかあるはず。
実際に703のようなことをやってみたことはないから、
俺はほかにどんな問題があるかも知らない。
でも意図不明なコードとしてそのコードを見た誰かに叩かれることもありうるので、 やらない方がいいと思うんだが。 つーか、俺なら叩くなw
普通はGetAsyncKeyStateを使って押されているかどうかを調べると思う。
これだとエミュレートは出来ないと思います。
>>716 >>702 を見ると、スクリプトではうまくいくそうだから、
何らかの方法があるはず。
ところで、ファンクションキー以外のキー(例えば A )は上手く行くの?
>>702 キーボード入力のフェイクは、SendInputでやること。
DirectInputにも対応したかったら、SendInput必須
スキャンコード指定すればDirectInputでもおk。
//keybd_event()でもできないことはないが、ドキュメント化されていないのでお勧めしない
Vistaだと、自分より権限が高いウインドウには、送れないようになるらしいけど。
>>728 > Vistaだと、自分より権限が高いウインドウには、送れないようになるらしいけど。
HIDフィルタドライバー経由でいけそうな気もしないではないけど…
そこまでやったことないな。
98って何年前のwindows
98年前だ
732 :
デフォルトの名無しさん :2006/06/16(金) 17:11:59
来年にはWindows99になるのか
来年Windows-1が発売します
>>729 ドライバ辺りはまったくの素人だからわからないのだけれど、
それをするには管理者権限が必要になるんじゃないのかな?
Vistaは、管理者が実行しても、デフォルトでは一般ユーザ権限で実行されるのだけれど。
権限をしっかり考えていなかったコードが、
必要以上の権限を要求したりしていることがよくあるから、
その辺の互換性は大丈夫なのか心配になるけど。
736 :
702 :2006/06/16(金) 18:09:24
レス遅れました。
>>716 さん,
>>727 さん,
>>728 さん,
>>729 さんレスありがとうございます。
>>716 さん
入力先はゲーム(DirectX使用)です。DirectInput関数でキーを拾うと反応
しないなんて知りませんでした。他のレスではSendInput()だと拾えるような
ことが書いてありますね。どっちが正しいのか試してみます。
>>727 さん
GetAsyncKeyState()ですか。ということは今のところDirectInputとGetAsyncKeyState()
の2種類は物理的に信号を発生させないと無理かもしれないということですね。
ちなみにWM_CHARに関しては入力を正しく受け付けています。
>>728 さん
716さん、727さんのおっしゃっている関数でSendInputを拾えるかどうかを確認
してみます。むしろDirectInput()については結論がでているようですが、これも
勉強のうちなので。
>>729 Vistaですか。ますますエミュレートするのが困難になるわけですね。。。
>>735 ドライバとスクリプト駆動アプリ間の インターフェース DLL を ちゃんと真面目に作れば
スクリプト駆動アプリ はユーザー権限のままでいける
問題は インターフェース DLL をちゃんと作るのが大変っぽいのよね…
なんだボットか
D言語ってどこらへんがいいんだ?<時代のさきっちょに乗ったつもり
>>739 D言語スレがありますので、そちらでどうぞ。
Win32APIなのかわかんないのですが、他に答えが得られそうなスレが無かったのでここで質問させてください サーバーソケット(?)へクライアントが接続したかどうかを知る方法はありますでしょうか? やりたい事は「***がサーバーに接続しました」と表示することです よろしくお願いします。
WinSock?
>>741 は他プロセスのコネクションを覗き見たいのだろう。
ドライバでも書いとけ。
エスパー登場w
MessageBox(NULL, "***がサーバーに接続しました", "741", MB_OK); これでいいんじゃない?
>>741 それが出来ずにいったいどうやってクライアントの接続を処理してるのか気になる
accept puts("***がサーバーに接続しました");
>>747-478 あれ、もしかしてacceptが接続されるまでループしてくれるのかな
おかげ様で解決できそうです、ありがとうございました!
つまり、やってみもしないで、グダグダと聞き回っているわけだな?
>>750 accept
recv
まで書いて実行してみたところ、固まって
んで、接続もされてないのにrecvループしてるのが原因なのかと勘違いして
とりあえず答え求めてgoogle検索して出てきたソースで試してみたところ、やっぱし固まって・・・
(シングルスレッドでやってるソースしか出てきてなかったわけじゃないと思いますが、コードの一部だけをコピペして試してたので)
僕の知識では全然acceptに気づかなくて、どうしようもなく行き詰ってたんです
僕の間抜けさ故に不快にさせてしまって申し訳ないです
#追伸
こうして行き詰った理由を文章に書いたことで僕の間違いを再確認できました、
おかげで少しだけ成長できた気がします。ありがとうございました
ごめんなさい。でも、APIの質問ができたら来てもいいですか?
どうぞいらっしゃい。
パレットのプログラミング、というものを学習中です。 同時発色可能な色数が発色可能な色数より少ない場合に必要なのだ、という事はわかりました。 256色モードだけで必要、と書いてはありますが、しかし、余りに面倒な気がします・・・ こんなプログラミングをどのアプリもやっているのだろうか? 適当に色合わせをしてくれるライブラリとかはないのでしょうか?
なんでいまさらパレット? WinXPは互換モード以外256色なんて使えねーよ?
>>755 特に今必要じゃなかったらあとで必要になった時にまたやればいい。
gif png アイコンなんかを直接いじりたい場合とかか
759 :
デフォルトの名無しさん :2006/06/17(土) 20:03:15
VC6でDLLを作って、VB6で使用しています で、クラスを登録したいんですが、DEFファイルはどう書いたら良いんでしょうか? 関数と同じではダメなようなのですが・・・VBで使うので、 class __declspec( dllimport ) ClassName は使えないみたいです。ご教示よろしくお願いします。
>>755 パレットを使うと、(文字通り)色を調整するのが楽だという理由でパレットカラーの画像フォーマットを採用する場合もある。
#得に典型的な画像フォーマットはxpm。こいつはテキストでもありCソースの一部としても使える。
いずれにしても、このスレ的には忘れていい。
#逆に言えば、これ以上の話はスレ違い。
DEFファイルなんか必要なのか? 俺なんか一度も使ったこと無いけど。
>>755 Delphi Graphic Secretsでも読めよ。もう廃刊になってるかもしれんけど
いい本だよ。
763 :
デフォルトの名無しさん :2006/06/17(土) 20:29:20
Del厨はDelスレから出てくんな
エディットコントロールの外枠から最初の文字が表示される 隙間の幅を指定できますか?
>>759 VBからクラスの形で使いたければActiveXでないといけない。
768 :
764 :2006/06/17(土) 20:57:11
間違いましたorz
>>765 ありがとうございます
>>766 そうなんですか、関数でラッピングする方向で考えてみます
ありがとうございました
半透明のポップアップメニューを作りたいのですが、どうやれば作れるのでしょうか?
ポップアップメニューを半透明にすればいいよ SetWindowAttributeLayeredなんちゃら
スレッドの終了待ちってどこですればいいですか? // STOPボタンが押された時 HANDLE handle = Thread->GetHandle(); Thread->Stop(); WaitThread( handle, INFINITE );//WaitForSingleObjectのラップ CloseHandle( handle ); なんてコードをGUIスレッド側で書いてるのですが、 たまにスレッドの終了に時間がかかってGUIが固まってしまうときがあります。当たり前ですが。 なので、どのようにスレッドの終了を待って、クローズすればいいのか 教えてください。 というか、一々WaitForSingleObjectで待ってなくて、CloseHandleで閉じても いいのでしょうか?
>>773 スレッドの終了処理を必要としないならばTerminateThreadとかで強制終了しても構わない。
メモリ解放とか終了処理があるのならば、普通はスレッドのクラスに「割り込みフラグ」を持たせておいて、
スレッドの処理内部で常にその「割り込みフラグ」がtrueに設定されたか監視するようコードを書き、
スレッドを生成した側で「割り込みフラグ」にtrueを設定して終了を通知する。
まあJavaのThreadの仕組みなんだけど参考にするといいと思う。
スレッドハンドルを使う必要が無ければ、作成直後に閉じてもいいし、スレッド側で閉じてもいい。 後者はMFCでも行われている。
>>774 スレッドの終了処理を必要としないならばTerminateThreadとかで強制終了しても構わない。
Cのランタイムライブラリを一切使わないおつもりでしょうか?
>>773 待つなら、MsgWaitFor〜の待機関数かタイマ。
タイマは使えない場合も有り
ひとつ聞いておきたいんだ。
>>775 でも言っているけど、
あるスレッドハンドルに対してCloseHandleすると、
そのスレッドまで終了すると信じていたのは自分だけじゃないよな?
いや、Advanced Windowsにも書かれていたから、結構な人がそう信じているんだろうけど。
779 :
774 :2006/06/18(日) 00:18:39
>>776 あらっ、なんかやっぱりスレッドの強制終了ってヤバカッたの?
そこら辺までは詳しく知らなかったです。
スレッド処理で、終了時に外部ファイルなどに状態を保存しておかないと、
次の起動時に不都合がでるようなアプリ以外では、
普通にスレッドの強制終了してもよいかとオモテました。
>>779 ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminatethread.asp >If the target thread owns a critical section, the critical section will not be released.
>If the target thread is allocating memory from the heap, the heap lock will not be released.
>If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
>If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.
相当危険だな。
返信ありがおうございます スレッドが実行中でも、ハンドルを使わなければ閉じて構わないんですね。 この方法使います。
TerminateThreadは原則禁止と思っておいた方がいい
質問の答えとしては
>>777 かな
Win32APIで作られてるソフトでオープンソースなものしってる限り教えて頂けないでしょうか 参考にしたいです
>>783 Windowsアプリのプログラム経験ないならSDKのgeneric.c
自分で作ったビットマップをTBSTYLE_TRANSPARENTとTBSTYLE_FLATスタイルを持たせた ツールバーのボタンに設定するとき、どのようにしてビットマップの背景を透過させるとよいでしょうか。
>>786 適当な透過色を設定したImageListを用いて、TB_SETIMAGELISTで
ボタンイメージを設定する。
うまくいきました。ありがとうございました!
ダイアログ上に設置したリストビューコントロールについてどうしても解決できないのですが VC++2003.netにてWin32プロジェクトを作成し、ダイアログボックスを設置、そのダイアログボックス上にリストビューコントロールの Viewをレポート、Edit labelsをtrueにして配置しウィンドウを作成、リストビューにアイテムを適当に挿入してアイテムの内容を編集 しようとして文字を追加入力、又は消去した瞬間にダイアログボックスが落ちてしまいます。ちなみにアプリは無事で、エラーは出ません たまにアサートが出ますがどうやらメッセージ処理関数内で何かが起こっている模様です 上記の行為を通常のウィンドウ上に作成したリストビューコントロールで行っても特に問題はありません また、WTLを使用して行った場合も同じ状況になります ただし、MFCを使用した場合だとウィンドウ、ダイアログ上ともに問題なくラベル編集できます 現状でMFCを使用しない状態でダイアログボックス上のリストビューコントロールのアイテムのラベル編集は出来ないのでしょうか?
790 :
789 :2006/06/19(月) 17:28:15
すいません、たまに出るのはアサートではなくて例外エラーでした
できないわけがない
ヌルポじゃないの
↓
│↑ └┘
>どうやらメッセージ処理関数内で何かが起こっている模様です そこまで分かってるならステップ実行でもして何処でなにが起こってるのか調べれ
初心者はデバッグしないから困る
797 :
デフォルトの名無しさん :2006/06/20(火) 00:10:28
知識もなしにはじめるから、デバックのやり方とか、それ自体知らない人もいそうな悪寒。 そのうち分かってくるからいいんだけどね
逆にコードをちょっと見直せばわかるバグを 一生懸命ステップ実行してハマる奴もいるからなぁ
799 :
789 :2006/06/20(火) 02:23:32
>795 ステップ実行というか、エラーが出ているのが自作関数とかではなくモジュール内なので、アセンブラになってしまうんですよ ダイアログプロシージャーを抜けた先だかで例外で落ちてるらしく NULLでのメモリアクセスエラーにしても、何がNULLなのやら…… やってることと言えば、もう、ただ新規でプロジェクト作成してダイアログ作成前にInitCommonControlsやってWM_INITDIALOG内でカラムとアイテムを挿入してるだけなんですけどね…… あ〜、ちゃんとcommutil.hインクルードしてcomctl32.libリンクしてます もう、ほんと、何で駄目なんだろう……
800 :
デフォルトの名無しさん :2006/06/20(火) 02:37:27
>>798 まあ、それは知ってるのにできないから、訓練不足でしょ。
おれが言いたいのは、知らないとどうしようもないってこと。
801 :
仕様書無しさん :2006/06/20(火) 04:10:47
プログラムを実行したユーザーにアクセス権が設定されていないファイル に対して、プログラム中でファイルの所有権を一時的に取得して、ファイル アクセスした後、所有権を解除(元に戻す)したいんですが、とっかかりが なくて困ってます。SECURITY_ATTRIBUTE構造体あたりが関与してそうな気も しますが、どのAPIを使ったらいいんでしょうか?ググってもいまひとつ、 ヒットしなくて。 プログラムを実行したユーザーは、Administrator等、所有権を変更する 権限がある状態と仮定します。プログラムを実行したユーザーに、ファイル の所有権を変更する権限があるかどうか調べるAPIってのはあります?
AdjustTokenPrivilegesでいいんでね?
>>799 エラーが出てるという関数の引数はチェックしたよね?
804 :
798 :2006/06/20(火) 13:37:17
>803 エラーが出てるという関数自体はDialogBoxなんですよ、設定しているDialogProc関数の処理はWM_INITDIALOG以外のメッセージは全部FALSE返すようにしていて、初期化処理の中身はリストビューコントロールへのアイテムとカラム追加処理のみです…… それ以外はプロジェクト作成時からいじっていないんです……あ、InitCommonControlsは入れましたが ちなみにカラムの追加は HWND hWndList = ::GetDlgItem(hDlg, IDC_LIST); LVCOLUMNLvCol; ::memset(&LvCol, 0, sizeof(LVCOLUMN)); LvCol.mask = LVCF_TEXT | LVCF_FMT; LvCol.pszText = _T("名前"); LvCol.fmt = LVCFMT_LEFT; ::SendMessage(hWndList, LVM_INSERTCOLUMN, 0, reinterpret_cast<LPARAM>(&LvCol)); という処理で、アイテムの追加は LVITEM LvItem; ::memset(&LvItem, 0, sizeof(LVITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = 0; LvItem.iSubItem = 0; LvItem.pszText = _T("てすと"); LvItem.state = 0; LvItem.stateMask = 0; LvItem.iImage = 0; LvItem.lParam = 0; ::SendMessage(hWndList, LVM_INSERTITEM, 0L, reinterpret_cast<LPARAM>(&LvItem)); という処理で行ってます……何がいけないんだ ちなみにWTL使用してる方ではリストビューコントロールをサブクラス化してリストビューのメッセージ処理にREFLECT_NOTIFICATIONSを加えたら動きましたorz
805 :
801 :2006/06/20(火) 14:27:40
>802 即レスどうもです。どうやら、そのようですね。ありがとうございました。
>>804 拾ったwin32のサンプルでラベル編集してみたけど特に問題なく動いたよ
807 :
798 :2006/06/20(火) 16:33:54
>806 わざわざありがとうございます あうぅ、何がいけないんだろう ……あ、何処で拾ったか教えていただけますか? ソース見てみたいです
netshコマンドがやっているようにWMIやnetshを間接的に使用せずに DHCPをEnableに設定するWin32APIをご存知ありませんでしょうか? PlatformSDKのIPHelperAPIを探しても renew/releaseなどしか見つかりませんでした。
809 :
デフォルトの名無しさん :2006/06/21(水) 01:46:18
WindowsPCが、今インターネットに繋がっているかどうかを、 Win32APIなど使って、確認するには、どういう手段を使えば良いでしょうか? ・NICが装着されてる ・IPアドレスが割り当てられてる の確認くらいは思いつくけど、その先が... 強引にパケット出して、自動ダイアルアップ環境にあるPCで、 ダイアルアップをさせることは避けたい。 というのがあるので、何か良い方法ないですかね。 できれば、ダイアルアップ・ルータの自動接続もさせたくないです。 で、インターネットに繋がっているときだけ、ちょちょっとデータ転送したい。
転送先につなげてみりゃいいじゃん。 あるいはping打ってみるとか。
>>809 ・グローバルIPが振られていたらインターネットに
つながっっていると見なす
・ルータとお話するには
・UPnP
・機種限定で汚い方法でいいなら設定画面解析など
・ルーティングプロトコルで話をする
ごめん、よくわからねえ。
>>810 ping 打ったらダイアルされてしまいますが?
「ルータに接続されているが、インターネットには接続されていない」
という状況はPCからは確認のしようがない。
ルータの管轄だからな。
つまり
>>810 が一番確実な手段。
>強引にパケット出して、自動ダイアルアップ環境にあるPCで、 >ダイアルアップをさせることは避けたい。 >というのがあるので、何か良い方法ないですかね。 >できれば、ダイアルアップ・ルータの自動接続もさせたくないです。 こんな制限付けたら調べようがないと思うけどなんで? 電話代の問題? >で、インターネットに繋がっているときだけ、ちょちょっとデータ転送したい。 スパイウェアでも作るつもりですか?
815 :
809 :2006/06/21(水) 05:27:55
アップデートのお知らせをソフトを起動してるときに自動的に できるようにしようかと思って。 でも、そのためにダイアルアップ環境で使ってるような場合に、 インターネットに繋いでしまうようなことまではやりたくない。 という事なんだけど、考え出すと、なかなか妙案が浮かばなくて。 例えば、IEなと他のソフトが、今インターネットアクセスしてるかどうか 調べるような方法があるかとか。 確実に常時接続環境だということが判別できる方法はないかとか。
InternetGetConnectedStateは?
常識的なソフトなら 自動チェックする、しないをユーザーが選択できる。
>>817 でFAな希ガス
ユーザが自動チェックすることを選んだなら、
ダイアルアップ使っても問題なさそうだし
819 :
デフォルトの名無しさん :2006/06/21(水) 11:49:23
質問があります。 モードレスダイアログを作ってそこで別スレッドで長い処理をやらせて内容を表示させています。 処理が終わる前に先に進まれると困るので本体でWaitForSingleObjectで スレッドが無くなるまで待つようにするとフリーズしてしまいます。 どうやら原因はWaitForSingleObjectで止めるとモードレスまで止まってしまうのでスレッドの内容が モードレスに反映されないみたいなんだけど、モードレスだけ動かすことはできませんか?
処理終わるまでWaitForSingleObjectで待つって、スレッド作った意味無いじゃん。
処理が終わってないなら進ませなければ良いだけの話だろ!
処理が終わる前に先に進まれると困る方を別スレッドにすべきだったな
>>819 スレッドの処理が終わったら、スレッドからメッセージを投げればいい。
824 :
798 :2006/06/21(水) 12:47:04
>>824 まず何所で落ちるのか調べろ。話はそれからだ。
>>824 試しにコンパイルしてみたが別に落ちないぞ?
ウィンドウのCaptionを調べる事はできるのでしょうか? FindWindowに渡すための第二引数を取得したいのですがいい方法が見付かりません。 よろしくお願いします。
GetWindowText これくらい自分で調べろバカ
>>828 FindWindowsはウィンドウクラス名分かってる場合はウィンドウキャプション省略できるぞ。一応。
831 :
828 :2006/06/21(水) 18:47:17
>>829 バカで申し訳ない。でもおかげ様で思った通りにできそうです。ありがとうございました。
>>830 クラス名はわかっているのですがありがちな名前すぎて話にならないのです。
>>829 FindWindow に渡すための ウインドウ Caption を調べるために GetWindowText を利用する
なんか矛盾しているようないないような
# GetWindowText できてるなら FindWindow する必要がないようにも見えるが・・・
>>828 FindWindow( class_name_string, NULL) じゃだめなのか?
833 :
828 :2006/06/21(水) 18:53:06
なんてこった。GetWindowTextってWindowHandleいるんですねorz
>>789 のやつだがWM_COMMANDの所にブレイクポイント設定してデバッグしてみると
ラベル編集のときにwParam=0x01000000がくるときがあるが、
wParamのLOWORDが0になるときってどんなときか知ってる?
>>833 どうやってウィンドウを特定するつもりだったんだw
>>831 そこまで探しにくいのならEnumWindowsで調べた方が早いと思う。
実行ファイル名が分かってるならProcess32First/Next回してプロセスID取得>EnumWindowsで帰ってくるハンドルをGetWindowThreadProcessIdに突っ込んでターゲットのプロセスIDと比較とか。
837 :
828 :2006/06/21(水) 18:57:54
>>835 そうですよね。対象がないですよね('A`)
>>836 なんかよくわからない横文字がたくさん並んでいるみたいですが調べてみます。
ありがとうございました。
>>789 のやつ、ラベル編集するときにListViewが作るエディットコントロールのIDが0で
それがNotifyコード送ってきてた。
さらにラベル編集時にListViewが作ったであろうIDが1のコントロールから
Notifyが送られてくるから、IDOKの処理が行われてしまう。
だからボタンのIDにIDOKを使わなければダイアログは終了しない。
Microsoft Word上でコピーを行い、そのときのクリップボードの内容をメモリとかファイルに保存して、後でその内容をクリップボードに復元したいんですが、どうしたらいいですか? テキスト以外にもオブジェクトとかも含まれてるんで困ってます。
フォーマットを識別して個別対応するしかないんじゃないかな。
841 :
789 :2006/06/22(木) 11:10:52
>834 >838 うわっ、うわっ、うわっ、動きましたっ ありがとうございます うう、Windowsアプリのデバッグ(メッセージ関係)はブレークポイントの掛け処が難しいです…… もっと精進しまする〜
>>840 ありがとうございます。
これから各フォーマットについて調べてみます。
>>839 WordなんかはOLE使っているからOleGetClipboard()で
IDataObjectへのポインタを得ればどんな形式でも平気だと思う。
ところでシェルスクラップオブジェクト(拡張子shs)は、IDataObjectをファイル化したものだと俺は思っているんだ。
つまり何らかの方法でIDataObjectをシェルスクラップとして書き出す方法があるに違いないと思っている。
そうしたら(OLE対応のデータなら)どんな形式でも書き出せるようにできるはずだと思う。
今までのスレの質問と質問者が納得した答えをブログに まとめたいのですが構わないでしょうか?
846 :
デフォルトの名無しさん :2006/06/23(金) 12:18:44
>>844 わんわわわん わん!
(もちろん、アリフェイトで小銭をかせいじゃだめだよ)
847 :
デフォルトの名無しさん :2006/06/23(金) 12:20:02
独自プロトコル(UDP/IPおよびTCP/IP)でデータ通信するWinsock2を使ったアプリケーションを書いていますが、 WinXP SP2でbind()したときにセキュリティの警告ダイアログが表示されます。 このダイアログを、最初から出ないようにする方法はありませんか? ご存知の方がいらっしゃいましたらご教示ください。
>>848 ウィルスが勝手にポート開こうとしたときに警告でなかったら意味ないと思わないかね
少なくとも正攻法ではナイ
だとはおもいましたが、アプリケーションがどっかで証明とか受ければ大丈夫とかないんでしょうかね。
853 :
848 :2006/06/23(金) 13:12:16
そうですか、ありがとうございました。
854 :
852 :2006/06/23(金) 13:17:47
いや俺としてはそれを原動力にしてほしいがw
プログラムでXPのFWの設定もやっちまえばいいだけ
856 :
844 :2006/06/23(金) 13:52:49
こいつぁクールだぜ
( ゚д゚ )
こっち見るな
861 :
844 :2006/06/23(金) 14:46:16
862 :
848 :2006/06/23(金) 14:46:22
>>855 なるほど、それはどの辺りの資料を探せばわかりますでしょうか?
ヒントをいただけるとうれしいです。
WriteFileで改行含んだ文字出力したら、改行が「↑」って文字になっちゃうんだけど 改行ってどうするんですか?
>>864 WriteFileに改行なんて概念は無いよ。
何で表示してるか知らんが、その表示するアプリで改行されるようなデータ書き出せばいいよ。
\r\n
869 :
868 :2006/06/23(金) 15:58:27
>>867 それですね。普通のテキストエディタで表示できました。
エディットコントロールでなにも入力してない状態でスクロールバー を表示するにはどうしたら良いんでしょうか
WS_HSCROLL WS_VSCROLL ES_AUTOHSCROLL ES_AUTOVSCROLL
874 :
デフォルトの名無しさん :2006/06/24(土) 00:29:13
CreateWindowでウィンドウを作った後に、CUIのコンソールスクリーンに 文字を表示させたいのですが、そういうことは可能なのでしょうか。 WORD wAttributes; CONSOLE_SCREEN_BUFFER_INFO csbi; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdout, &csbi); wAttributes = FOREGROUND_GREEN; SetConsoleTextAttribute(hStdout, wAttributes); printf("wAttributes = %d\n", wAttributes); ↑こんな感じのコードを入れましたが、うまく動きませんでした。
>>874 mainなどから始まるプログラムでなければ、
AllocConsoleを呼べばコンソールが現れる。
ただし、printfは無理だと思う。
逆にmainから始まるようにすればprintfも問題なく使える。
>>874 editbin /SUBSYSTEM:CONSOLE xxxx.exe でいけた記憶があるな。
877 :
848 :2006/06/24(土) 01:56:42
>> 873 どうもありがとうございます。 まだ詳しく参照していないのですが、管理者権限を持つユーザーが実行している条件下で INetFwAuthorizedApplicationsを使用することにより、セキュリティの警告なしにポート を空けて独自プロトコルを動作させることはできそうですね。 しかし、 「アプリケーションは、自分自身を INetFwAuthorizedApplications コレクションに追加 する前に、ユーザーの同意を得る必要があります。」 とありますので、同意を得ずにポートをあけるのは問題があるでしょうね。 やりたいことは、アプリケーションが同一のセグメント上で複数動作するの を抑えたいだけなので、できれば警告などは無いのが望ましいのです。 他の方法が無いか探って見ます。 しかし、トロイの木馬がこのインターフェースを使用してポートを空けることができてし まうということなるのか、よく考えたらおそろしい・・・
同意画面が出たら無理矢理OKボタン押すようにプログラムすればいい
>>874 cのライブラリにもstdout設定する必要があると思うけどやった?
最近javaとかc#ばっかで何て関数かわすれた。
880 :
デフォルトの名無しさん :2006/06/24(土) 11:09:42
SetWindowRgnでへんてこなwindowを作って遊んでます。 WS_POPUPなwindowを case WM_NCHITTEST:return HTCAPTION; 見たいな感じで動かせるようになったのですが 上方向の画面外に移動させようとすると画面内に戻されてしまいます。 どうすればいいか教えてください。
自分でRegister&Createしたウィンドウ内にActiveXコントロールを入れ込む方法はどうやるのでしょうか? 1. RegisterClass() / g_hWndMain = CreateWindow("MyClass") 2. CoCreateInstance(CLSID_..., IID_IOleObject, &pOleObject) 3. pOleObject->SetClientSite(...) : コントロールに親ウィンドウのハンドルg_hWndMainを取得する手段を提供。 4. pOleObject->QueryInterface(IID_IOleInPlaceObject, &pOleinPlaceObject) 5. pOleinPlaceObject->SetObjectRects(...) : コントロールに親ウインドウの矩形と自分(コントロール)に割り当てられた矩形を教える。 ここまででコントロールに窓を表示する為の情報は教えたと思うのですが、表示できません・・・OrZ ちなみにWebBrowserコントロールだとここまでで窓(非表示)が生成されるので、この後に無理矢理 pOleObject->QueryInterface(IID_IOleWindow, &pOleWindow); pOleWindow->GetWindow(&g_hWndWBC) ShowWindow(g_hWndWBC, SW_SHOW); すればコントロールらしき白い空白が表示されます。(MyClassの背景は暗くしておく) でもこれだけではこのコントロールはまともに使えないみたい・・・ それに他のActiveXコントロール(VB5CCEで自作)ではなぜかpOleObject->EnumVerbs()しないと窓が生成されないし(でもサイズは0)、g_hWndMainの子ウィンドウにならない・・・ OLEスレはあるんですが、余りに効率が悪いのでSDKレベルでOLEをやっている人はあまり居ないみたいです。
マルチスレッドで標準CライブラリーとSTLは使えますか?
>>882 マニュアル調べてMTセーフかどうかいちいち確認しろ。
885 :
デフォルトの名無しさん :2006/06/24(土) 18:28:57
886 :
おか :2006/06/25(日) 00:19:00
OS:WindowsXP OnQueryEndSessionでログオフ/電源を切る/再起動を判別する方法知ってる?、 Win2000ではレジストリで取得できたのに。
887 :
デフォルトの名無しさん :2006/06/25(日) 08:17:35
回転させたいときはPlgBlt関数でOK?
>>885 freopen("CONOUT$", "w", stdout);
CreateProcessでコマンドプロンプトを起動させ、他のソフトのコマンドラインオプションを 入力する。方法は無いでしょうか? CreateProcessである必要は無いのですが、EXEの起動はWinExecとこれくらいしか 知らないので、他にもあるならお願いします。
ShellExec()
>>889 cmd /c tar -cf hoge.tar hoge0.txt hoge1.txt
892 :
874 :2006/06/25(日) 15:27:22
>>888 ありがとうございます。
無事printf関数で出力できるようになりました
893 :
889 :2006/06/25(日) 15:43:51
894 :
889 :2006/06/25(日) 16:06:12
再度すいません。
>>890 >>891 のおかげで出来るようにはなりました。
あつかましいですが、コマンドプロンプトにコマンドラインオプションを入力した
結果を表示って出来るのでしょうか?
例えば(ソフトによって違いますが)「○○処理は完了しました。」などを
CreateWindow("Edit"〜〜とかに反映させるとか、可能ですか?
出来るのであればお願いします。
コンソールアプリが作りたいの?
できます
898 :
889 :2006/06/25(日) 17:05:03
色々考えてる内にもうこんなにレスが・・ありがとうございます。
コンソールアプリという訳ではないのですが、結果的にはそれに近いかも知れません。
一応質問の前にConsole関係も調べたのですが、どうやら理解をしていなかった
ようです。リンク先大変参考になります。
>>895 >>896 >>897 どうもありがとうございました。これでなんとかなりそうです。
1秒間に30コマ 画面をキャプチャできる方法はありますか
ultravncを使う
nView Desktop Managerのズームウィンドウはなぜ30fpsで表示できるんですか??
ソフトウェアでの処理じゃなくてハードでの処理だから。
VC2005EEで作りたいです。どうやって30fpsも表示しているのだろう・・
>>902 !?
じゃあ、作るのは不可能なんですか・・?
え?キャプチャしたいんじゃなくて表示したいの?
君の知性では無理。
エベレストの山頂行って帰って来るくらいの努力は必要だな。
高橋名人に、PrtSc→貼り付け→保存を繰り返してもらう。 5コマぐらいはいけるかも。
>>903 なんでその程度の知識しか無いのにEEなんて持ってるの?
割れ厨ですか?
>>910 EE = Express Edition
最上位はTeam System
・パレットを設定して、色を使う。 ・配列に色の値を持たせておいて、色を使う。 この2つの違いが分かりません。 同じことをしているのではないかと思うのですが…。
ちがうよ LUTとかADCでぐぐってみな
教えてください。 Editコントロールの右クリックメニューに、独自のコマンドを追加するにはどうしたらいいでしょうか。 WM_INITMENUPOPUPは来ないし、WM_CONTEXTMENUだと一から作ることしかできないし。
サブクラス化で出来ないかな
916 :
449 :2006/06/26(月) 12:58:53
> 結果は書いてなかったので試してみます。 下記のようなソースで試した結果、ロックを判定できました。 > while( 1 ) > { > Sleep( 3000 ); > hDesk = OpenInputDesktop(0, FALSE, 0); > if( GetUserObjectInformation( hDesk, UOI_FLAGS, &UserObjFlg, sizeof( UserObjFlg ), &WriteByte ) ) { > puts( "ロック中ではありません。" ); > } else { > puts( "ロック中です。" ); > } > }
>>914 この手のアプリは一から頑張って作ってるに一票
>>884 ありがとうございます!
BCCだけで何とかするように頑張っている訳ですが、きっと参考になると思います!
しかし何でこの部分「Platform SDK: COM」文書はウヤムヤな事しか書いていないのか・・・
で、一応報告。
まだまだゴソゴソやってるんですが、自作コントロールの場合、
1. RegisterClass() / g_hWndMain = CreateWindow("MyClass")
2. CoCreateInstance(CLSID_..., IID_IOleObject, &pOleObject)
3. pOleObject->EnumVerbs() // 取得したポインタはそのまま捨てる(Release)
4. pOleObject->QueryInterface(IID_IOleWindow, &pOleWindow);
5. pOleWindow->GetWindow(&g_hWndWBC)
6. SetParent(g_hWndCtrl, g_hWndMain); // 無理矢理子ウィンドウに(^^;)
7. ShowWindow(g_hWndWBC, SW_SHOW); // 表示
8. メッセージループ突入
こんなやり方で、一応表示されているように見えます。コントロールに搭載されているボタンに結びつけられたOnClickプロシージャもちゃんと動作しているように見えます。
このコントロールに限りこれで使える事は使えるのかも。
しかし、WebBrowserコントロールにはこのやり方は通用しない・・・WebBrowserはEnumVerbs()してもウィンドウは生成されない。
どのコントロールでも使える正しい方法はどういうものなのだろうか?
というかそもそもEnumVerbs()して何で生成されるかワケがわからない・・・
SendInput
922 :
914 :2006/06/27(火) 11:00:14
WM_CONTEXTMENUで一から作るしかなさそうですね。 回答してくれた方、ありがとうございました。
リッチエディットをCreateWindowで作ってすぐ SendMessage(hEdit, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cfm); したら入力した文字の2文字目から違うフォントになってしまいますどうしたら良いんでしょうか?
924 :
デフォルトの名無しさん :2006/06/27(火) 18:06:00
button(チェックボックス)がチェックされているかを調べる関数を教えて下さい。 宜しくお願いします。
SendMessage
926 :
デフォルトの名無しさん :2006/06/27(火) 18:17:02
>>925 ありがとうございます。
このご恩は忘れません。
927 :
923 :2006/06/27(火) 18:22:08
自己解決しました
928 :
920 :2006/06/27(火) 20:12:08
>>921 できました!
ありがとうございました!
929 :
920 :2006/06/27(火) 23:29:59
SendInputの件ですが、メモ帳には入力を送れたのですが、 MAME32というゲームのエミュレータは無反応です・・・ SetForegroundWindowで送り先のウィンドウをアクティブにし、SendInputで入力する、という 処理ですが、ウィンドウはアクティブになるものの、入力が反映されません。 同じ入力をキーボードから直接行うと反応するのですが・・・ キーボードからの直接入力とソフトからのSendInputによる入力ではどこが違うのでしょうか?
MAMEはDirectInputでも使ってるんじゃない?
931 :
920 :2006/06/27(火) 23:51:11
>>930 DirectInputを使っていても、MapVirtualKey()でスキャンコードを取得すれば
大丈夫らしいんですが、それでもできないです(汗)
ttp://printf.jugem.jp/?eid=346 ↓送信部はこんなかんじです。(仮想キーコード65は「A」のことです)
case WM_TIMER:
hWnd_obj = FindWindow( "classMAME32" , NULL );
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 65;
input[0].ki.wScan = MapVirtualKey( 65 , 0 );
SetForegroundWindow( hWnd_obj );
Sleep( 30 );
SendInput( 1 , input , sizeof( INPUT ) );
return 0;
自己破産しました
よそ様のウィンドウのタブコントロールをTabCtrl_SetCurSelで選択している タブを変えて、その親ウィンドウにタブが変更されたことを示すWM_NOTIFY をLPARAMにNMHDRへのポインタをセットして送信したいのですが、アドレス 空間が違うためうまくいきません。 解決策、あるいは他の良い代替方法はありますか?
VirtualAllocExでよそ様のウインドウのアドレス空間にNMHDRの領域を確保して WriteProcessMemoryでデータを書き込んで そのポインタを渡してやるとか
マウスで押された事をエミュレートした方が楽な希ガス
>>931 キーは押し下げるだけでなく、
上げることもあるのだ。
>>931 それから、65じゃなくて、'A'としたほうがわかりやすい。
ASCII以外の文字セットを使っているWindowsは、寡黙にして聞かない。
938 :
デフォルトの名無しさん :2006/06/28(水) 10:40:30
顧客に納品後にごくたまにrun timeエラーが出るときがあるんだけど、状況を聞いてもエラーを再現出来なくて問題を特定出来なくて困ってる。 で最近しったんだけど、タブブラウザのスレープニールとか、Mozilaとかにはエラーフィードバックエージェントみたいなのがあるみたいなんだけど、 これって、どうやって実装してるんだろうか?、そういうパッケージとかソリューションがあるの? 何か情報持ってたらお願いします。
ということはプニルはMozilaからソースパクってるのか
鯖落ちた?
復活
>>938 スレープニールもMozillaもどうやってるのか知らんけど、
発生するエラーが特定来てるんなら、そのエラーを
ハンドルすればいいじゃんかよ?
あとは実行ログとかエラーログとか画面キャプチャと付き合わせる。
パッケージは知らん。
画面キャプチャも送信させちゃうのか。
IEのsend, recvをhookしようとしてて、APIHook試そうとしてもまったく出来ない ActiveXでブラウザ部分のコンポーネント使ってるからIE自体の実行部分にsend, recvが見当たらないんだと思うけど どっかにIEのsend, recvをHookしてるようなサンプルソースありません?
串使うんじゃないか?
>937 UNICODE
リストボックスのアイテム選択したら生成できなくなったんですが どうやったら新たにアイテムを追加できますか? 教えてください。お願いします。
ビットマップの幅と高さを得るAPIってありますか? HBITMAPまたはHDCを使って得るようなやつです
951 :
947 :2006/06/28(水) 21:49:53
事故解決しました。 手前で範囲外の配列指定やってました。
952 :
デフォルトの名無しさん :2006/06/28(水) 22:45:30
乙
954 :
920 :2006/06/28(水) 23:21:08
良くわからないうちにできるようになりました・・・
>>936 後々、その問題にもあたりました。
今は解決しています。
ありがとうございました。
>>937 'A'という表記もありなんですね。
ありがとうございました。
Win64API
タスクトレイのアイコンにマウスを乗せると、ツールチップが出ますが、 この文字列をアプリケーションから取得するには何というAPIを使えばできますか?
GetWindowText
958 :
956 :2006/06/29(木) 14:44:18
>>957 GetWindowTextは試してみましたが、タスクトレイのアイコンのツールチップの内容ではなく、
そのアプリケーションのタイトルバーらしき文字列しか取得できませんでした。
例えばタスクマネージャを起動すると、タスクトレイには "CPU 使用率 ○%" というツールチップが出ますが、
GetWindowTextで得られるのは "タスクマネージャ"という文字列のみでした。
"CPU 使用率 ○%" を取得する方法って無いものでしょうか。
>>958 ちゃんと「ツールチップのウィンドウハンドル」を渡しているのか?
てか、ツールチップのウィンドウハンドルなんて取得できるの?
961 :
デフォルトの名無しさん :2006/06/29(木) 17:41:06
>>960 ウィンドウハンドルを取得できないウィンドウなんてあるのか?
必要なくなって破棄されたウィンドウとか
実行ファイルのあるフォルダの名前を取得する方法ありますか?
964 :
デフォルトの名無しさん :2006/06/29(木) 18:52:07
965 :
デフォルトの名無しさん :2006/06/29(木) 18:52:24
GetModuleInstance
>>963 「実行ファイル」とは何なのか、詳しく説明してもらおうか。
>>965 >956 >958 でツールチップって言ってたからな。
> この文字列をアプリケーションから取得
いや、吊られちまったのか
>>964 WinMainからの起動なのでargvが見当たりません。
>>966 ぐぐってみましたけど、これはC++のメソッドですか?
APIなど、Cからでもできる方法が嬉しいです。
>>967 VC++で作成したx86実行バイナリと言えばいいでしょうか。
拡張子.exeを持つファイルです。
#include <stdlib.h> __argv[0]
>>969 スマン間違い
GetModulePath
GetModuleFileName(NULL, , );
GetModuleFileName( NULL, path, MAX_PATH )
976 :
958 :2006/06/29(木) 23:28:04
マウスを乗せると出てくるツールチップ(呼び方違いますか?)の文字列を、マウスを乗せずに取得したいんですよ・・。 そういうAPIって無いんですかね。ググっても全然それらしいのが出てこないっすね。
>>976 ツールチップが表示されていないときに文字列を取得するのは無理な場合もあると思う。
マウスを乗せて初めて文字列を決定する場合があるから。
文字列が固定されているツールチップなら取得できるかもしれないけど…。
ツールチップを出すのはアプリケーションだ。 ツールチップが出る前に中身がほしいと思ったら アプリケーションに働きかけるしかないんじゃないだろうか。 ツールチップが表示された後なら、ウィンドウハンドルを どうにかして取得すれば後は簡単だと思うが。 目的と手段が逆になってたりしないか?
979 :
958 :2006/06/30(金) 01:19:14
タスクトレイにアイコンを登録する時点でツールチップの文字列も指定するので、 どこかに常に格納されてていいはずなんですよね。
980 :
デフォルトの名無しさん :2006/06/30(金) 03:50:28
>>979 それがその後のホバー時に表示される文字列と同じという
保証はないだろ。
>>979 タスクトレイのツールチップって、実装としてはNOTIFYICONDATA構造体のszTipだろ?
ウィンドウハンドル取得しても、ウィンドウハンドルとNOTIFYICONDATA構造体を、
内部的にどうやって関連付けてるかなんてわからんし、
ウィンドウハンドルから取得するのは無理だと思うけど。
タスクトレイに登録されている一覧を取得するAPIがあったらできるかもしれんが、わしはしらん。
Shell_NotifyIcon(SHELL32.dll)にフックしかけとけば?
CPUの使用率ならパフォーマンスカウンタとかそれ専用のAPIから取れそうな気もするが、 タスクマネージャから情報を取らねばならぬのはなぜ。
EDITコントロールの最大入力文字数をIDで設定するにはどうしたら よかったのでしょうか?
>>984 SendMessage(EM_LIMITTEXT, GetDlgItem(hWndDlg, IDC_EDIT). (WPARAM)999, 0);
>>983 よくわかんないけどNT系ならNtQuerySystemInformationで得た値をいじる
>>985 SendDlgItemMessageも忘れないで。
そんなくそ関数だからマクロだから知らないけど知りません
そういう場合は 「関数だかマクロだか」 と表現するのですよお嬢様
>>992 SendDlgItemMessageを使うメリットは?
>>992 985のようにSendMessageとGetDlgItemを組み合わせるより文字数が少なくてすむ。
つまりどうでもいいAPIってことだな
埋め
>>994 そういうこと。
逆に言えばSendMessageとGetDlgItemで代用できるから、
知らなくても困らないし、知らない人も多いのだろう。
梅
一時期使ってたけど、ハンドルの方が関数化したときに扱いやすいことに気付いて使うのやめた
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。