HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0501
メッセシステムメニュー追加での質問です。8未解決


メッセ

リンク

2014/5/1(Thu) 10:18:39|NO.61796

#uselib "user32.dll"
#cfunc FindWindow "FindWindowA" sptr, sptr #cfunc FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #func InsertMenu "InsertMenuA" sptr,sptr,sptr,sptr,sptr #func GetSystemMenu "GetSystemMenu" int,int #cfunc IsWindowVisible "IsWindowVisible" int ; 項目ID #enum IDM_ADD1 = 1 #enum IDM_ADD2 ; WM_SYSCOMMAND (システムメニューが選択された時) oncmd gosub *syscommand, $112 ; システムメニューのハンドルを取得 hSystemMenu=FindWindow(0,"test") ; 第2パラメータに挿入位置(一番上が0)、第4パラがメニュー項目ID、 ; 第5パラにメニュー項目に表示する文字列 InsertMenu hSystemMenu, 0, $400, IDM_ADD1, "追加したー(&M)" ; +$800 で区切り線 InsertMenu hSystemMenu, 1, $400 | $800, 0, "" InsertMenu hSystemMenu, 5, $400, IDM_ADD2, "も一つ追加(&O)" stop *syscommand ; wparamにメニュー項目IDが返る if wparam = IDM_ADD1 { dialog "追加したものだー" return } if wparam = IDM_ADD2 { dialog "も一つ追加したものでアール" return } return

testというexe内でそのシステムメニューを追加いたいのですが
メニュー内で追加されません。
どこか間違っていますか?



この記事に返信する


mamo

リンク

2014/5/1(Thu) 12:10:57|NO.61797

→システムメニューのハンドルを取得
test.exeのハンドルじゃなく、タイトルバーを右クリックしたときに出るシステムメニューのハンドルが必要。

参考にした記事を見直してみて。



メッセ

リンク

2014/5/1(Thu) 12:40:12|NO.61798

じゃあもしtxtのシステムメニューを追加したいとすれば、
txtの白紙の部分を右クリックしたときのハンドルを取得すれば
できるということですか?



リンク

2014/5/1(Thu) 20:44:37|NO.61807

findwindow を

HMENU GetSystemMenu(
HWND hWnd, // ウィンドウのハンドル
BOOL bRevert // 元へ戻すかどうか
);

関数に置き換えてください。
これで大丈夫なはずです



メッセ

リンク

2014/5/2(Fri) 19:03:51|NO.61815

#uselib "user32.dll"
#cfunc FindWindow "FindWindowA" sptr, sptr #cfunc FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #func InsertMenu "InsertMenuA" sptr,sptr,sptr,sptr,sptr #func GetSystemMenu "GetSystemMenu" int,int #cfunc IsWindowVisible "IsWindowVisible" int ; 項目ID #enum IDM_ADD1 = 1 #enum IDM_ADD2 ; WM_SYSCOMMAND (システムメニューが選択された時) oncmd gosub *syscommand, $112 ; システムメニューのハンドルを取得 GetSystemMenu hWnd,0 hSystemMenu = stat ; 第2パラメータに挿入位置(一番上が0)、第4パラがメニュー項目ID、 ; 第5パラにメニュー項目に表示する文字列 InsertMenu hSystemMenu, 0, $400, IDM_ADD1, "追加したー(&M)" ; +$800 で区切り線 InsertMenu hSystemMenu, 1, $400 | $800, 0, "" InsertMenu hSystemMenu, 5, $400, IDM_ADD2, "も一つ追加(&O)" stop *syscommand ; wparamにメニュー項目IDが返る if wparam = IDM_ADD1 { dialog "追加したものだー" return } if wparam = IDM_ADD2 { dialog "も一つ追加したものでアール" return } return
一応これでやってみたのですが
このexe内のメニューバーを右クリックすると
追加はされているのですが
ほかのところでの右クリックは追加されません・・

ほかの所では無理なんでしょうか?



mamo

リンク

2014/5/3(Sat) 13:14:06|NO.61818




暇人

リンク

2014/5/3(Sat) 14:30:35|NO.61819

実行されてるウィンドウ名からウィンドウハンドル取得はNO.61796で使ってるのに・・・

; システムメニューのハンドルを取得 GetSystemMenu FindWindow(0,"test"),0 hSystemMenu = stat
ただ、これで項目追加は出来ても
その項目を選ばれたかを受信するのは
このままじゃ無理だと思う


>他のプロセスのメッセージフックについて。
http://hsp.tv/play/pforum.php?mode=all&num=59118



掘木

リンク

2014/5/3(Sat) 15:42:35|NO.61820

No.61796に対する返答としては、
作成中のアプリケーション≠test.exe で、test.exeのシステムメニューを改造したい と解釈します。

・ FindWindow で test.exeのウィンドウハンドルを取得する
 こちらは問題ないです。ですがその結果の値はメニューハンドル(HMENU)ではないため、
 この返り値をhSystemMenuに入れるのは(変数名的に)不適当では? 返り値はHWND型です。

・ GetSystemMenu で test.exeのシステムメニューハンドルを取得する
 こちらの動作が更に必要です。引数として先ほどFindWindowで得られたHWND型の値を渡せばいいかと思います。

この2点を守ればシステムメニューの追加はできると思われます。
(実際メモ帳のシステムメニューの改造ができたんで多分いける。

余談:

・FindWindowやInsertMenuが成功しているかどうか返り値を確認した方がいいのでは?

提示されているコードでは多分InsertMenuから失敗を示す返り値が来てるのでは・・・。


・追加したメニュー項目のメッセージを受け取れるのは、そのメニューを保有する親ウィンドウである。

具体化すると、WM_SYSCOMMANDを受け取れるのはtest.exeであって、作成中のアプリケーションではないのです。
よって、oncmdは動作せず、追加したメニューを選んでもなにも起こりません。何かしらの対策が必要です。



掘木

リンク

2014/5/3(Sat) 15:47:34|NO.61821

返答中に暇人さんの書き込みが・・・。しかも内容がもろ被りorz



ONION software Copyright 1997-2023(c) All rights reserved.