2016-08-17 64 views
1

所以,你可以做一个表格点进能...反向表单点击?

进口:

[DllImport("user32.dll", SetLastError = true)] 
static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

[DllImport("user32.dll")] 
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

代码:

int initialStyle = GetWindowLong(this.Handle, -20); 
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20); 

现在,我将如何去运行倒车后的效果代码一次?

我尝试这样做:

int initialStyle = GetWindowLong(this.Handle, -20); 
SetWindowLong(this.Handle, -20, initialStyle | 0x10000 | 0x10); 

但没有奏效。

在此先感谢!

+1

你如何期望用这些魔术常量理解代码? –

+1

'-20'是'GWL_EXSTYLE','0x80000'是'WS_EX_LAYERED','0x20'是'WS_EX_TRANSPARENT','0x10000'是'WS_EX_CONTROLPARENT','0x10'是'WS_EX_ACCEPTFILES'。 –

回答

4

作为另一个选项,您可以删除这些样式是这样的:

var style = GetWindowLong(this.Handle, -20); 
SetWindowLong(this.Handle, -20, style & ~(0x80000 | 0x20)); 

注意

的代码将使用这些常量更易理解:

const int GWL_EXSTYLE = -20; 
const int WS_EX_LAYERED = 0x80000; 
const int WS_EX_TRANSPARENT = 0x20; 
+0

请参阅David Hefferman对Xiaoy312的回答的评论。 OP需要首先理解他们的代码在做什么,然后才能理解你的代码。 – andlabs

+0

@andlabs我读了评论,并发布了包含OP正在使用的代码的原始答​​案的链接。希望它能帮助OP了解他们在做什么。 –

+0

@Nathan让我知道如果你有任何问题的答案:) –

3

为了将样式恢复到其初始的状态,您需要从第一个片段中将样式设置为值initialStyle

您不能只是简单地在样式上添加更多标志并期望它恢复正常。


public class Example 
{ 
    private int _initialStyle = 0; 

    public void ApplyStyle() 
    { 
     _initialStyle = GetWindowLong(...); 
     SetWindowLong(..., _initialStyle | /* styles */); 
    } 

    public void RestoreStyle() 
    { 
     SetWindowLong(..., _initialStyle); 
    } 
} 
+0

你能告诉我一个你的意思吗? – Nathan

+0

您似乎没有理解您的代码。你从某处复制过吗?将样式设置为initialSyle不能简单。如果你无法理解它,那么复制更多的代码不会帮助你。你必须寻求理解。 –

+3

@DavidHeffernan看起来代码取自[这里](http://stackoverflow.com/a/2798294/3110834) –