トップページ > 過去ログ > 記事閲覧
ウィンドウモードでF10を押してもメニューが出ないようにする
名前:koga2020 日時: 2008/09/07 11:33

環境について Windows XP SP2 VisualC++ 2008 Express Edition VisualC++用DXライブラリ(Ver2.24e --IME拡張版--) ウィンドウモードのときに、F10を押すと以下のメニューが出ます。(windows標準の)   元のサイズに戻す(R)   閉じる(C)  ALT+F4 F10の他、ALT+F4で終了するのを止めたいのですが、どのようにしたらよいでしょうか。 windows標準のウィンドウ機能(F10やALT+F4など)をフックして止めるにはどのような方法がありますでしょうか。 よろしくお願いいたします。

Page: 1 |

Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.1 )
名前:管理人 日時:2008/09/07 23:39

そちらの動作は今までもキー入力をフックするなどして止めようと 試したことがあるのですが、最近ではファイアウォールソフトに 「不正な処理」と判断されて遮られたりして、現在では 「WindowsOS の規則に反することはしない方が良い」と半ば諦めています。 安全な方法があれば実装したいのですが・・・
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.2 )
名前:koga2020 日時:2008/09/08 22:33

なかなか難しいようですね。 Visual C++ 2008 のエディタ自体が、F10をコンパイル実行に当てていたり、ALT+F4で「保存しますか?」が出てきたりと、 知っていれば簡単な設定がどこかに隠れているんでしょうね。 Microsoft系は無意味に奥が深い・・・
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.3 )
名前:優柔不断 日時:2008/09/08 23:37

ファイアウォールがどこで働くかにもよるのですが、実行そのものをとめられてるとしたら、試してませんが、次の手が使えるかもしれません。 フック関数をdllで実装し、exeにdllを暗号化したものをリソースとして含めます。 その上で初期化の段階で、そのdllをリソースから取り出し、解凍してファイルとして出力します。 後はdllの動的呼び出しAPIを使って関数を取り出します。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.4 )
名前:koga2020 日時:2008/09/10 13:13

Formを使用する作り方のものは、以下のようにWndProcでいけるようです。 WndProcをオーバーライドして、その関数で「何もなかったよ」と返すようにすることで、ALT+F4を無効にできるようです。 ネタ元: h ttp://smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips019.html MSDN:WndProc h ttp://smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips019.html DXライブラリでいける方法がわかれば、また報告したいと思います。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.5 )
名前:Will 日時:2008/09/10 13:28

extern int SetHookWinProc( WNDPROC WinProc ) ; // メッセージをフックするウインドウプロージャを登録する 自作プロシージャをDXライブラリに実行させる場合はこの関数で登録できます。 Init実行よりも前に行わなければいけなかったと思います。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.6 )
名前:koga2020 日時:2008/09/10 18:19

ありがとうございます。 教えて頂いた SetHookWinProc で ALT+F4 を無事、止めることができました。 また、Init文より後に記述しても正常に動作しているようです。 SetHookWinProcで検索したところ、過去ログ 2007/12/06:×ボタンを押したときのイベント に詳細がありました。 // ウインドウの閉じるボタンが押されたかどうかを取得する int GetWindowUserCloseFlag( int StateResetFlag ); これを併せて使用することで、DXライブラリーでALT+F4押下時の制御をすることができました。 あと F10 も止めれるとうれしいです・・・
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.7 )
名前:koga2020 日時:2008/09/10 18:43

重くなってしまいますが、方法がありました。 GetMessageでいけました。 ただ、かなり全体の動きが重くなるので、他の方法を考えています。 【F10でウィンドウメニューが開くのをを止める方法】 F10は以下のように記述することで、自作プログラム中で取得し、ウィンドウのメニューが出なくなります。 また、F10の押下状態の取得を CheckHitKeyAll() で行うのも大丈夫でした。 MSG msg; //メッセージ用の構造体を宣言 以下はループ中に記述 GetMessage(&msg, NULL, 0, 0); if( msg.message == WM_SYSKEYDOWN && msg.wParam == VK_F10 ) {//何もしない }
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.8 )
名前: 日時:2008/09/10 19:28

>GetMessage(&msg, NULL, 0, 0); これをやるとメッセージQueからメッセージが 削除されてしまうので、DXライブラリ側の メッセージ処理が正常に動作しなくなる可能性が 有ります。 まずは、PeekMessageでPM_NOREMOVEを指定し メッセージが該当の物だった場合にGetMessageで メッセージをQueから取り出すようにしたほうが 良いと思います。 if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if( msg.message == WM_SYSKEYDOWN && msg.wParam == VK_F10 ) { GetMessage (&msg,NULL,0,0); } }
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.9 )
名前:koga2020 日時:2008/09/11 17:54

ご指摘ありがとうございます。 GetMessageではDXライブラリ側のメッセージ処理に影響を及ぼしてしまう可能性があるのですね。 PeekMessageですと、取得漏れが常態化してしまうようでした。 F10押下でウィンドウメニューが出てしまいます。 F10対策は非常に難しそうです。 また、GetMessageが非常に重いので、メインループ10回に1度呼ぶ、という風にしてみたのですが、 それも取得漏れを起こしたり・起こさなかったりといった状態でした。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.10 )
名前: 日時:2008/09/11 18:52

>PeekMessageですと、 >取得漏れが常態化してしまうようでした PeekMessageとGetMessageにくるメッセージに差異は ありません。 PM_NOREMOVEを指定してPeekMessageをした後、 きちんとGetMessageかPeekMessageにPM_REMOVEを 指定などしてメッセージを取り出していますか? >GetMessageが非常に重いので、 >メインループ10回に1度呼ぶ 10回中1回でもF10を逃せばスルーされるのですから 取得漏れを起こすのは当然でしょう。 GetMessageが重いのではなく、 ProcessMeesageなどでメッセージの処理が 遅れる為にWindowの反応が悪くなっている という可能性もあります。 差し支えなければ、一度ループ処理の 分部のコードを載せて見てはどうでしょう?
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.11 )
名前:koga2020 日時:2008/09/11 22:03

ご提示頂いたソースを、while文直下にコピペさせて頂いたのですが、F10を取得できていないようでした。 <pre> while(!ProcessMessage() && !ClearDrawScreen()) { if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if( msg.message == WM_SYSKEYDOWN && msg.wParam == VK_F10 ) { GetMessage (&msg,NULL,0,0); } } if( GetWindowUserCloseFlag( true ) == true ) //ALT+F4押下、Xボタン押下時の動作 {//何もしない fead_moji_altf4_count = 100; } ImeData = GetIMEInputData() ; ・・・以下、キー入力処理・画面表示処理が続く・・・ 以下の入力関数を使用しています。 GetKeyInputString GetHitKeyStateAll </pre> 以上
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.12 )
名前: 日時:2008/09/12 12:57

ProcessMessageが先に処理されている為かとも 思いましたが、こちらでやった限りでは、 連続で押されるか、押しっぱなしにすると やはり無効化できていないようでした。 上記で出来ないとなると、 プロシージャをフックした方が、 確実かもしれません。。。 #他のメッセージ処理の前に #フックプロシージャが動けばですが。。。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.13 )
名前:koga2020 日時:2008/09/12 14:52

フックは難しそうだなと思いながら、DXライブライのリファレンスを眺めていたところ、 以下の関数に目が行きました。 宣言  int SetSysCommandOffFlag( int Flag ) ; 概略  ALTキーや Windowsキーを無効にするかどうかを設定する この関数を以下のように   SetSysCommandOffFlag( true ); 試したところ、F10を押してもウィンドウメニューが出なくなりました! また、この状態でCheckHitKeyAll()関数による F10 やALT+F4の押下チェックも正常に動作しております。 F10には言及せず、ALTキー及びwindowsキーとの説明なので 副作用的にも感じましたが、目的を達成できたのではと思いました。 おそらくF10が   【作業中のウィンドウのシステム メニューを開く】   【 Alt + Space 】 という Alt系のショートカット機能と重複するのに由来するのでは?と思います。 また、ウィンドウ機能ではない ALT+TAB(タスク切り替え) や CTRL+ESC(スタートメニューを開く)は無効にならずに、有効のままでした。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.14 )
名前: 日時:2008/09/12 22:37

なるほど、その手がありましたか。 FUNCTION KEYに聞くとは思ってなかった。 > ALT+TAB(タスク切り替え) や > CTRL+ESC(スタートメニューを開く)は > 無効にならずに SYSTEMのGLOBALな部分なので、 1つのアプリケーションにより禁止をするのは 良くないということだと思います。 これは恐らくMSがこれらを無効にすべきではないと たしかMSDNで流布していたような気がします。
Re: ウィンドウモードでF10を押してもメニューが出ないようにする ( No.15 )
名前:管理人 日時:2008/09/15 21:26

残念ですが「以前試みてファイヤーウォールに引っかかって諦めた」とは 正に SetSysCommandOffFlag のことです こちらの機能、ウイルスバスターやノートンアンチウイルス等のファイアーウォール機能が 有効になっていると「不正な処理」として SetSysCommandOffFlag で使用している キーボードフックが無効にされてしまいます > これは恐らくMSがこれらを無効にすべきではないと > たしかMSDNで流布していたような気がします。 その関係で、無理矢理フックでシステムキー無効化しようとすると不正な処理と判断されてしまうようです

Page: 1 |