2017-01-17 8 views
1

Ich bin eine externe Anwendung von meinem WPF-Projekt Tagrunnig und ich setze externen app in meiner WPF-Form mit mit „user32.dll“ausblenden oder entfernen Taste aus externer Anwendung

Externen App haben eine Exit-Taste. Ich möchte diesen Knopf entfernen oder ausblenden. Kann ich das tun "using user32.dll" oder andere Vorgehensweise?

Vielen Dank im Voraus.

+0

Haben Sie Zugriff auf diese * externe * App? – OmegaMan

+0

@OmegaMan Ja, das ist externe EXE-Datei. Ich möchte auf diesen Knopf zugreifen. – Kerberos

+0

Ist diese Exit-Schaltfläche ein Teil des Standardframes oder eine zufällige Schaltfläche auf dem Bildschirm? – OmegaMan

Antwort

0

„user32.dll mit“

Nein, Sie können nicht für jede App ist verwenden user32.dll in ihrer eigenen Sandbox sozusagen und sollte außerhalb unerwünschte Aktionen undurchlässig sein.

(F: Haben Sie Zugriff auf diese externe App erstellen? A: Y) ... oder anderen Ansatz?

Da Sie Zugriff auf den Code beider Apps haben, implementieren Sie einen Interprozess namens Pipe. In der empfangenden App überwachen Sie die Pipe auf eine Nachricht, um die Schaltfläche (n) zu deaktivieren oder den Fensterrahmenstil zu ändern.

Siehe

How to: Use Named Pipes for Network Interprocess Communication

0

Der Code unten auf den Button findet und versteckt es. Es funktioniert anmutig auf meinem System. Der Code sucht nach dem Fenstertitel und findet dann das Steuerelement. Sie müssen den Fenstertitel und den Schaltflächentext angeben. Sie können den Code nach Ihren Bedürfnissen aktualisieren.

Hinweis: Unter dem Code werden alle Steuerelemente mit dem übereinstimmenden Text, der in der Konstante TEXT_BUTTON angegeben ist, ausgeblendet.

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; 
} 
Verwandte Themen