using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;namespace Find
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("user32.dll ")]
        public static extern IntPtr WindowFromPoint(Point Point);
        [DllImport("user32.dll ")]
        public static extern IntPtr SetWindowTextA(IntPtr a, string b);
        
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
        }
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            IntPtr hWnd = WindowFromPoint(Cursor.Position);   //获取鼠标指针处窗口的句柄
            SetWindowTextA(hWnd, "AAA");                      //将hWnd的文本设为AAA
        }
    }
}
       我想用这段代码,将鼠标MousrUp时所在的其它窗口上的控件的标题改为AAA,但是控件的标题却不发生改变,请问问题是出在哪里了?
       

解决方案 »

  1.   

    IntPtr hWnd 变成成员变量试试
      

  2.   

    晕,原来不是这段代码的问题,其实已经起作用了,只是没有即时显示。
    我想完成的功能是能在我的程序里,更改歪歪的昵称。用我上面的代码,只是完成了将控件的显示文本变成了AAA,而自己的昵称还是原来的。纠结了,这是怎么回事呢?难道不能这样模拟更改昵称的操作?
      

  3.   

    用 ShowWindow 把窗口隐藏再显示,强制刷新上面的字。
      

  4.   

    SetWindowText
      函数功能:该函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)。如果指定窗口是一个控件,则改变控件的文本内容。然而,SetWindowText函数不改变其他应用程序中的控件的文本内容。
      函数原型:BOOL SetWindowText(HWND hwnd,LPCTSTR lpString);
      参数:
      hWnd:要改变文本内容的窗口或控件的句柄。
      lpString:指向一个空结束的字符串的指针,该字符串将作为窗口或控件的新文本。
      返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
      备注:如果目标窗口属于当前进程,SetWindowText函数会使WM_SETTEXT消息发送给指定的窗口或控件。然而,如果控件是以WS_CAPTION风格创建的列表框控件,SetWindowText函数将为控件设置文本,而不是为列表项设置文本。 以上是SetWindowText的介绍,在备注里有这么一句:然而,如果控件是以WS_CAPTION风格创建的列表框控件,SetWindowText函数将为控件设置文本,而不是为列表项设置文本。 我现在碰到的是不是就是这种情况?如果是的话,我要怎么样才能为列表项设置文本呢?
      

  5.   

    [DllImport("user32.dll ")]
    public static extern IntPtr SendMessage(IntPtr a, string b,int c,int d);SendMessage(hWnd, "AAA", 0, 0);用这个的话,就一点反应都没有了。
      

  6.   

    那当然让你发 WM_SETTEXT,你发的什么?
      

  7.   

    WM_SETTEXT怎么用哇,能帮我写下吗?
    我不是拿来主意,但刚查网页没发现怎么用WM_SETTEXT呀。
    自学C#,好多都不懂,谢谢
      

  8.   

    7楼说的是不是写成这样:
    SendMessage(hWnd, WM_SETTEXT, 0, "AAA");如果是的话,第2个参数报“当前上下文中不存在的名称“WM_SETTEXT””,出现这个是不是和我的版本有关,我用的是framework 4.0。
    新手勿笑勿喷,有说的风马牛的地方还请包涵。
      

  9.   

    你需要定义下 wm_text 常数。
      

  10.   

    [DllImport("user32.dll ")]
    啥意思  看不懂 求教!
      

  11.   

    常数wm_text的值为多少才能得到我要的功能呢?
      

  12.   


    引用windows api 就要加这个
    比如我要引用 windows api里的sendmessage函数,就要在代码中加入如下代码:
    [DllImport("user32.dll ")]
    public static extern IntPtr SendMessage(IntPtr a, string b,int c,int d);user32.dll是包含sendmessage的库
      

  13.   

    我试了一下,如果使用TextBox是可以的。我想,你用pictureBox控件显示文本是有问题的
      

  14.   

    刚才看错了,原来你是想改变坐在窗口的标题呀。
    这么写:
    SetWindowTextA(this.Handle, "AAA"); 
    this是当前窗口的form类,没有问题的。
    你那么写不行是因为你的事件声明在picturebox上,获取的句柄是picturebox的句柄,所以不行的
      

  15.   

    Application.DoEvents();
    显示文本语句后面加这个
      

  16.   

    我想要做的是用自己的程序,改变另外的程序的控件的文本。
    目的是做歪歪的字幕软件。就是自己的程序显示一段歌词的同时,会自动改变歪歪的昵称为当前歌词。
    pictureBox1_MouseUp事件是为了方便,临时使用的。运行我在0楼贴的代码,在pictureBox1上点下鼠标,在歪歪主窗口的昵称那栏上松开鼠标后,歪歪昵称没有改变,如果将歪歪主窗口隐藏再显示,会发现昵称控件的文本已变成“AAA”。但是这个“AAA”只是表明现象,此时点击昵称的话,“AAA”会自己还原为原来的昵称。查歪歪账号信息,昵称也是仍然没有改变。所以我才会想到可能是我在6楼说的情况。然后7楼说要使用SendMessage WM_SETTEXT。而直接使用WM_SETTEXT参数是不行的,要定义WM_SETTEXT常数,而我没有百度到关于WM_SETTEXT常数应设置为多少。也不知道能不能真正起到作用。
    我是为这个软件才学的C#,真的很想把它作完。真心希望高手能指点迷津。
      

  17.   

    WM_SETTEXT 的设置已经知道了,应该设为如下:
    private const int WM_SETTEXT = 0x000C;但是还是没有解决我的问题呀。更改的“AAA”依然是表面,真正的属性没有改变。
    控件的句柄是没错的,刚用spy++确定了一下。
    我在用spy++确定句柄时发现了一件事。就是我在用程序更改了昵称后,用spy++搜索那个控件,它的标题也是变成了“AAA”的,这说明我的代码应该是可行的。至于为什么不起作用,应该是昵称这个控件比较特殊吧。难道要让我把程序做到伪装成歪歪软件,向服务器发送信息才行吗?网上的同类字幕软件应该不是这样做到的吧!纠了个结呀
      

  18.   

    自己刚刚做了个测试,我在另一个程序窗体中放了一个textBoxA和buttonA,事件设置的是如果textBoxA的Text发生改变,则buttonA显示或隐藏。
    然后用0楼的那程序SendMessage,结果textBoxA的Text会改变,并且buttonA相应的显示或隐藏。
    我就是我想在YY上实现的,怎么应用到YY上就不起作用呢?