回 帖 发 新 帖 刷新版面

主题:【请教】更改TEdit控件的内容

在Delphi中如何用SendMessage函数改变另外一个已运行的程序中TEdit窗口的内容,望大虾指点。

回复列表 (共4个回复)

沙发

用SendMessage函数改变他窗口的内容使用:

SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)lpsz);

关键在于获取窗口句柄hwnd.
如果已知text窗口父窗口的窗口类名或标题,可以用函数

HWND FindWindow(
  LPCTSTR lpClassName,  // pointer to class name
  LPCTSTR lpWindowName  // pointer to window name
);

获取父窗口的窗口句柄hwndparent.

如果知道text子窗口的位置,可以用函数

HWND ChildWindowFromPoint(
  HWND hWndParent,  // handle to parent window
  POINT Point       // structure with point coordinates
);

获取text子窗口的句柄hwnd
如果知道窗口的ID,可以用函数

HWND GetDlgItem(
  HWND hDlg,       // handle of dialog box
  int nIDDlgItem   // identifier of control
);

获取text子窗口的句柄hwnd

这样就可以向窗口发送WM_SETTEXT消息了

如果都不知道,那就只好枚举所有的子窗口了(我的判断不一定对!)

下面给出一个例子,该例子可以获取主窗口及子窗口的内容:


#include <windows.h>

#define ID_TEXT 101   //text ID


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

TCHAR    szAppName[]=TEXT("GetWindowHandle");

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{    
    HWND        hwnd;
    MSG            msg;
    WNDCLASS    wndclass;

    wndclass.style            =CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc    =WndProc;
    wndclass.cbClsExtra        =0;
    wndclass.cbWndExtra        =0;
    wndclass.hInstance        =hInstance;
    wndclass.hIcon            =LoadIcon (NULL, IDI_APPLICATION);
    wndclass.hCursor        =LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground    =(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName    =NULL;
    wndclass.lpszClassName    =szAppName;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
        return 0;
    }
     
    hwnd=CreateWindow(szAppName,                 
                    szAppName,
                    WS_OVERLAPPEDWINDOW,       
                    CW_USEDEFAULT,CW_USEDEFAULT,             
                    600,150,            
                    NULL,                      
                    NULL,                     
                    hInstance,                 
                    NULL);                   
     
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
     
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    LPCREATESTRUCT    lpcs;
    static HWND        hwndtext;
    static TCHAR    text[1024];
    HWND    hd;
    POINT    pt;

    switch (message)
    {
    case WM_CREATE:
        lpcs = (LPCREATESTRUCT)lParam;
        hwndtext = CreateWindow(TEXT("EDIT"),               
                    TEXT("my text"),
                    ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,       
                    0,0,600,140,            
                    hwnd,                      
                    (HMENU)ID_TEXT,                     
                    lpcs->hInstance,                 
                    NULL);
        SetTimer(hwnd,1,1000,NULL);
        return 0;
    case WM_TIMER:
        GetCursorPos(&pt);
        hd = WindowFromPoint(pt);
        if(hd)
        {
            SendMessage(hd,WM_GETTEXT,1024,(LPARAM)text);
            SetWindowText(hwndtext,text);
        }
        return 0;
    case WM_DESTROY:
        KillTimer(hwnd,1);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

板凳

谢谢了。

3 楼

上面这段代码有时不能获取其他子窗口的内容(当子控件在一个分组框内,且分组框的taborder在其他子控件之前时,获取的只是分组框的内容)和静态空件的内容。这个内容要深入下去就成了像金山词霸屏幕取词的问题,大家对这个问题发表一下看法和提出一些解决方法吧,真是期待~

4 楼

我对Windows编程不是很熟,我是用delphi作的,而且是在delphi中先调用另外一个EXE文件,用FindWindow先找到该文件的主窗口句柄,再用FindWindowEX去找下一级子窗口的句柄,这样可以找到所有的子窗口的句柄,用Windows编程怎么做我就不知道了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册