RT,这个消息框不是我弹出的,弹出的消息内容是一串英文,客户看不懂,所有想改变下里的内容,
我用了系统API函数来抓它的句柄,抓是抓出来了,可改变里的内容就改变不了,只能改变MessageBox的标题。求解??
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll ", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int hwnd, int wMsg, IntPtr wParam, string lParam);
public void alter()
{
int WM_SETTEXT = 0x000C;
string lpszParentWindow = "Error";
int ParenthWnd = (int)FindWindow(null, lpszParentWindow);
if (ParenthWnd != null)
{
SendMessage(ParenthWnd , WM_SETTEXT , IntPtr.Zero, "要修改的内容");
}
}
我用了系统API函数来抓它的句柄,抓是抓出来了,可改变里的内容就改变不了,只能改变MessageBox的标题。求解??
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll ", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int hwnd, int wMsg, IntPtr wParam, string lParam);
public void alter()
{
int WM_SETTEXT = 0x000C;
string lpszParentWindow = "Error";
int ParenthWnd = (int)FindWindow(null, lpszParentWindow);
if (ParenthWnd != null)
{
SendMessage(ParenthWnd , WM_SETTEXT , IntPtr.Zero, "要修改的内容");
}
}
解决方案 »
- 错误: 在选定的数据源上未找到名为“PaperState”的字段或属性。
- 将年份信息添加的combobox下拉框
- 请问知道在内存中一个图片的指针IntPtr,如何把这个图片显示在ImageBox里面呢?
- 有人知道Visual Studio 2005里面的Call Graph怎么用吗?
- 在datagrid中点击编辑时,生成的文本框,怎么控制文本框的宽度呢?
- 求助:如何将文件写入数据库和取出
- XmlElement要从Document创建,那创建后怎么还需要调用AppendChild才能加上?
- 按F键显示窗体,再按隐藏(托盘也可)
- 高分求知:C#問題
- 网址中传递的汉字为什么我取出来的是乱码
- gridview 绑定带参数的方法 用数据源绑定
- TreeView节点的选择与导航 急!!在线等
SendMessage(ParenthWnd , WM_SETTEXT , IntPtr.Zero, "要修改的内容");因为你只抓到了对话框的句柄
除非你知道那个消息框内的数据的构造,否则无法按要求修改里面的内容,你甚至不知道你要修改的那个message是什么,也许就是个图片。
首先确定message的容器是什么,尝试抓取这个容器的句柄,然后自定一个一样的容器(装了你改了的message),替换掉原来的。
一个窗体里面的每个组件应该都有其句柄并且可抓取,用截图软件的时候它就能够分析出一个窗体内的不同部分(比如工具栏、滚动条)。
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll ", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam); [DllImport("user32.dll ", EntryPoint = "SendMessageW")]
private static extern int SendMessageW(IntPtr hWnd, int Msg, int wParam, IntPtr lParam); [DllImport("user32.dll ", EntryPoint = "GetWindow")]
private static extern IntPtr GetWindow(IntPtr hwnd, int cmd); public static void alter()
{
int WM_SETTEXT = 0x000C;
int WM_GETTEXT = 0x000D;
int GW_HWNDFIRST = 0;
int GW_HWNDNEXT = 2;
int GW_CHILD = 5;
string lpszParentWindow = "Error";
IntPtr ParenthWnd = FindWindow(null, lpszParentWindow);
IntPtr control = IntPtr.Zero;
if (ParenthWnd != IntPtr.Zero)
{
control = GetWindow(ParenthWnd, GW_CHILD);
string w = string.Empty;
int maxLength = 100;
IntPtr buffer; buffer = Marshal.AllocHGlobal((maxLength + 1) * 2);
SendMessageW(control, WM_GETTEXT, maxLength, buffer);
w = Marshal.PtrToStringUni(buffer);
Marshal.FreeHGlobal(buffer); while (w != "原来的内容")
{
control = GetWindow(control, GW_HWNDNEXT); buffer = Marshal.AllocHGlobal((maxLength + 1) * 2);
SendMessageW(control, WM_GETTEXT, maxLength, buffer);
w = Marshal.PtrToStringUni(buffer);
Marshal.FreeHGlobal(buffer);
} SendMessage(control, WM_SETTEXT, IntPtr.Zero, "要修改的内容");
}
}
另外你这个解决问题很不彻底。你能保证那个程序只弹这一条错误提示吗?其他提示也被你替换成这段文本了。
估计它是在窗口初始化的时候,直接画出来的文字。如果是调用别人DLL的话,也许可以这样做:
在进程内创建消息钩子,把每个对话框的WM_INITDIALOG接管一下。