2017-01-17 5 views
1

Я запущенный внешнее приложение из моего WPF проекта, и я ставлю внешнее приложение в моей форме WPF с помощью «user32.dll»Скрыть или кнопку удалить из внешнего приложения

Внешнего приложения имеет кнопку выхода. Я хотел бы удалить или скрыть эту кнопку. Могу ли я сделать это с помощью user32.dll или с другим подходом?

Заранее спасибо.

+0

У вас есть доступ к созданию этого * внешнего * приложения? – OmegaMan

+0

@OmegaMan Да, это внешний файл exe. Я хотел бы получить доступ к этой кнопке. – Kerberos

+0

Эта кнопка выхода является частью стандартного кадра или случайной кнопки на экране? – OmegaMan

ответ

0

«не используя user32.dll»

Нет, вы не можете использовать user32.dll для каждого приложения в своей собственной песочнице, так сказать, и должна быть непроницаемой для внешних нежелательных действий.

(Q: У вас есть доступ к этому внешнему приложению? A: Y) ... или к другому подходу?

Поскольку у вас есть доступ к коду обоих приложений, попросите их реализовать interprocess named pipe. В приемном приложении он отслеживает канал для сообщения, чтобы отключить кнопку (-ы) или изменить стиль окна.

См

How to: Use Named Pipes for Network Interprocess Communication

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; 
} 
Смежные вопросы