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で流布していたような気がします。
その関係で、無理矢理フックでシステムキー無効化しようとすると不正な処理と判断されてしまうようです
|