首页 新闻 会员 周边 捐助

wm6.1 ,修改"去电"提示窗口内的文字

0
悬赏园豆:20 [已解决问题] 解决于 2011-04-18 10:57

平台:windows mobile 6.1
语言:C#

在拨打电话的 页面标题为“电话”的页面中,
如何将 “正在拨号...”字符串 上面的“中国移动”改成我指定的字符串?

ps:
使用Remote Spy 查找窗口的方式试过好像不可以。

请各位大虾多多帮忙,非常感谢,郁闷好几天了。

asnow的主页 asnow | 初学一级 | 园豆:110
提问于:2011-04-10 18:14
< >
分享
最佳答案
0
瞅瞅你这个东西肯定要调用win api 来修改了.你自己调用一下获取去点窗口,手动设置下吧,有空我写一个.
#region
"win API"
 
 
public static extern IntPtr FindWindow
(
string lpClassName, string lpWindowName);
 
/// <summary>
 
///
 
/// </summary>
 
/// <param name="hWnd"></param>
 
/// <param name="X"></param>
 
/// <param name="Y"></param>
 
/// <param name="nWidth"></param>
 
/// <param name="nHeight"></param>
 
/// <param name="bRepaint"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll", SetLastError = true)]
 
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
 
 
/// <summary>
 
///
 
///wFlag
 
///WM_COMMAND = &H111
 
///GW_Child = 5
 
///GW_HWNDFIRST = 0
 
///GW_HWNDLAST = 1
 
///GW_HWNDNEXT = 2
 
///GW_HWNDPREV = 3
 
///GW_OWNER = 4
 
/// </summary>
 
/// <param name="hwnd"></param>
 
/// <param name="wFlag"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll", CharSet = CharSet.Auto, SetLastError = true)]
 
public static extern IntPtr GetWindow(IntPtr hwnd, int wFlag);
 
/// <summary>
 
///
 
/// </summary>
 
/// <param name="hWnd"></param>
 
/// <param name="nIDDlgItem"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll", CharSet = CharSet.Auto)]
 
public static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
 
/// <summary>
 
///
 
/// </summary>
 
/// <param name="hWnd"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll", CharSet = CharSet.Auto)]
 
public static extern bool SetForegroundWindow(IntPtr hWnd);
 
/// <summary>
 
///
 
/// </summary>
 
/// <param name="hDlg"></param>
 
/// <param name="nIDDlgItem"></param>
 
/// <param name="lpString"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll")]
 
static extern bool SetDlgItemText(IntPtr hDlg, int nIDDlgItem, string lpString);
 
/// <summary>
 
///
 
/// </summary>
 
/// <param name="hwnd"></param>
 
/// <param name="lpString"></param>
 
/// <returns></returns>
[
DllImport("Coredll.dll", SetLastError = true)]
 
public static extern bool SetWindowText(IntPtr hwnd, String lpString);
#endregion
瞅瞅这段代码!!!~~~~
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
private
 
void
loadIncoming()
{
 
SystemState state = new SystemState(SystemProperty
.PhoneIncomingCallerNumber);
state.Changed +=
new ChangeEventHandler
(state_Changed);
}
 
IntPtr hwnd = new IntPtr
();
 
private void state_Changed(object sender, ChangeEventArgs
args)
{
 
//
hwnd = FindWindow(
"Dialog", " - "
);
 
//
 
if (args.NewValue != null
)
{
 
if (hwnd != null
)
{
 
IntPtr
h2 = GetWindow(hwnd, 5);
h2 = GetWindow(h2, 5);
 
IntPtr
hChild = GetDlgItem(h2, 0x000059E2);
SetWindowText(hChild,
":");
//
hChild = GetDlgItem(h2, 0x00005A13);
SetWindowText(hChild,
"" + args.NewValue.ToString());
//
SetForegroundWindow(hwnd);
 
//
 
//MoveWindow(hwnd, 0, 470, 0, 0, false);
}
}
}
好了,搞定了,上代码.如需要,联系我索取源代码.
有个问题就是,如果你用的英文版本,获取窗口的时候注意修改参数.

    public Form1()
        {
            InitializeComponent(); loadIncoming();
        }
        private void loadIncoming()
        {
            SystemState state = new SystemState(SystemProperty.PhoneIncomingCallerNumber);
            state.Changed += new ChangeEventHandler(state_Changed);
        }
        IntPtr hwnd = new IntPtr();
        private void state_Changed(object sender, ChangeEventArgs args)
        {
            //查找到来电提示框窗口
            // hwnd = FindWindow("Dialog", "电话 - 拨入");
            hwnd = FindWindow("Dialog", "Phone - Incoming");
            //如果值不为空则为来电号码
            if (args.NewValue != null)
            {
                if (hwnd != null)
                {
                    IntPtr h2 = GetWindow(hwnd, 5);
                    h2 = GetWindow(h2, 5);
                    IntPtr hChild = GetDlgItem(h2, 0x000059E2);
                    SetWindowText(hChild, "Hello");//到时候可以做其他修改
                    hChild = GetDlgItem(h2, 0x00005A13);
                    SetWindowText(hChild, "Number (Mine)" + args.NewValue.ToString());//重复显示来电号码
                    SetForegroundWindow(hwnd);

                    //如果是不想显示默认的来电提示窗口可以通过移动来电提示窗口到不可见区域
                    //MoveWindow(hwnd, 0, 470, 0, 0, false);
                }
            }
        }

        #region win API
        /// <summary>
        /// 根据窗口名字获得窗口句柄
        /// </summary>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName"></param>
        /// <returns></returns>
        [DllImport("coredll.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        /// <summary>
        /// 移动窗口
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <param name="nWidth"></param>
        /// <param name="nHeight"></param>
        /// <param name="bRepaint"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll", SetLastError = true)]
        public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);


        /// <summary>
        /// 获得窗口
        ///wFlag:
        ///WM_COMMAND = &H111
        ///GW_Child = 5
        ///GW_HWNDFIRST = 0
        ///GW_HWNDLAST = 1
        ///GW_HWNDNEXT = 2
        ///GW_HWNDPREV = 3
        ///GW_OWNER = 4
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="wFlag"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetWindow(IntPtr hwnd, int wFlag);

        /// <summary>
        /// 获得子窗口
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="nIDDlgItem"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
        /// <summary>
        /// 设置最前面的窗口
        /// </summary>
        /// <param name="hWnd"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll", CharSet = CharSet.Auto)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
        /// <summary>
        /// 设置对话框内容
        /// </summary>
        /// <param name="hDlg"></param>
        /// <param name="nIDDlgItem"></param>
        /// <param name="lpString"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll")]
        static extern bool SetDlgItemText(IntPtr hDlg, int nIDDlgItem, string lpString);
        /// <summary>
        /// 设置窗口内容
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="lpString"></param>
        /// <returns></returns>
        [DllImport("Coredll.dll", SetLastError = true)]
        public static extern bool SetWindowText(IntPtr hwnd, String lpString);
        #endregion
    }

收获园豆:20
DYStudio.Net | 小虾三级 |园豆:1747 | 2011-04-11 23:25
请问一下 DYStudio.Net,我已经做了好几天了,它真的很困扰我,我也不知道到底哪里出了问题。我的那一段代码主要是:
void phoneCallCalling_Changed(object sender, ChangeEventArgs args)
{
//查找到去电提示框窗口
hwnd = FindWindow("Dialog", "电话 ");
//如果值不为空则为去电号码
if (args.NewValue != null)
{
if (hwnd != null)
{
IntPtr h4 = GetDlgItem(hwnd, 0x000059E2);
SetWindowText(hwnd, “区域:上海”);//这里原来是“中国移动”,我想改成“区域:上海”
}
}
通过远程监视spy++,我也发现“电话(dialog)”中 windows id为0x000059E2的“中国移动”改为“区域:上海”。但是去电页面就是没有正确被修改,还是“中国移动”。
我这样的做法不对吗?正是你所说得findWindow来实现的。希望你不吝赐教,指点指点,真的很感谢。
asnow | 园豆:110 (初学一级) | 2011-04-12 09:44
我还没弄代码,从你这个情况来看,我在想,难道需要刷新窗口???猜测,猜测.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-12 23:10
想了一下你那个提示应该是子窗口,呵呵也是猜测,有时间一定写写试试.
http://www.cnblogs.com/simen/articles/1758084.html 这篇文章给的提示.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-12 23:21
搞定了!~~~
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-13 10:08
不好意思,回复晚了~今天上午我去医院看咳嗽了,有点发炎了,呵呵~
hwnd = FindWindow("Dialog", " - " );
if (args.NewValue != null )
{
if (hwnd != null
)
{

IntPtr
h2 = GetWindow(hwnd, 5);
h2 = GetWindow(h2, 5);

IntPtr
hChild = GetDlgItem(h2, 0x000059E2);
SetWindowText(hChild,
":");
//
hChild = GetDlgItem(h2, 0x00005A13);
SetWindowText(hChild,
"" + args.NewValue.ToString());
//
SetForegroundWindow(hwnd);
差不多就这段代码吗?好的,我看看,谢谢你哦~
asnow | 园豆:110 (初学一级) | 2011-04-13 13:53
身体重要.保重啊!~~~我可不像你,几年都没进医院了,呵呵,锻炼下身体嘛~~~
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-13 13:55
@DYStudio.Net:
hwnd = FindWindow("Dialog", " - " );
if (args.NewValue != null )
{
if (hwnd != null
)
{

IntPtr
h2 = GetWindow(hwnd, 5);
h2 = GetWindow(h2, 5);

IntPtr
hChild = GetDlgItem(h2, 0x000059E2);
SetWindowText(hChild,
":");
//
hChild = GetDlgItem(h2, 0x00005A13);
SetWindowText(hChild,
"" + args.NewValue.ToString());
//
SetForegroundWindow(hwnd);
用了这段代码还是显示不出来?
用远程监控看到“中国移动”修改了,但是电话打出去的"电话"页面却还是“中国移动”,没有成功的显示我所修改的地址?
asnow | 园豆:110 (初学一级) | 2011-04-13 14:31
@DYStudio.Net:
来电窗口“电话-拨入”是可以成功修改:
hwnd = FindWindow("Dialog", "电话 - 拨入");
//如果值不为空则为来电号码
if (args.NewValue != null)
{
if (hwnd != null)
{
IntPtr h2 = GetWindow(hwnd, 5);
h2 = GetWindow(h2, 5);
IntPtr hChild = GetDlgItem(h2, 0x000059E2);
SetWindowText(hChild, "Hello");//到时候可以做其他修改
hChild = GetDlgItem(h2, 0x00005A13);
SetWindowText(hChild, "Number (Mine)" + args.NewValue.ToString());//重复显示来电号码
SetForegroundWindow(hwnd);

//如果是不想显示默认的来电提示窗口可以通过移动来电提示窗口到不可见区域
//MoveWindow(hwnd, 0, 470, 0, 0, false);
}
}
但是“去电(电话)”页面就是很奇怪,就是不能像“来电页面(电话-拨入)”修改成功。请指点。
asnow | 园豆:110 (初学一级) | 2011-04-13 15:22
嗯正想来告诉你我修改的来电,想告诉你类似的方法修改去电.我回家写吧.在公司没装模拟打电话的那个东东.最近在公司也特忙.明天上午有空就写写.你自己努力试试.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-13 21:14
@DYStudio.Net:
5555555。。。。。我已经试了好几天了,“去电”页面就是很奇怪,它用远程监控看到“中国移动”修改了,但是电话打出去的"电话"页面却还是“中国移动”,没有成功的显示我所修改的地址?
实在不知道什么原因导致去电的“电话”页面在拨打电话是没有显示成功。
去电和来电页面似乎有很大的差别,之前来电页面我参考网上资料,比较快的就成功了,几乎没什么疑问。但是去电页面却是摸不着头脑,不知道问题出在哪里。
asnow | 园豆:110 (初学一级) | 2011-04-13 22:09
难道6.1有这个bug? 真是不行就换损招,把那个窗口给它移动到一边看不到的地方,自己写个窗口放到那里,哈哈~~~~
把代码发来.我看看你的代码吧.visualstudio2020@gmail.com
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 09:51
@DYStudio.Net:
刚弄好了,已经发到你邮箱了,请帮忙查看一下。非常之感谢,呵呵。
asnow | 园豆:110 (初学一级) | 2011-04-14 10:23
@DYStudio.Net:
请问有收到我的邮件吗?
asnow | 园豆:110 (初学一级) | 2011-04-14 10:38
收到了.
//查找到去电提示框窗口
hwnd = FindWindow("Dialog", "Phone ");
//如果值不为空则为去电号码
//if (args.NewValue != null)
// {
if (hwnd != null)
{
IntPtr h4 = GetDlgItem(hwnd, 0x000059E2);
SetWindowText(h4, "area:shanghai");//这里我修改成功,我的是英文版本,没实物手机测试,公司有,这里我设置成功
SetForegroundWindow(h4);
}
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 12:18
@DYStudio.Net:
我那段代码不是这样的吗?只是中文版而已?
你是否用的是我那段代码啊?
asnow | 园豆:110 (初学一级) | 2011-04-14 12:43
你注意参数,SetForegroundWindow(h4);
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 12:51
@DYStudio.Net:
你是用什么测试成功的?不是真机,是模拟器吗?Emulator
asnow | 园豆:110 (初学一级) | 2011-04-14 12:51
代码那几个api就够了.你的实在不行,就用损招吧.把原来那个窗口移走,换一个你自己定义的.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 12:52
恩模拟器.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 12:52
想别想模拟器啊,什么系统的bug了,先看好自己的代码.仔细看看,仔细想想.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 12:53
@DYStudio.Net:
哦。。。和模拟器无关吗?
主要我发现不了自己错在哪里,就进行各种猜测了。。。。。
asnow | 园豆:110 (初学一级) | 2011-04-14 13:06
恩 是你的代码事件并没有触发,你自己得跟踪代码啊,或者写日志看看代码如何进行的,我不知道你的程序如何调试代码,我就写了windows mobile form 程序,你的类似控制台,代码就是下面几行,是好用的,你得找个合适的事件来触发它.
hwnd = FindWindow("Dialog", "Phone ");
if (hwnd != null)
{
IntPtr hChild = GetDlgItem(hwnd, 0x000059E2);
SetWindowText(hChild, "China Mobile -> area:shanghai");//这里原来是“中国移动”,我想改成“区域:上海”
SetForegroundWindow(hChild);
}
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:14
@DYStudio.Net:
这个参数我修改了,可是没有什么变化。
远程监控上看出修改“区域:上海”修改成功,但是真机上去电页面就是没有修改,很奇怪。。。。。。
asnow | 园豆:110 (初学一级) | 2011-04-14 13:14
你注意看看我上面最后一条评论.比较一下你的代码.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:15
要不你也写个窗体程序,窗体上你放个button,点击执行上面的代码,然后你在切换到你的手机打电话界面,看看文字变了没有,就知道了.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:18
设置完了,你得把子窗体设置为最前面.就这些了.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:19
@DYStudio.Net:
我的程序中事件没有触发吗?我是用system.PhoneCallCalling,当有电话即将打出时,触发了修改去电页面的代码的。
当电话拨出,它从事件system.PhoneCallCalling中进入了修改去电页面的代码。这难道不是成功进入事件吗?
麻烦你了,谢谢。
asnow | 园豆:110 (初学一级) | 2011-04-14 13:22
你自己都不知道触发没触发吗,这就是问题所在,你得自己排除,跟踪或者写日志吧.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:24
@DYStudio.Net:
我确定我那样就是触发成功了,但是就是没有正确执行我的代码。
我想请问一下,你说你是用窗体的,那你用什么事件触发去电页面修改的?
wm拨号以后,不是就进入“电话”页面,你那个事件是在form的ui thread中写的,怎么成功修改“电话”页面的。能把你的代码发给我看看吗?
asnow | 园豆:110 (初学一级) | 2011-04-14 13:32
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new EventHandler(timer1_Tick);
}

void timer1_Tick(object sender, EventArgs e)
{
ModifyTitle();
}



public static void ModifyTitle()
{
IntPtr hwnd = FindWindow("Dialog", "Phone ");
if (hwnd != null)
{
IntPtr hChild = GetDlgItem(hwnd, 0x000059E2);
SetWindowText(hChild, "China Mobile -> area:shanghai");//这里原来是“中国移动”,我想改成“区域:上海”
SetForegroundWindow(hChild);
}
}
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:41
你就用上面的,用timer来修改.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:41
你把Phone 换成 电话
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 13:42
@DYStudio.Net:
谢谢你的热心帮助~
对于wm一些相关知识,我理解不是很多。再次谢谢你,我先看看~
asnow | 园豆:110 (初学一级) | 2011-04-14 13:45
代码发给你了,跑起来就可以,你的程序改的.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 14:02
@DYStudio.Net:
恩恩,收到了。谢谢。
asnow | 园豆:110 (初学一级) | 2011-04-14 14:04
@DYStudio.Net:
我在多普达S1上跑了你的代码。把你的Pone改成中文“电话 ”,结果发现这个程序没有成功修改去电页面。
就像我之前给的代码一样,都透过远程监控理论上修改成功,耳针机上的去电页面去没有任何改变。。。。
asnow | 园豆:110 (初学一级) | 2011-04-14 14:16
耳针机是什么东西?具体情况你具体分析吧.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 14:25
@DYStudio.Net:
那个,不好意思,字打错了。。。。是“而真机多普达S1上的去电页面去没有任何改变”。。。。
asnow | 园豆:110 (初学一级) | 2011-04-14 14:28
如果是硬件的问题,就用损招吧.
把窗口隐藏或者移动一边去,用自己定义的试试了.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 14:31
@DYStudio.Net:
唉。。。。。。头晕脑胀的。。。。身心都不舒服啊。。
先moveWindow一下
asnow | 园豆:110 (初学一级) | 2011-04-14 14:45
@DYStudio.Net:
之之前网上有下载软件——来电通,它能够成功的在去电页面上修改“中国移动”为获取的“区域:上海”。透过远程监视SPY
++看到那个参数0x000059E2修改成功。
于是我相信有方法可以改的,只是我没找对方法,一次次的调试。就是像这样你模拟器上成功,我用你的代码跑一遍,却也是同样的结果。
真是气得吐血了。。。。不甘心也得甘心,不在0x000059E2上修改做文章,改用其他方法试试。
请问一下moveWindow后,怎么在“中国移动”那个位置画上自己需要填写的内容?尽量具体点,谢谢了~
asnow | 园豆:110 (初学一级) | 2011-04-14 14:57
@DYStudio.Net:
DYStudio.Net,告诉你一件很奇怪的事情,我改“电话”为“上海”,显示成功了。我决定暂时先这样改。(其实之前我就发现这个了,只是在那个位置如果地址长了,会被挡住的。而且下载下来的软件显示“中国移动”可以改成功,我一直不放弃。现在看来,没有更好的办法的话,我只能先这样)
对于自己定义一个“上海”在“中国移动”的位置上,我还真的不知道怎么着手。。。。可以的话,请你告诉我~可以成功的话,还是会选择这个方法来显示“上海”,改在这里不会被什么挡住~
asnow | 园豆:110 (初学一级) | 2011-04-14 15:32
哈哈,告诉你吧.我在手机上测试了,没问题,修改成功.我的手机比你的好点,摩托罗拉MC75,一个系统6.1,一个6.5,还有一个FR68也是6.5. 修改没问题的,但是有一个问题就是,他可以被别的系统消息再此修改,我有个手机没有sim卡,后来提示没有sim卡就把我的信息给修改了.你看看把,他这个不稳定的话,就自己搞一个窗口,放到那里,这招应该没问题啦.还有就是看看你的需求,感觉有点怪怪的.
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-14 21:29
我感觉,从用户的可用性来讲,你应该自己new 一个窗体出来,只不过窗体就像一个textbox般大小,宽度为100%,背景颜色客户可以设置,或者你设置为特定的颜色,位置也可以自己定义,比如top,middle,或者bottom,这样比较好一些,个人愚见!!!~~~
DYStudio.Net | 园豆:1747 (小虾三级) | 2011-04-15 08:30
@DYStudio.Net:
你的见解很对呢!
asnow | 园豆:110 (初学一级) | 2011-04-15 09:25
@DYStudio.Net:
发了邮件问你问题~呵呵
asnow | 园豆:110 (初学一级) | 2011-04-15 09:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册