(敵対者が、このようなダイアログを模倣することができます)、私は窓場合標準のダイアログをチェックすることをお勧めし、それがあれば、それはキャプションに「保存」を持っていません(あなたはここにもより良いctriteriumを置くことができる):
まず、のはclass
をチェックしてみましょう:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx
using System.Runtime.InteropServices;
...
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int GetClassName(IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount);
private static String WndClassName(IntPtr handle) {
int length = 1024;
StringBuilder sb = new StringBuilder(length);
GetClassName(handle, sb, length);
return sb.ToString();
}
public static bool IsDialogClassName(IntPtr handle) {
// Standard windows dialogs like OpenFileDialog, SaveFileDialog have #32770 class name
return "#32770".Equals(WndClassName(handle));
}
はしかし、それはあまりにも広いクリテリウムだ:Save File Dialog
とOpen File Dialog
の両方がそれを渡します。ウィンドウのキャプションを確認してみましょう:
最後に
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetWindowText(IntPtr hWnd,
StringBuilder text,
int length);
private static String WindowText(IntPtr handle) {
int length = GetWindowTextLength(handle);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(handle, sb, length + 1);
return sb.ToString();
}
public static bool IsSaveCaption(IntPtr handle) {
//TODO: put a better check for dialog's caption here
return WindowText(handle).IndexOf("Save", StringComparison.OrdinalIgnoreCase) >= 0;
}
:あなたには、いくつかの他の基準を望むかもしれないが、私は、これら2つは、どのオペレーティング・システムは、このようなあなたの仕事をするだろう
十分なことを願っています
は確か? –
クラス名 'GetClassName'をチェックしてコントロールなどを列挙できますが、完全にはわかりません。敵が同じクラス名、コントロール、幅、高さなどのウィンドウを作成している可能性があります。 –
こんにちは@DavidHeffernan、Just Windows、XP、7,8,10、そして一般的なサーバーバージョン。 –