隐藏或删除外部应用程序中的按钮

时间:2017-01-17 23:32:13

标签: c# wpf user32

我从我的WPF项目运行一个外部应用程序,我使用“user32.dll”将外部应用程序放在我的WPF表单中

外部应用程序有一个退出按钮。我想删除或隐藏该按钮。我可以“使用user32.dll”或不同的方法吗?

提前谢谢。

2 个答案:

答案 0 :(得分:0)

  

“使用user32.dll”

不,你不能使用user32.dll,因为每个应用程序都在他们自己的沙盒中,所以可以说是不受外部不必要的操作。

  

(问:你有权建立这个外部应用程序吗?答:是)......还是不同的方法?

由于您可以访问这两个应用程序的代码,因此请让它们实现进程间命名管道。在接收应用程序中,它监视管道以显示关闭按钮或更改其窗口框架样式的消息。

How to: Use Named Pipes for Network Interprocess Communication

答案 1 :(得分:0)

以下代码找到按钮并隐藏它。它在我的系统上优雅地工作。代码搜索窗口标题,然后找到控件。您必须提供窗口标题和按钮文本。您可以根据需要更新代码。

注意:下面的代码将使用常量TEXT_BUTTON中指定的匹配文本隐藏所有控件。

const string TEXT_TITLE = "My Specific Window";
const string TEXT_BUTTON = "&HideMeButton";

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
const int SW_HIDE = 0;

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

[DllImport("user32.dll", EntryPoint = "GetWindowText", CharSet = CharSet.Auto)]
static extern IntPtr GetWindowCaption(IntPtr hwnd, StringBuilder lpString, int maxCount);  

public void HideSpecificButton()
{            
    //Contains the handle, can be zero if title not found
    var handleWindow = WinGetHandle(TEXT_TITLE);
    if (GetWindowCaption(handleWindow).Trim() != TEXT_TITLE)
        MessageBox.Show("Window is hidden or not running.");
    else
        GetChildWindows(handleWindow);            
}

public IntPtr WinGetHandle(string title)
{
    IntPtr hWnd = IntPtr.Zero;
    foreach (Process pList in Process.GetProcesses())
    {
        if (pList.MainWindowTitle.Contains(title))
        {
            hWnd = pList.MainWindowHandle;
        }
    }
    return hWnd; 
}

private string GetWindowCaption(IntPtr hwnd)
{
    StringBuilder sb = new StringBuilder(256);
    GetWindowCaption(hwnd, sb, 256);
    return sb.ToString();
}

public void GetChildWindows(IntPtr parent)
{
    List<IntPtr> result = new List<IntPtr>();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumControls);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
}

private bool EnumControls(IntPtr handle, IntPtr pointer)
{
    var controlTitle = GetWindowCaption(handle).Trim();
    if (string.Equals(controlTitle, TEXT_BUTTON, StringComparison.CurrentCultureIgnoreCase))
    {
        //hide the control
        ShowWindow(handle, SW_HIDE);
    }

    return true;
}