如何用程序将Word中文档窗口最大化?(100分)

  • 主题发起人 主题发起人 quaver
  • 开始时间 开始时间
Q

quaver

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用程序将Word中所有文档窗口最大化?此时主窗口标题栏中会显示文档文件名。<br>这个问题已经困扰我多时,哪位高手有这方面的经验,请指点一下,最好给出代码。<br>多谢!
 
&nbsp;如果能找到 Word 窗口句柄,就可以用 API 函数依次得到文档子窗口句柄,发送 WM_SYSCOMMAND<br>消息,传入 SC_MAXIMIZE 值就可以了。<br>&nbsp; Word 窗口句柄应该可以用 FindWindow 得到。<br>HWND FindWindow(<br>&nbsp; &nbsp; LPCTSTR lpClassName, // pointer to class name<br>&nbsp; &nbsp; LPCTSTR lpWindowName // pointer to window name<br>&nbsp; &nbsp;);<br>FindWindow 返回窗口的句柄,但它需要一个 ClassName 和 WindowName,WindowName 就是<br>窗口的标题,可以看得到,难的是得到 ClassName,有一个歪办法,Delphi 5 带了一个工具<br>叫 WinSight ,可以观察到所有窗口的类名等信息,得到这些参数后就好办了。<br>&nbsp; OK ?
 
首先感谢BaKuBaKu的指点。<br><br>Word 的ClassName是OpusApp,我通过FindWindow确实可以找到 Word 窗口句柄,但我想<br>找到 Word 文档窗口的句柄。以下是我的代码。<br><br>function SetDocWinMax(hwnd:THandle;Param:Integer):Boolean;stdcall;<br>var<br>&nbsp; ClassName:array[0..255] of char;<br>begin<br>&nbsp; GetClassName(hwnd,ClassName,SizeOf(ClassName)); &nbsp;//hwnd:Word 窗口句柄<br>&nbsp; if (Pos('_WwB',StrPas(@ClassName))&gt;0) then<br>&nbsp; &nbsp; if GetWindow(hwnd,GW_CHILD)&gt;0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result:=true;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>end;<br><br>调用程序:<br>&nbsp; h:=FindWindow('OpusApp',nil);<br>&nbsp; if h&lt;&gt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp; SetForegroundWindow(h);<br>&nbsp; &nbsp; EnumChildWindows(h,@SetDocWinMax,0);<br>&nbsp; end;<br><br>执行结果:Word 文档窗口充满整个用户区,Word菜单、工具条都不见了。<br>与我想要达到的效果不一致。(我希望向MDI子窗口那样最大化)<br><br>此段代码有何问题,望高手指点。
 
你想完成什么样的功能?<br>用程序控制最大化有什么意义?
 
&nbsp;应该是你不加区分地发送消息的原因,工具条、菜单栏都是有自己的窗口句柄的,而你所需要的<br>仅仅是处理文档窗口,所以在发送消息之前,应该判断一下目标对象的类型,同样可以用 ClassName<br>来判断。<br>&nbsp; Try it !
 
&nbsp; &nbsp;Hw:=FindWindow('OpusApp',nil);<br>&nbsp; &nbsp; if Hw&lt;&gt;0 then begin<br>&nbsp; &nbsp; &nbsp; &nbsp;Showwindow(Hw,SW_MAXIMIZE);
 
首先感谢各位的指点。<br><br>To BakuBaBu:<br>我通过WinSignt发现文档窗口是'_WwB'类的子窗口(不知是否正确)。<br>我的代码<br>&nbsp; if (Pos('_WwB',StrPas(@ClassName))&gt;0) then<br>&nbsp; &nbsp; if GetWindow(hwnd,GW_CHILD)&gt;0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result:=true;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>已经过滤掉了工具条、菜单栏这些我不关心的窗口,可还是不行。<br><br>To CathyEagle:<br>文档窗口最大化时主窗口标题栏中才会显示文档文件名,eg.“Microsoft Word -Doc1”<br>我需要知道Word中所有文档文件的文件名。文档窗口非最大化时主窗口标题栏仅显示<br>“Microsoft Word”.你有其他好办法吗?<br><br>To Shanys:<br>&nbsp; 我想最大化Word的文档窗口(即MDI子窗口),不是Word主窗口<br><br>To gcq:<br>&nbsp; 我不明白你的意思。<br>&nbsp; &nbsp; &nbsp; &nbsp;
 
我的意思简单:继续、提前……<br><br>不过,FINDWIDOW应该一样可以找到MDI子窗体!<br>你试试看能否找到WORD的客户区!
 
我还是觉得最大化意义不大,Office97及以前的版本是MDI的,<br>但Office2000已经改成SDI了,你的程序又怎么样?
 
To quaver:<br>&nbsp; 下面是你的代码,我不明白的是,你为什么在 SetDocWinMax 里面还调用 GetWindow(hwnd,GW_CHILD) 呢?<br>回调函数得到的已经是子窗口的句柄了,正好是你所要的,再 GetWindow(hWnd,GW_CHILD) 就会得到文档窗<br>口的句柄,你说 Word 文档窗口充满整个用户区,也许正是这个原因。<br><br>BOOL CALLBACK EnumChildProc(<br>&nbsp; &nbsp; HWND hwnd, // &lt;font color = #ff0000&gt;&lt;strong&gt;handle to child window&lt;/font&gt;&lt;/strong&gt;<br>&nbsp; &nbsp; LPARAM lParam // application-defined value<br>&nbsp; &nbsp;);<br>function SetDocWinMax(hwnd:THandle;Param:Integer):Boolean;stdcall;<br>var<br>&nbsp; ClassName:array[0..255] of char;<br>begin<br>&nbsp; GetClassName(hwnd,ClassName,SizeOf(ClassName)); &nbsp;//hwnd:Word 窗口句柄<br>&nbsp; if (Pos('_WwB',StrPas(@ClassName))&gt;0) then<br>&nbsp; &nbsp; if &lt;font color = #ff0000&gt;&lt;strong&gt;GetWindow(hwnd,GW_CHILD)&lt;/font&gt;&lt;/strong&gt;&gt;0 then // 有必要吗?<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result:=true;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>end;<br>&nbsp;
 
quaver:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。<br>
 
接受答案了.
 
后退
顶部