主题:【请教】更改TEdit控件的内容
ywmjs
[专家分:740] 发布于 2005-05-31 17:48:00
在Delphi中如何用SendMessage函数改变另外一个已运行的程序中TEdit窗口的内容,望大虾指点。
回复列表 (共4个回复)
沙发
zlhhz [专家分:710] 发布于 2005-06-01 14:44:00
用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);
}
板凳
ywmjs [专家分:740] 发布于 2005-06-01 14:56:00
谢谢了。
3 楼
zlhhz [专家分:710] 发布于 2005-06-03 14:04:00
上面这段代码有时不能获取其他子窗口的内容(当子控件在一个分组框内,且分组框的taborder在其他子控件之前时,获取的只是分组框的内容)和静态空件的内容。这个内容要深入下去就成了像金山词霸屏幕取词的问题,大家对这个问题发表一下看法和提出一些解决方法吧,真是期待~
4 楼
ywmjs [专家分:740] 发布于 2005-06-03 14:45:00
我对Windows编程不是很熟,我是用delphi作的,而且是在delphi中先调用另外一个EXE文件,用FindWindow先找到该文件的主窗口句柄,再用FindWindowEX去找下一级子窗口的句柄,这样可以找到所有的子窗口的句柄,用Windows编程怎么做我就不知道了。
我来回复