[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 06/21 21:33 / Filesize : 230 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Win32API質問箱 Build51



1 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 03:44:55 ]
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

610 名前:603 mailto:sage [2007/04/08(日) 15:00:54 ]
>>609
WM_COPYDATAメッセージは届くのですが、COPYDATASTRUCT構造体の内容の参照が上手くいきません。
フックは次のようにセットしています。
#define EXPORT __declspec (dllexport)
#pragma data_seg(".shared")
static HHOOK hHook = NULL;
static HWND hWnd = NULL;
#pragma data_seg()
EXPORT HHOOK SetHook(const HWND hCaller)
{
hWnd = hCaller;
hHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)HookProc,hInst,0);
return hHook;
}
ウィンドウプロシージャでは次のように処理しています。
case WM_COPYDATA:
if (((PCOPYDATASTRUCT)lp)->dwData == WM_NCLBUTTONDOWN) {
pmhs = (PMOUSEHOOKSTRUCT)lp;
if (pmhs->wHitTestCode == HTCAPTION) {
SetWindowText(pmhs->hwnd,"猫でもわかるフック");
}
}
break;


611 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 15:22:04 ]
>>610
> pmhs = (PMOUSEHOOKSTRUCT)lp;
pmhs = (PMOUSEHOOKSTRUCT)((PCOPYDATASTRUCT)lp)->lpData;
だろ常識的に考えて

612 名前:603 mailto:sage [2007/04/08(日) 15:38:41 ]
>>611
すみません。ウィンドウプロシージャの処理を訂正します。(^_^;)
PCOPYDATASTRUCT pcds;
PMOUSEHOOKSTRUCT pmhs;
case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lp;
pmhs = (PMOUSEHOOKSTRUCT)(pcds->lpData);
if (pcds->dwData == WM_NCLBUTTONDOWN) {
if (pmhs->wHitTestCode == HTCAPTION) {
SetWindowText(pmhs->hwnd,"猫でもわかるフック");
}
}
break;
ローカルフックには成功したのですが、グローバルフックに失敗します。

613 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 16:03:20 ]
SetWindowText が気になって仕方ないが、
WindowProc 内での pcds->dwData とか pmhs->wHitTestCode とかはどうなんだ?
正しい値を示してるのか?

614 名前:603 mailto:sage [2007/04/08(日) 16:46:12 ]
他のアプリケーションにフックDLLがロードされていることは確認できたのですが、
COPYDATASTRUCT構造体の内容が空のようです。

615 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:41:35 ]
msdn.microsoft.com/library/ja/jpwinui/html/_win32_setwindowtext.asp
> ほかのプロセス内のコントロールのテキストを設定するには、SetWindowText 関数を
> 呼び出すのではなく、直接 WM_SETTEXT メッセージを送ります。

何でフックがうまくいってないと思い込めるんだかさっぱり分からん。
明らかに間違ってたソースも「訂正します」の一言で済まされるし。

616 名前:603 mailto:sage [2007/04/08(日) 18:54:38 ]
あたながたが思いのほか低スキルだったのでがっかりしています。
2ちゃんもたいしたことないですね。

617 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:56:30 ]
↓真603による「616は私ではありません」というレス

618 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:56:33 ]
615は無視かよ



619 名前:603 mailto:sage [2007/04/08(日) 19:50:46 ]
>>615
SendMessage(pmhs->hwnd,WM_SETTEXT,0,(LPARAM)"猫でもわかるフック");
としたのですが、ウィンドウタイトルは変更されません。
間違ったソースを掲載したことについては深くお詫びします。大変申し訳ありませんでした。

620 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 20:43:43 ]
>>619
dll.defに
SECTIONS
.shared SHARED READ WRITE
が有るか確認するとか

char sz[100];
wsprintf(sz, "pmhs->hwnd:%p ", pmhs->hwnd);
SetWindowText(hWndExe, sz);
として様子を見るとか

621 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 23:19:23 ]
うまくいかないときには何がおきてるのかを見極めて原因究明。
期待通りにいくかいかないかだけを判断してたらいつまでたってもなおらん

622 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 00:44:15 ]
デバッガ使ってないのかね?
1ステップずつ確認すれば、問題点はすぐに分かると思うが。

623 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 00:47:43 ]
フックプロシージャのステップ実行なんて出来るの?

624 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 01:14:11 ]
フック先のプロセスにアタッチしろ。

625 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:09:06 ]
別にデバッガ使わなくてもログをファイルに書き出せばいいだけだし

626 名前:603 mailto:sage [2007/04/09(月) 10:33:11 ]
>>620-624 レスありがとうございます。
>>620 モジュール定義ファイルは作成済みです。内容は次の通りです。
LIBRARY hook
SECTIONS
.shared READ WRITE SHARED
EXPORTS
HookProc @1
ResetHook @2
SetHook @3
pmhs->hwndの値をウィンドウプロシージャ内で出力したところ、
ローカルフックでは00060AA2でした。グローバルフックでは何も出力されませんでした。
グローバルフックではWM_COPYDATAメッセージが届いていないようです。(^_^;)
>>622 デバッガは使用していません。OutputDebugStringを使って変数の値をトレースしています。
>>623 プロセス間を跨いだデバッグ作業はどのように行うのでしょうか?
>>624 明示的にアタッチする方法があるのですか?
>>621 今までの状況を整理してみました。
・ローカルフックには成功し、グローバルフックには失敗する。
・ローカルフックの場合、フックDLLがロードされ、WM_COPYDATAメッセージが届く。
・グローバルフックの場合、フックDLLはロードされるが、WM_COPYDATAメッセージは届かない。

627 名前:デフォルトの名無しさん [2007/04/09(月) 11:00:13 ]
WindowsXPの[ユーザのログオフ]−[ユーザー切替]−[指定したユーザーのログオン]
という作業をプログラムから操作したいんですけど可能でしょうか?
可能なら使用するAPIを教えて頂けないでしょうか?

628 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:05:12 ]
不可



629 名前:627 mailto:sage [2007/04/09(月) 11:11:17 ]
やっぱりですね
即レスありがとうございました。

630 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:31:48 ]
>>627
Ginaで何とかなるでしょ。Ginaでぐぐってみたら?

631 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:40:23 ]
>>627
レジストリに自動ログオンの設定を書き込んで再起動

632 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 11:58:25 ]
>>626
プロセスにアタッチするのははDLLをデバッグする場合の基本操作なんだが、
そんな当たり前のことを自分で調べられないのか?

633 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 14:27:57 ]
グローバルフック成功してないんじゃね?

634 名前:デフォルトの名無しさん [2007/04/09(月) 15:14:14 ]
Windowsで標準入力や出力がリダイレクトされてるかどうか知る方法を教えてください。

635 名前:デフォルトの名無しさん [2007/04/09(月) 15:56:31 ]
現在VS2005を使っているのですが、作成してるネイティブアプリのVisualStyleを切るにはどの様な方法がよろしいでしょうか?
よろしくお願い致します。

636 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 16:28:21 ]
まにふぇすとぶっこわす

637 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 17:01:54 ]
むしろバージョン5のcomctl32.dllを使うようにマニフェスト書け

638 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 17:27:19 ]
>>626
コードを一から書いたら、グローバルフックでもタイトルバーが変わった。
期待した動作にならなかったら、一から作り直すのも手かと。

つか、サンプルコードのコピペはおすすめできない。



639 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 18:06:07 ]
>>636-637
レスありがとうございます。
というか何か勘違いしてました。。
VS2005では勝手に有効になると思ってましたがならないんですね・・・
この前作ったときはなってたような・・・気のせいか・・・orz

640 名前:デフォルトの名無しさん [2007/04/10(火) 00:34:29 ]
ツリービューのノードのアイコンを一つだけ変える場合って
どうすればええすか?
Expandしたら広がったフォルダを表示とか。


641 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 08:34:36 ]
TVM_SETIMAGELIST で ImageList セット
TVM_SETITEM での fMask に TVIF_IMAGE|TVIF_SELECTEDIMAGE なり TVIF_STATE なり...

642 名前:デフォルトの名無しさん [2007/04/10(火) 12:49:04 ]
USBリムーバブルハードディスクのデバイス識別子?(USB\Vid_04xx&Pid_10xx)とかから
割り当てられている論理ディスクのボリューム名を取得したいのですが
どの辺を参照したらいいでしょうか。
「管理ツール」→「ディスクの管理」で下側ビューの左側「ディスクn」を右クリックしてプロパティを表示させて、
「ボリューム」プロパティーシートの下側リストビューに表示されているものが欲しいです。

643 名前:デフォルトの名無しさん [2007/04/10(火) 16:50:17 ]
SetMenuContextHelpIdに渡す「ヘルプコンテキスト識別子」ってなんなんですか?
「ヘルプコンテキスト」ってリソースで用意するんでしょうか?
それってどのような物で,どうやって作るんでしょうか?


644 名前:デフォルトの名無しさん [2007/04/10(火) 18:08:33 ]
Win32API を使って、DLL 中のダイアログリソースの PUSHBUTTON の文字列を取得することはできますでしょうか?
FindResource -> LoadResource -> LockResource まではできましたが、文字列の取得が分からない。

645 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 18:31:28 ]
自分で解析

646 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 21:03:23 ]
>>643のレスで思ったのだが、そーいや、2005からののヘルプはどうなんお?
昔は、HTML Help Workshopとかゴリゴリ作ったが?

msdn.microsoft.com/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp?frame=true

ここでいいっけ?


それとも、暗黙でツールが入ってるのかな?

647 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 21:10:22 ]
ゲームプログラムで質問ですwin32apiの関数を使うよりdirectxを使った方が画像の描画は早いですか

648 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 21:18:57 ]
>>647
ちなみに、何系ゲーム?



649 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 21:30:43 ]
シューティング系ゲームです。既にwin32apiで作ったのですが画面のスクロール速度を一定以上にあげるとフレームスキップが起こるです。

650 名前:648 mailto:sage [2007/04/10(火) 21:38:04 ]
>>649
画面更新に速度を要求するなら、
DirectXなんじゃね?

DirectX〜系の別スレがよろしいかと・・・

651 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 22:52:12 ]
>>644
MSDN に PEFILE.cpp というサンプルがあって、.exe/.dll の先頭から
.rsrc section を割りだし、section 内のテーブルを追い掛けると、
個々の rsrc leaf に行き付ける例があったと思う。
dialog template の構造は MSDN に説明があった。

ただ、これらを取り出したり、差し替えたりするのに、ファイルとして
開く際、使用中だと開けないことがある。開く際の属性を指定すると
可能なのかも知れないが。

652 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:30:31 ]
>651
いや、メモリに一度読み込めば問題なし。
昔、ダイナミックにダイアログリソース作ったときはそうやったよ。


653 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:36:48 ]
GetCommandLine関数を利用する場合、
みんあはや空白の分割とかどしてる?

思いつき関数作ったけど、意見求む。

654 名前:653 mailto:sage [2007/04/10(火) 23:38:46 ]
前半
DWORD OrderCommandLine(LPTSTR lpBuffer, LPDWORD lpcchBuffer)
{
DWORD i, dwLen, dwPos, dwCnt, dwDiv;
TCHAR tcChr;
TCHAR szCmd[0xFFFF];
TCHAR szDmy[0xFFFF];
int fDQ;
LPTSTR lpszCur;

/* 初期化 */
::lstrcpy(szCmd, ::GetCommandLine());
dwLen = (DWORD)::lstrlen(szCmd);
szCmd[dwLen++] = _T('\0');

/* 捜査 */
for (i = 0, dwPos = dwDiv = 0, fDQ = 0, lpszCur = szCmd; i < dwLen; i++, lpszCur++){
tcChr = *lpszCur;
if (tcChr == _T('\"')){
fDQ = !fDQ;
}else
if ((!fDQ) && (tcChr == _T(' '))){
tcChr = _T('\0');
}

szDmy[dwPos++] = tcChr;
if (tcChr == _T('\0')){
dwDiv++;
}
}
szDmy[dwPos++] = _T('\0');


655 名前:653 mailto:sage [2007/04/10(火) 23:39:39 ]
後半
/* 整理 */
dwCnt = 0;
if (dwDiv > 0){
for (i = 0, dwPos = 0, lpszCur = szDmy; i < dwDiv; i++, lpszCur++){
dwLen = (DWORD)::lstrlen(lpszCur);
if (dwLen > 0){
::lstrcpy(&szCmd[dwPos++], lpszCur);
lpszCur += (dwLen);
dwPos += (dwLen -1);
szCmd[dwPos++] = _T('\0');
dwCnt++;
}
}
szCmd[dwPos++] = _T('\0');
}

/* 結果 */
if (lpcchBuffer){
if (*lpcchBuffer >= dwPos){
*lpcchBuffer = dwPos;
if (lpBuffer){
::CopyMemory(lpBuffer, szCmd, dwPos * sizeof(TCHAR));
}
}
}

return dwCnt;
}


656 名前:653 mailto:sage [2007/04/10(火) 23:42:59 ]
DWORD OrderCommandLine(LPTSTR lpBuffer, LPDWORD lpcchBuffer)の
LPTSTR lpBufferはバッファ
LPDWORD lpcchBufferはlpBufferのサイズ(文字単位)の入った変数のポインタ
んでOrderCommandLineは分割した数を返す。

どっかおかしいとこない?

657 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 23:48:04 ]
自作せずにCommandLineToArgvWを使ったほうが楽なのでは?

658 名前:653 mailto:sage [2007/04/11(水) 00:01:57 ]
>>657
CommandLineToArgvW関数はしりませんですた... orz
調査してみますね。



659 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:07:01 ]
main関数のargc, argvは駄目なの?
main関数から始まるけどコンソールプログラムでないというのは変わっているかもしれないけど。

660 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:13:42 ]
boostにコマンドライン解析があった希ガス

661 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:25:19 ]
>>659
WinMain関数のLPSTR lpszCmdLine問題があったので、
片手間で作成してみました。
そりゃ、_tmain関数みたいなのが、一番いいですが。

>>660
ttp://www.boost.org/ですよね?
ここも見てみます。


662 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:25:41 ]
__argv,__argcとかいうのもあったような

663 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 00:43:11 ]
Googleからも出てる。
ttp://code.google.com/p/google-gflags/

664 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 03:12:11 ]
CommandLineToArgvW以外はスレ違いじゃね?
>>661
_tWinMain
VC++以外や、VC++でもバージョンによっては存在しないみたいだが
その場合はGetCommandLineW
つーかCommandLineToArgvWは_tmainが存在しなかったバージョンのVC++で
GetCommandLineWと組み合わせて使うために提供されていた(だからW版しかない)ので

665 名前:653 mailto:sage [2007/04/11(水) 08:17:09 ]
>>664
情報ありがとうございます。
へー_tWinMain関数ってあるんですかー。

特に変な意識して、関数作る必要もなかったのかな?


一回、整理して考え直してみます。
皆様ありがとうございました

666 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:55:12 ]
>>644
不可視でダイアログ開いて、GetDlgItemText()したら?


667 名前:デフォルトの名無しさん [2007/04/11(水) 11:33:08 ]
CSV(カンマテキスト)を分割するAPIを教えてください

668 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 11:59:02 ]
ない



669 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:55:54 ]
ウィンドウズの起動時間(timeGetTimeやGetTickCountで返される数値)を変更する方法ありますか?

DirectShow辺りが怪しいので
デバッグで24日間放置した状態にしたいのです


670 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 13:05:35 ]
>>669
hookして、好きな値返すとか?

671 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 13:13:31 ]
>>668
ADO等で出来なくもない気もするが

672 名前:デフォルトの名無しさん [2007/04/11(水) 13:45:05 ]
猫でもわかる・・の第10章タイマーで、コーディングして実行したところ、
一応動くのですが、文字列が再描画されず、字が重なったようになって
しまいます。この場合、うまく表示するにはどうしたらよいでしょうか?
よろしくお願いします。

673 名前:デフォルトの名無しさん [2007/04/11(水) 13:56:55 ]
大学院レベルの猫にしかわからないってことだね

674 名前:672 [2007/04/11(水) 13:57:59 ]
↑で質問したものです。
InvalidateRect(hWnd, NULL, FALSE);
こいつを
InvalidateRect(hWnd, NULL, TRUE);にしたらなおった。
でも載ってるのは最初のほうですよね。
なんかほかに方法があるのかなぁ

675 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 14:01:28 ]
つ SetBkMode

676 名前:672 [2007/04/11(水) 14:04:28 ]
>>675
実装済みです

677 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 14:14:29 ]
前と同じ幅の文字で上書きしてないとか

678 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 14:33:38 ]
>>676
TRANSPARENT で描画、リクエストをInvalidateRect(...FALSE) にしてたら
672 のように多重の重ね書きになるわけだが?

まぁ、OPAQUEにしたところで、文字列の実描画長が短くなったら
なんらかの方法で背景色で消すコードを書くはめにはなるがね



679 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 14:34:58 ]
fillrect

680 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 14:41:57 ]
ExtTextoutを結構多用したなあ

681 名前:デフォルトの名無しさん [2007/04/11(水) 16:34:21 ]
質問です。

親のウインドウとは独立した子ウインドウで、親よりは必ず前面に。
ただし他のアプリのウインドウがより前面にある時は(親ともども)きちんとそのウインドウの背面に。

というウインドウをCreateWindowExで簡単に作ることはできないでしょうか。

・子ウインドウは、親ウインドウの中に存在するわけではない(つまりWS_CHILDではない?)
 お絵かきツールのパレットウインドウなんかがこんな感じ。
・WS_EX_TOPMOSTにすると、他のアプリのウィンドウよりも前にきてしまう


682 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 16:45:13 ]
殆ど自分で答え言っているような気がす…
親をオーナーにして (WS_CHILD と排他な)WS_POPUP で作れば良いんじゃない?

683 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 16:46:37 ]
>>681
WS_POPUPとWS_EX_TOOLWINDOWつけてみたらどう?

684 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 16:51:40 ]
>>681
ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/aboutwindows.asp
>A window can own, or be owned by, another window. An owned window always appears in front of its owner window,
>is hidden when its owner window is minimized, and is destroyed when its owner window is destroyed.

685 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 16:56:53 ]
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowfeatures.asp
Owned Windowsのところをよく読め

686 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:00:46 ]
日本語でおk

687 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:12:48 ]
アドバイスありがとうございます。
とりあえずWS_CHILDとWS_POPUPは共存できないようです。

D-Pixedのツールウインドウが同じ実装になっていたのを思い出し、Spy++で覗いてみました。
>>683さんの言うとおりのオプションを使っていましたが、それが原因で望んだ挙動をしているわけではないようです。

とりあえず下記を、親と子両方に入れてやったところ上手く狙った挙動ができているようです。
なので問題ないといえばないのですが、より上手い方法があれば教えていただけると幸いです。

if (WA_INACTIVE != wParam)
{
 ::SetWindowLong(hChildWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW | WS_EX_TOPMOST);
 ::SetWindowPos(hChildWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
else
{
 ::SetWindowLong(hChildWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
 ::SetWindowPos(hChildWnd, hParentWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
 ::SetWindowPos(hParentWnd, hChildWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}


688 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:13:57 ]
他アプリウィンドウ - オーナー - ポップアップ - (最前面) で
他アプリウィンドウをタスクバーのクリックでアクティブにすると、
オーナー - 他アプリウィンドウ - ポップアップ - (最前面)
ってなることがあるんだよなあ。
Alt+Tabだと発生しないけど、なんだかなあと思う。



689 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:25:44 ]
>>687
共存できないとわざわざ書いたのはなぜ?
もしかして>>682を誤解してる?

690 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:29:41 ]
>>687
>より上手い方法があれば教えていただけると幸いです。

そういうウィンドウはOwned Windowと言います。>>685のリンク先を読んでください。

691 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:29:47 ]
…なぜに SetWindowLog & SetWindowPos なんだ?
CreateWindowEx でのスタイル指定で解決できるのに…

ターゲットの窓が他プロセスの持ち物なのか?

692 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:32:35 ]
>>689-691
すいません、682さんを誤読した上に、685さんのレスとレスがすれ違いました。
WS_POPUPとは、親ウインドウを持つウインドウのことだったのですね。

正直、オーバーラップウインドウと、ポップアップウインドウの区別がわからず
今ググっていて682さんの文章に対する誤読に気づきました。
685さんのリンク先を実践してみます

693 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 17:50:25 ]
解決できました。
WS_POPUPの解説である「ポップアップウインドウを作成する」の「ポップアップウインドウをはなんぞや?
という知識が無かったのが問題でした。

ポップアップウインドウそのものが、私の望んでいたもののようです。
WM_ACTIVEなどをまったく使わずWS_POPUPを指定しただけで解決できました。

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

694 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:43:50 ]
DOS窓で、CreateWindowてどうやるの?
メッセージループとか。

695 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:53:29 ]
どうやってやるも何も普通に出来るだろ。
いったい何を言っているんだ?

696 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 01:40:30 ]
>>694
日本語でおk

697 名前:デフォルトの名無しさん [2007/04/12(木) 03:17:19 ]
ソースコードを読んで勉強したいのですが、C言語 + Win32 API で書かれたオープンソースのアプリケーションでお薦めって何かありますか?
実践的なコードの書き方を勉強したいので、お手本になりそうなアプリがあったら教えてください。
また逆に、「このソフトの書き方は真似するな」的なのもあれば教えて頂けると有り難いです。
宜しくお願いします。


698 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:13:51 ]
> お薦めって何かありますか
猫でもわかる

> このソフトの書き方は真似するな
猫でもわかる



699 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:16:14 ]
>>698
禿道と言わざるを得ない

700 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:39:02 ]
あまりにも禿同杉てワラタw

701 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:18:22 ]
ヒントにはなるが真似は出来ない

702 名前:デフォルトの名無しさん [2007/04/12(木) 09:19:39 ]
左右分割ウインドウをMFCを使わずに作っているのですが、相談させてください。

まず、ウインドウ全体を親ウインドウとします。

子ウインドウとして
「左側用にWS_THICKFRAMEを使ったウインドウをちょっと大きめに作って配置」
「右側に余り部分の大きさ分のウインドウ」
を貼り付けて実現しています。
左側用のウインドウの大きさが変化するたびに、右側のウインドウの大きさも変更されるようにしています。

ただ、WS_THICKFRAMEは角の近くだと「マウスドラッグで縦横の大きさを変えられる」モードになってしまいます。
まず「横の大きさしか変えられないウインドウ」は作れないのでしょうか?

それをさせないために今は「上下に大きめに作る」ようにしているのですが(角付近を触れないように)、ウインドウはデスクトップウインドウのサイズより大きくは作れないようです(?)。
そのため親ウインドウをデスクトップ画面並に大きくされてしまうと困ってしまいます。
何か対策はありませんでしょうか?

左右ができれば、上下はその応用で作成可能だと思います。


703 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 09:30:11 ]
>>702
左右の境界に少し隙間を開け、そこをドラッグすると左右に大きさが変わるようにする。
というようにMFCはなってたと思う。

704 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 09:47:03 ]
>>703
なるほど。つまり自前でドラッグシステムを作っているわけですね。
WS_THICKFRAMEを使った方法も、この斜め問題さえ解決すれば実用に耐えるのですが…。

とはいうものの、WM_SIZEを捕まえて上下の大きさが変更されたら強制的に元に戻す処理は入れています。
ただそれは格好悪いもので、もし良い方法があればと思って相談しにきました。

705 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 10:44:16 ]
WM_GETMINMAXINFO捕まえたらどうだろう
MFCしか使ってないんで良く分からないけど

706 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:34:55 ]
>>705
できました!
まったく知らないWMでした。ありがとうございます。

これで
tagMINMAXINFO *p = (tagMINMAXINFO*)lParam;
p->ptMaxTrackSize.y += 128;
としてやることで、デスクトップサイズよりでかいウインドウを作ることに成功。
期待通り動作できるようになりました。

707 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 11:48:53 ]
>>702,706
WM_NCHITTESTを捕まえてDefWindowProc()が
HTTOP,HTBOTTOM,HTTOPLEFT,HTTOPRIGHT,HTBOTTOMLEFT,HTBOTTOMRIGHTのときだけ
もみ消してしまう方がいいのでは?

708 名前:デフォルトの名無しさん [2007/04/12(木) 11:53:52 ]
スクリーンショットを撮るAPIってありますか



709 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:00:33 ]
>>707
ウィンドウの四隅(スプリットバーの端っこ)が使えなくなるんでお薦めできない
それで無効になる領域って結構大きいし

710 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:02:23 ]
>>708
GetDC






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<230KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef