如何取得符合这几个条件的窗口句柄? (五百分求解)(100分)

  • 主题发起人 主题发起人 路远
  • 开始时间 开始时间

路远

Unregistered / Unconfirmed
GUEST, unregistred user!
1.知道双亲窗口的类。<br>2。这个窗口的条件是当有程序访问注册表用readstring读取注册表的某个特定的值,并把读取的信息赋给这个窗口的tedit或tlabel.。我如何这个窗口的句柄?<br>var<br>&nbsp; ClassName &nbsp;: string;<br>begin<br>&nbsp; Result := True;<br>&nbsp; SetLength (ClassName, 100);<br>&nbsp; GetClassName (hwnd, PChar (ClassName), Length (ClassName));<br>&nbsp; ClassName := PChar (ClassName);<br>&nbsp; if ClassName=A then <br>下面该怎么办呢?
 
//假定只针对TEdit<br>LRESULT CALLBACK EnumWndProc(HWND, LPARAM);<br>HWND hChild;<br>int &nbsp;iChildClassLen;<br>TCHAR szChildClassName[10];<br>while (EnumWindows(EnumWndProc,NULL));<br>LRESULT CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)<br>{<br>&nbsp; hChild = GetWindow(hwnd,GW_CHILD);<br>&nbsp; iChileClassLen = GetClassName(hChild, szChildClassName[10], 10);<br>&nbsp; if (strcmp(szChildClassName, TEXT("TEdit")))<br>&nbsp; {<br>&nbsp; &nbsp; SendMessage(hChild, WM_SETTEXT, 0, (LPARAM)"你定义的串"); <br>&nbsp; } &nbsp;<br>}
 
你这是C++Builder 的语句吗?<br>&nbsp;strcmp(szChildClassName, TEXT("TEdit"))这一句怎么讲?
 
其实SDK编程还是用C比较好。<br>strcmp(szChildClassName, TEXT("TEdit"))<br>是串比较函数,是运行库中的函数,之所以使用<br>TEXT宏,是因为可以兼容UNICODE的缘故。
 
假如是此类名下有很多窗口和很多tedit.<br>&nbsp; &nbsp;我能用strcmp在此类名下的所有窗口中的所有的字符串与我定义的字符串比较?<br>&nbsp; &nbsp;我在<br>&nbsp; &nbsp;http://www.delphibbs.com/delphibbs/dispq.asp?lid=1684733<br>&nbsp; &nbsp;http://www.delphibbs.com/delphibbs/dispq.asp?lid=1686638<br>&nbsp; &nbsp;这里有400分,也是这个问题。你去一下,我把分给你加上。<br>另,我把这段代码复制到C++Builder 过去运行怎么这么多错误?<br>我用Builder执行得到下面的错误.<br>[C++ Error] Unit1.cpp(24): E2034 Cannot convert 'long (__stdcall *)(void *,long)' to 'int (__stdcall *)()'<br>[C++ Error] Unit1.cpp(24): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *,long)')<br>[C++ Error] Unit1.cpp(25): E2108 Improper use of typedef 'LRESULT';<br><br>
 
我用vc7写的。<br>我大概明白你的意思了,<br>就是有一个程序(T程序),它从注册表里读数据(可能是串),然后它将读到<br>的信息放在它的一个TLabel或Tedit控件中显示,这个数据是它下一步<br>运行的依据。<br>而你想将你的数据替换或添加到T程序从注册表取得的数据中,<br>然后同样写入T程序的TLabel或Tedit中,以影响T程序的运行逻辑。<br><br>如果是这样,那么可以这样(我提供一种思路):<br>1、首先取T程序窗口句柄(假定为hWnd)<br>2、oldProc = GetWindowLong(hWnd, GWL_WNDPROC, proc);<br>oldProc是一个标准的窗口回调函数指针,<br>proc是你定义的标准的窗口回调函数指针,<br>其原型是:<br>LRESULT CALLBACK WindowProc(<br>&nbsp; HWND hwnd, &nbsp; &nbsp; &nbsp;// handle to window<br>&nbsp; UINT uMsg, &nbsp; &nbsp; &nbsp;// message identifier<br>&nbsp; WPARAM wParam, &nbsp;// first message parameter<br>&nbsp; LPARAM lParam &nbsp; // second message parameter<br>}<br>3、在你的Proc函数中截获WM_SETTEXT消息,此时要枚举TLabel或TEdit窗口,<br>一旦确定是你要修改的目标窗口,就<br>SendMessage(hWnd/*Tlabel或TEdit句柄*/, WM_SETTEXT, 0, (LPARAM)"你的串");<br>return 0;/*截获*/<br>4、<br>其他的消息回传T程序<br>CallWindowProc(oldProc,hWnd,msg,wParam,lParam);<br>5、祝你好运。<br>
 
<br>对,我的目的就是这样的。不过T程序是一类程序,<br>我知道它属于的类名。<br>枚举所有TLabel或TEdit窗口如何枚举,我只知道的一个字符串。<br>用你说的strcmp能否完成。strcmp(Mystring, TEXT("TEdit"))|strcmp(Mystring, caption("TLabel")<br>strcmp是否能和此类名下所有窗口里的字符串比较?<br>
 
提醒:TLabel是Graphic控件,没有窗口句柄的
 
枚举窗口用EnumWindows函数,我第一个程序中已使用。<br>to:Traveller:<br>提醒:TLabel是Graphic控件,没有窗口句柄的.<br>我不知道什么是Graphic控件,我只知道TLabel底层用的是系统<br>自注册的static类,有窗口句柄。
 
还有strcmp函数类似delphi的CompareStr函数。
 
yyii_yyii,你说的那是TStaticText,不是TLabel
 
再to:Traveller:<br><br>TStaticText和TLabel都派生自static类,只是<br>RegisterClass以及CreateWindow时的参数不同而已。 <br>
 
:-(<br>你还是看看VCL源代码吧,争论没有什么用处,那里面写得很明白。
 
to Traveller:<br>VCL源代码我早已看过,说到底也是对api的封装,和MFC大同小意。<br>如果你研究一下BPL你就都明白了。
 
:-(<br>佩服,不说了
 
我一直不明白你的第一个程序为什么要用szChildClassName在strcmp(szChildClassName, TEXT("TEdit")<br>里和TEXT("TEdit")比较?szChildClassName有什么关系? TLabel有窗口句柄,Tedit也有窗口句柄吧?它的windows text 就是tedit.text<br>TLabel.caption.要不要GetWindowText把他们联系起来?<br>还有我用你的第一句调试到这一句while(EnumWindows(EnumWndProc,NULL)#); 说Type mismatch in parameter 'lpEnumFunc' <br>EnumWndProc的类型不对吗?<br>
 
Tedit不是delphi的注册类名吗?<br>对不起LRESULT CALLBACK EnumWndProc(HWND, LPARAM);的返回值写错了,<br>是笔误;应该为:<br>BOOL CALLBACK EnumWndProc(HWND, LPARAM);
 
我改成这样<br>bool EnumWndProc(HWND, LPARAM);<br>HWND hChild;<br>int &nbsp;iChildClassLen;<br>TCHAR szChildClassName[10];<br>while (EnumWindows(EnumWndProc,NULL));<br>bool &nbsp;EnumWndProc(HWND hWnd, LPARAM lParam)<br>还是说[C++ Error] Unit1.cpp(24): E2034 Cannot convert 'bool (*)(void *,long)' to 'int (__stdcall *)()'<br>[C++ Error] Unit1.cpp(24): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'bool (*)(void *,long)')<br>这样行不行?<br>BOOL &nbsp;EnumWndProc(HWND, LPARAM);<br>HWND hChild;<br>int &nbsp;iChildClassLen;<br>TCHAR szChildClassName[10];<br>bool h = true;<br>h = EnumWindows(EnumWndProc,NULL);<br>while (h)
 
话题要结束了。yyii_yyii还有400分<br>在http://www.delphibbs.com/delphibbs/dispq.asp?lid=1684733<br>&nbsp; &nbsp;http://www.delphibbs.com/delphibbs/dispq.asp?lid=1686638<br>,也是这个问题。我怎么把分给你加上?<br>
 
后退
顶部