質問 1: プロジェクトは PPT ハンドルを見つける必要がありますが、PPT タイトルと完全に一致しても見つからない場合があります。
理由: PPT のタイトルはパワーポイントに応じてバージョンと異なりますが、同時に、PPT 自体のタイトルに内容が追加される場合があります。たとえば、PPT が完成した後、次のように保存されます。バージョン 97-2003. [互換モード] という文字が表示され、完全な一致を行うことが困難になります。
PPT ハンドルを取得するためにファジー マッチングを実行できますか? 答えは「はい」です。
解決策: API: EnumWindows を使用してすべてのフォームを列挙し、タイトルを取得し、ハンドルを取得するために検索する必要がある文字列と照合します。
const int WM_GETTEXT = 0x000D;
const int WM_GETTEXTLENGTH = 0x000E;
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hwnd, int wMsg, int wParam, Byte[] lParam);
/// <summary>
/// あいまい一致コントロールのタイトル
/// </summary>
/// <param name="dimStr">あいまい一致文字列</param>
/// <returns></returns>
public static IntPtr FindWindowExByDimStrIntoWindow(string dimStr)
{ IntPtr iResult = IntPtr.Zero;
string controlTitle = ""; //完全なタイトルを制御します
// サブウィンドウを列挙し、コントロール ハンドルを検索
int i = EnumWindows(
(h, l) =>
{ int cTxtLen; if (IsWindowVisible(h)) { // 列挙された各ウィンドウを処理 cTxtLen = SendMessage(h , WM_GETTEXTLENGTH, 0, 0); //コンテンツの長さを取得 Byte[] byt = new Byte[cTxtLen]; SendMessage((int)h, WM_GETTEXT, cTxtLen + 1, byte); //コンテンツの文字 列を取得 str = Encoding.Default .GetString(byt) ; if (str.ToString().Contains(dimStr)) { iResult = h;
controlTitle = str.ToString();
false を返します。 それ以外の
場合は true を返します。 それ以外の 場合は true を返します。
},
0);
// 検索結果を返す
return iResult;
}
質問 2: 指定されたフォームで、サブウィンドウのテキスト コンテンツを見つけます。
/// <summary>
/// 子フォームを走査し、指定された文字列を含むテキスト ボックスの完全な内容を検索します
/// </summary>
/// <param name="hwnd">親フォーム ハンドル</ param >
/// <param name="dimStr">あいまい一致文字列</param>
/// <returns></returns>
public static string FindWindowExByDimStrIntoChildWindow2(IntPtr hwnd, string dimStr)
{ Log.WriteLog("関数を入力: FindWindowExByDimStrIntoChildWindow\n"); IntPtr iResult = IntPtr.Zero;
string controlTitle = ""; //完全なタイトルを制御します
// サブウィンドウを列挙し、コントロール ハンドルを検索
int i = EnumChildWindows(
hwnd,
(h, l) =>
{ int TextLen; TextLen = SendMessage(h, WM_GETTEXTLENGTH, 0, 0); // コンテンツの長さを取得 Byte[] byt = new Byte[TextLen]; SendMessage((int)h, WM_GETTEXT, TextLen + 1, byt); // コンテンツ 文字列を取得 str = Encoding.Default.GetString(byt); // Log.WriteLog(string.Format( "コントロールの内容を編集します {0}\n", str)); if (str.ToString().Contains(dimStr)) { iResult = h; controlTitle = str.ToString();
Log.WriteLog(string.Format("あいまい一致 {0} で見つかったパス\n", controlTitle));
return false;
}
else
return true;
},
0);
// 検索結果を返す
return controlTitle;
}
コントロールのタイプが編集であることがわかっている場合は、次の機能を使用できます。
/// <summary>
/// あいまい一致コントロール タイトル
/// </summary>
/// <param name="hwnd">親フォーム ハンドル</param>
/// <param name="dimStr"> あいまい一致する文字列</param>
/// <returns></returns>
public static string FindWindowExByDimStrIntoChildWindow(IntPtr hwnd, string dimStr)
{ Log.WriteLog("関数を入力: FindWindowExByDimStrIntoChildWindow \n"); IntPtr iResult = IntPtr.Zero ;
string controlTitle = ""; //完全なタイトルを制御します
// 子ウィンドウを列挙し、コントロール ハンドルを検索
int i = EnumChildWindows(
hwnd,
(h, l) =>
{
IntPtr HwndStatue = FindWindowEx(h, 0, "Edit", null); //テキスト ボックス ハンドル
StringBuilder title1 = new StringBuilder(200);
int len1;
len1 = GetWindowText(h, title1, 200);
if (HwndStatue != IntPtr.Zero)
{ int TextLen; TextLen = SendMessage(HwndStatue, WM_GETTEXTLENGTH, 0, 0); //コンテンツの長さを取得 Byte[] byt = new Byte[TextLen]; SendMessage((int)HwndStatue, WM_GETTEXT , TextLen + 1, byt); // コンテンツ 文字列を取得します str = Encoding.Default.GetString(byt); // Log.WriteLog(string.Format("コントロール コンテンツ {0}\n", str)); if (str.ToString().Contains(dimStr)) { iResult = h; controlTitle = str.ToString();
Log.WriteLog(string.Format("あいまい一致 {0}\n", controlTitle));
return false;
}
else
return true;
}
else
return true;
},
0);
// 検索結果を返す
return controlTitle;
}