为什么SetWindowLong函数只能在FormCreate事件中起作用,如何让她在Button1Click事件中起作用?(50分)

  • 主题发起人 主题发起人 梦之旅
  • 开始时间 开始时间

梦之旅

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么SetWindowLong函数只能在FormCreate事件中起作用,如何让她在Button1Click事件中起作用?
 
procedure TForm1.Button1Click(Sender: TObject);//透明<br>begin<br>&nbsp; SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_LAYERED);<br>&nbsp; SetLayeredWindowAttributes(Self.Handle, 0, 128, 2);<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);//恢复<br>begin<br>&nbsp; SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_LAYERED);<br>&nbsp; SetLayeredWindowAttributes(Self.Handle, 1, 0, 1);<br>end;
 
to szhcracker,<br>您的方法只能对WS_EX_LAYERED 起作用 ,不能对其他起作用 如 WS_DISABLED 就不起作用
 
to e-<br>&nbsp; 您的方法也不行 对 WS_DISABLED 不起作用
 
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW ); &nbsp; //隐藏在任务栏上的图标<br>这一句只能FormCreate中起作用<br>如何如何让她在Button1Click事件中起作用?
 
如何让 SetWindowLong(Handle, GWL_EXSTYLE, WS_DISABLED); &nbsp;在按钮事件中起作用?
 
你加上这么2句试试:<br>Form1.Hide;<br>Form1.Show;
 
to :szhcracker,<br>倒是可以 但是闪啊<br>Visible := False ;<br>Visible := True ; 也行<br>你试试 系统里面的 屏幕键盘 就不闪
 
希望能有不闪的方法
 
再增加100分~~~~~~~~~~~~~~~~~~~·
 
你试试用API函数:LockWindowUpdate,禁止在作处理时对窗体或控件的刷新,等完成后再刷新,或者先 DisableAlign ,切换以后再 EnableAlign 看看能否有效。<br><br>如果不行,用以下的方法再试试:<br>更新前用SendMessage(Handle, WM_SETREDRAW, 0, 0);<br>更新后用SendMessage(Handle, WM_SETREDRAW, 1, 0);
 
to szhcracker,<br>您提供的方法都试过了 也不行<br>不过我发现了一个 让 &nbsp;SetWindowLong(Handle, GWL_EXSTYLE, WS_DISABLED); &nbsp; 生效的方法,就是让窗体失去焦点到上一次失去焦点的程序 ,这样就生效了<br>但是 <br>sendmessage(handle, WM_KILLFOCUS, 0, 0);<br>SetForegroundWindow(GetWindow(Handle, GW_HWNDLAST));<br>都不能让窗体失去焦点到上一次失去焦点的程序(主要问题是到上一次失去焦点的程序)<br>望您能解答这个问题
 
你试一下下面的代码:<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; Form1.Perform(WM_SETREDRAW, 0, 0);<br>&nbsp; Form1.Hide;<br>&nbsp; SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_DISABLED);<br><br>&nbsp; with TForm1.Create(Self) do<br>&nbsp; try<br>&nbsp; &nbsp; ShowModal;<br>&nbsp; finally<br>&nbsp; &nbsp; Free;<br>&nbsp; end;<br>end;<br><br>procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>&nbsp; Halt;<br>end;<br>我觉得你可以考虑用别的思路来解决这个问题,为什么一定要用按钮触发呢?写在OnCreate事件中不可以吗?
 
to szhcracker, <br>因为我要 经常 在 WS_DISABLED 这种状态 和正常状态之间切换~~~<br>并不是 WS_DISABLED 这种状态就固定了。<br>所以烦请您能把设置非焦点的问题解决也好啊~
 
我在最新的代码里加了一句以防止窗体闪烁。
 
Visible := False;<br>&nbsp; &nbsp; SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_DISABLED) ;<br>&nbsp; &nbsp; Perform(WM_SETREDRAW, 0, 0);<br>&nbsp; &nbsp; Visible := True;<br>我是这样用的 不过还是闪<br>这一句Perform(WM_SETREDRAW, 0, 0);放在其他位置 ,程序死掉
 
你是不是要控制这个窗体的所有控件的Enabled属性在False与True之间切换啊?如果是,可以用以下的方法:<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; i: Integer;<br>begin<br>&nbsp; for i := 0 to ControlCount - 1 do<br>&nbsp; &nbsp; if Controls.Name &lt;&gt; 'Button1' then<br>&nbsp; &nbsp; &nbsp; Controls.Enabled := False;<br>end;<br>这样,除了Button1以外的控件都不可用。<br>Perform(WM_SETREDRAW, 0, 0);这句使用时一定要指定控件。
 
试了一下你的代码,如果把程序最小化后再恢复(或者在任务栏上点击)后是否会有问题?
 
不是<br>我的意思是:<br>解决 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_DISABLED) ; &nbsp;不生效的问题(生效后标题栏是灰色的)<br>1.<br>&nbsp; Visible := False;<br>&nbsp; &nbsp; SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_DISABLED) ;<br>&nbsp; &nbsp; Visible := True;<br>这种可以,但缺点是晃眼··<br>2. &nbsp; &nbsp;SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_DISABLED) ;<br>&nbsp; &nbsp; 转移程序的焦点到上一个程序(这个程序就是最小化本程序后激活的程序) ,但一句代码不知道怎么写 。<br>&nbsp;第二种方法好用,但是不知道代码怎么写?
 
后退
顶部