64,662
社区成员
发帖
与我相关
我的任务
分享
private static int _yesCode = 0;
[DllImport("user32.dll")]
public static extern bool EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack lpfn, int lParam);
private static bool TestForMessageBox()
{
try
{
var k = MyFindWindow();
return true;
}
catch (Exception)
{
return false;
throw;
}
}
private static System.IntPtr MyFindWindow()
{
const int myMaxParentWinCount = 2;
// 父窗口类名数组
string[] aSzClassName = { "#32770", "Button" };
// 父窗口标题数组
string[] aSzWinName = { "询问", "是(&Y)" };
// 首先求得顶级父窗口
System.IntPtr hLastWin = Win32.FindWindow(aSzClassName[0], aSzWinName[0]);
var parent = hLastWin;
// 逐次用FindWindowEx函数求出各级子窗口
for (int i = 1; i < myMaxParentWinCount; i++)
{
hLastWin = Win32.FindWindowEx(hLastWin, IntPtr.Zero, aSzClassName[i], aSzWinName[i]);
}
if (hLastWin != IntPtr.Zero)
EnumChildWindows(parent.ToInt32(), CallBackEnumChildWindows, 0);
return hLastWin;
}
//然后必须针对每个API函数定义代理的实例函数:
/// <summary>
/// 进程回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool ThreadWindowProcess(int hwnd, int lParam)
{
EnumChildWindows(hwnd, CallBackEnumChildWindows, 0);
return true;
}
/// <summary>
/// 窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool WindowProcess(int hwnd, int lParam)
{
EnumChildWindows(hwnd, CallBackEnumChildWindows, 0);
return true;
}
/// <summary>
/// 子窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public static bool ChildWindowProcess(int hWnd, int lParam)
{
var title = new StringBuilder(200);
Win32.GetWindowText(hWnd, title, 200);
var t = title.ToString().Trim();
var isMatch1 = System.Text.RegularExpressions.Regex.IsMatch(t, @"货品\[(?<val>.*?)\]的单价小于成本价!单据是否保存?");
var isMatch2 = System.Text.RegularExpressions.Regex.IsMatch(t, @"货品\[(?<val>.*?)\]的单价小于最低销售价\((?<val2>.*?)\),是否继续?");
//if (t != null)
//{
// MessageBox.Show(t);
//}
if (t == "是(&Y)")
{
_yesCode = hWnd;
}
if (isMatch1 || isMatch2)
{
var k = new IntPtr(_yesCode);
Win32.EnableWindow(k, false);
}
return true;
}
//最后要定义回调代理的实例
/// <summary>
/// 进程窗口回调函数代理
/// </summary>
public static CallBack CallBackEnumThreadWindows = new CallBack(ThreadWindowProcess);
/// <summary>
/// 窗口回调函数代理
/// </summary>
public static CallBack CallBackEnumWindows = new CallBack(WindowProcess);
/// <summary>
/// 子窗口回调函数代理
/// </summary>
public static CallBack CallBackEnumChildWindows = new CallBack(ChildWindowProcess);
//使用的例子:
/// <summary>
/// 客户端是否弹出对话框
/// </summary>
/// <returns></returns>
public bool IsClientPopupWindows()
{
bool FindError = false;
EnumWindows(CallBackEnumWindows, 0);
return FindError;
}
#include <Windows.h>
#include <string>
#include <stdio.h>
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
char t[200];
GetWindowText(hwnd, t, 200);
OutputDebugString(t);
OutputDebugString("\n");
if (!strcmp(t, "是(&Y)"))
{
MessageBox(hwnd, NULL, NULL, NULL);
OutputDebugString("EnableWindow\n");
EnableWindow(hwnd, false);
return false;
}
return true;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char title[200];
GetWindowText(hwnd, title, 200);
OutputDebugString(title);
OutputDebugString("\n");
const char *pattern="minimum";
//const char *patter="小于最低销售价";
char *isMatch1= strstr(title, pattern);
//char *isMatch2= strstr(title, patter);
if (isMatch1!=NULL)// || isMatch2!=NULL)
{
OutputDebugString("isMatch1\n");
EnumChildWindows(hwnd, EnumChildProc,lParam);
return false;
}
return true;
}
int main()
{
HWND hLastWin=FindWindow(NULL, "Win32TestProject2");
if (hLastWin)
{
OutputDebugString("Find succeed\n");
EnumChildWindows(hLastWin,EnumWindowsProc,0);
}
return 0;
}
我用這代碼調試沒有問題