2017-01-17 12 views
1

からボタンを削除。私はそのボタンを削除したり隠したりしたいと思います。私は "user32.dllを使用して"または別のアプローチを行うことはできますか?隠すか、私は私のWPFプロジェクトから外部アプリケーションをrunnigていると私は</p> <p>外部アプリが終了ボタンを持っている「user32.dllの」を使用して、私のWPFフォーム内の外部アプリを入れていた外部アプリケーション

ありがとうございます。

「user32.dllのを使用して」
+0

この* external *アプリを作成するアクセス権がありますか? – OmegaMan

+0

@OmegaManはい、外部のexeファイルです。私はそのボタンにアクセスしたいと思います。 – Kerberos

+0

この終了ボタンは標準フレームの一部ですか、または画面のランダムボタンですか? – OmegaMan

答えて

0

あなたはアプリごとuser32.dllのを使用することはできませんんが、いわば、自分のサンドボックスにありませんし、外の不要なアクションを通さなければなりません。

(Q:この外部アプリを作成するアクセス権はありますか?A:Y)...または別の方法ですか?

両方のアプリケーションのコードにアクセスできるため、プロセス間名前付きパイプを実装するようにしてください。受信側のアプリケーションでは、ボタンをオフにしたり、ウィンドウのフレームスタイルを変更したりするメッセージをパイプで監視しています。

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; 
} 
関連する問題