又来打扰大家了,刚上班问题挺多的,其实都是一个问题引出来了。就是两个程序间发消息的问题。
我听同事说有一种现象是这样的:
一个程序可以给界面上任何一个当前光标所在位置传值。
不知道这是怎么实现的,有人知道吗?
我现在觉得应该也是用的sendmessage,不肯定,所以来问问?
最近分少了,先给50吧
我听同事说有一种现象是这样的:
一个程序可以给界面上任何一个当前光标所在位置传值。
不知道这是怎么实现的,有人知道吗?
我现在觉得应该也是用的sendmessage,不肯定,所以来问问?
最近分少了,先给50吧
解决方案 »
- 判断窗体的右端是否为屏幕左端并在屏幕右端显示,急求
- 关于DELPHI2010初级问题
- excel数据导入sqlserver2000数据库的问题.
- 一个很奇怪的问题,在Delphi里编译可运行的程序不能直接用EXE运行
- access追加记录和更新记录问题???
- Word 打开Rave存当的RTF文件是乱码?!!!
- ★★★关于语句速度优化的问题,请高手赐教!★★★
- 高手救命:关于DecisionCube的用法?
- 谁知道那里有前几年网络程序员考试的考试题下载,免费的。
- 50求进销存的需求分析文档!!!一天时间,先到先得!!
- 请问:DELPHI中的远程文件传送是否必须用C/S方式。有没有直接B/S的? 另谁有具体的例子,发个给我。100在线等候
- 什么按钮有按下或弹起来的属性,这个属性是什么
procedure MyMessage(var msg: TMessage);
begin
//分解由SendMessage传来的结构体,一般该结构体是类中的成员变量
end;//发送消息程序Type
PMyData=^TMyData
TMyData=struct
//成员
end;
New(PMyData);
PMyData.XXX:='';
SendMessage(XXX,WM_MyMessage,0,Integer(PMyData));
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Timer1: TTimer;
Edit1: TEdit;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
var
pt : Tpoint;
vhwnd : Hwnd;
begin
if GetCursorPos(pt) then begin
vhwnd := WindowFromPoint(pt);
if vhwnd <> 0 then begin
SendMessage(vhwnd,WM_SETTEXT,0,longint(pchar('虎滴小猪猪')));
end;
end;
end;end.
p:TPoint;
h : Hwnd;
begin
GetCursorPos(p);
h := WindowFromPoint(p);//取得控件句柄
if h > 0 then
begin
SendMessage(vHandle, WM_SETTEXT, 255, LongInt(PChar('上海市')));
end;
end;
我试试你们的方法
if GetCursorPos(pt) then
begin
vhwnd := WindowFromPoint(pt);
if vhwnd > 0 then
begin
GetClassName(vhwnd,ps,256);
if ps = 'TRzEdit' then
SendMessage(vhwnd,WM_SETTEXT,0,LongInt(PChar('aa')));
end;
end;这个的第一个问题是:
如果遍历一个窗体上的控件,判断控件的类名,然后发消息。
第二个问题是:如何不判断是啥控件,只判断所在焦点的位置是否可编辑?我的一个工作牵连出这么多问题,还请大家帮帮忙。
真是学到不少东西,API知道了好几个
(1)我一开始做的用WM_COPYDATA传值,但另一个程序是PB的,写COPYDATASTRUCT好像不好写,总之另一个程序不愿意用这个方法接收值。
(2)后来我就用WM_SETTEXT,向另一个程序传值,另一个程序不向我发任何消息,例如给我句柄,不给我任何信息,只让我通过当前焦点来传值。
这样的话,我就要先获得焦点的控件的句柄,GetCursorPos是获得光标的,如果光标移位,焦点不移,找的就不是焦点所在控件句柄。所以不太妥当。
我昨天查了下用GetForcegroundWindow,这个是得到焦点所在窗体的句柄,而且当焦点在子窗体的某个控件上时,得到的是父窗体的句柄。所以现在的问题就是如果得到当前焦点所在控件的句柄,这样再判断句柄的类型是不是可编辑的,如果是就传值。焦点所在窗体是子窗体的。
说的简单点就是一个程序向当前焦点所在的可编辑框内写值。
不知道我说的明白吗?
方法:
先用GetWindowThreadProcessId得到另一程序的线程ID
然后用AttachThreadInput共享焦点
现在可以用GetFocus得到有焦点的控件的hWnd了
最后别忘了调用AttachThreadInput撤销连接VB的代码例子:放置一Timer(Timer1)、一TextBox(Text1)
Timer的Interval设为100就行了
Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetFocus Lib "user32" () As Long
Private Sub Timer1_Timer()
Dim hWnd As Long
Dim PID As Long
Dim TID As Long
Dim hWndFocus As Long
hWnd = GetForegroundWindow
If hWnd Then
TID = GetWindowThreadProcessId(hWnd, PID)
AttachThreadInput App.ThreadID, TID, True
hWndFocus = GetFocus
AttachThreadInput App.ThreadID, TID, False
Text1.Text = hWndFocus
End If
End Sub
Delphi的代码例子:{此方法研究了好久啊,真不容易啊;
此方法是一个程序,向包括自己在内的其他应用程序传值的方法。
传值时,不需要另一个程序写接收函数,不需要另一个程序向此程序发送请求等。}
procedure TForm1.Button2Click(Sender: TObject);
var
cn: array[0..99] of Char;
s:string;
HD: HWND;
T1,T2: DWORD;
begin
(*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
如果焦点所在子窗体中,则获得的是父窗口句柄。*)
HD := GetForegroundWindow;
if HD > 0 then
begin
//通过焦点所在窗口的句柄,获得其线程的标识符
T1 := GetWindowThreadProcessId(HD);
//通过本身的句柄,获得本身的线程的标识符
T2 := GetWindowThreadProcessId(Application.Handle);
//共享焦点
AttachThreadInput(T2,T1,True);
HD := GetFocus;
if (HD > 0) then
begin
GetClassName(HD,cn,Length(cn));
if Trim(cn) = 'TRzEdit' then
begin
SendMessage(HD,WM_SETTEXT,0,LongInt(PChar('虎滴小猪猪')));
end;
end;
//撤销连接
AttachThreadInput(T2,T1,False);
end;
//HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;
这样我以后忘了好可以查下,并且给以后用的人能搜到。
在此结贴了。
同样感谢以上所有朋友的答案。