4

C# を使用して OTHER ウィンドウを閉じる機能を削除できるかどうか疑問に思っていましたか?

Windows の close() メソッドをオーバーライドできることは知っていますが、それは他のプロセスでも可能ですか? また、別のプロセスのウィンドウ スタイルを fixed___ に変更して、サイズを変更できないようにするにはどうすればよいでしょうか?

ここまでで、アプリケーションのメイン ウィンドウ ハンドルを取得し、すべてのボタンとメニューを削除しました。

これが私が持っているものです:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ThirdTest
{
    class Program
    {
        #region Constants
        //Finds a window by class name
        [DllImport("USER32.DLL")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        //Sets a window to be a child window of another window
        [DllImport("USER32.DLL")]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        //Sets window attributes
        [DllImport("USER32.DLL")]
        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

        //Gets window attributes
        [DllImport("USER32.DLL")]
        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("user32.dll")]
        static extern IntPtr GetMenu(IntPtr hWnd);

        [DllImport("user32.dll")]
        static extern int GetMenuItemCount(IntPtr hMenu);

        [DllImport("user32.dll")]
        static extern bool DrawMenuBar(IntPtr hWnd);

        [DllImport("user32.dll")]
        static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

        //assorted constants needed
        public static uint MF_BYPOSITION = 0x400;
        public static uint MF_REMOVE = 0x1000;
        public static int GWL_STYLE = -16;
        public static int WS_CHILD = 0x40000000; //child window
        public static int WS_BORDER = 0x00800000; //window with border
        public static int WS_DLGFRAME = 0x00400000; //window with double border but no title
        public static int WS_CAPTION = WS_BORDER | WS_DLGFRAME; //window with a title bar 
        public static int WS_SYSMENU = 0x00080000; //window menu
        #endregion

        public static void WindowsReStyle()
        {
            Process[] Procs = Process.GetProcesses();
            foreach (Process proc in Procs)
            {
                Console.WriteLine("Found process: " + proc.ProcessName.ToString());
                if (proc.ProcessName.StartsWith("notepad"))
                {
                    IntPtr pFoundWindow = proc.MainWindowHandle;
                    int style = GetWindowLong(pFoundWindow, GWL_STYLE);

                    //get menu
                    IntPtr HMENU = GetMenu(proc.MainWindowHandle);
                    //get item count
                    int count = GetMenuItemCount(HMENU);
                    //loop & remove
                    for (int i = 0; i < count; i++)
                        RemoveMenu(HMENU, 0, (MF_BYPOSITION | MF_REMOVE));

                    //force a redraw
                    DrawMenuBar(proc.MainWindowHandle);
                    SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_SYSMENU));
                    SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_CAPTION));

                }
            }
        }  

        static void Main(string[] args)
        {
            WindowsReStyle();
        }
    }
}

何か案は?(:

コメントに記載したとおり、この問題の詳細を以下に示します。

モニターに 2 つのアプリケーションを並べて表示する必要があります。それらのどれも、閉じることもサイズを変更することもできません。1つはブラウザ、もう1つは「Z-tree」というアプリです。デフォルトでは、閉じるボタンもサイズ変更もなしで実行され、コマンドラインでサイズと位置を指定できるため、Zツリーの問題は既に修正しています。

4

2 に答える 2

2

別のアイデアとして、winforms プロジェクトを作成し、ウィンドウをサイズ変更できないように設定します。次に、単一の WebBrowser コントロールをフォームに埋め込み、フォーム ロードでページに移動します。

private void Form1_Load(object sender, EventArgs e)
{
     //catch form closing event to prevent form being closed using alt-f4
     FormClosing += Form1_FormClosing;

     //remove close button from toolbar and remove window border to prevent
     //moving and resizing
     this.ControlBox = false;
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

     //set position to half of the screen
     this.Left = Screen.PrimaryScreen.Bounds.Width / 2;
     this.Top = 0;
     this.Width = Screen.PrimaryScreen.Bounds.Width / 2;
     this.Height = Screen.PrimaryScreen.Bounds.Height;

     //mark the window as a top level window, reducing users ability to alt-tab away
     TopMost = true;

     webBrowser1.Navigate("www.google.com");
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
     //prevent form being closed
     e.Cancel = true;
}

//the only way to close the form
void DoExit()
{    
     //remove the closing handler first or it won't close
     FormClosing -= Form1_FormClosing;
     Close();
}
于 2013-10-04T10:19:29.513 に答える
0

次のように起動すると、Internet Explorer を強制的に「終了できない」フルスクリーン モードにすることができます。

iexplore -k www.google.com

これは、店やものが運営される方法であり、誰も閉鎖することはできません. もちろん、タスク マネージャーを使用して閉じることができますが、ほとんどのユーザーが閉じるのが難しくなります。

(CTRL-W で閉じます <--- 秘密鍵!) http://support.microsoft.com/kb/154780

于 2013-10-03T17:03:13.107 に答える