句柄操作窗体_winform让窗体一直显示在桌面上以及FindWindow
想寫個程序在電腦桌面上一直顯示,類似一個小貼士,提示自己要做的事情等。遇到了技術難題就是怎樣把窗體固定在桌面上,經過長時間的搜索和嘗試,終于達到了想要的效果,其中涉及到windowsAPI的使用。
先貼上最后的代碼:
private void Form1_Load(object sender, EventArgs e)
{
Rectangle ScreenArea = Screen.GetBounds(this);
int width = Convert.ToInt32(ScreenArea.Width * 0.7);
int height = Convert.ToInt32(ScreenArea.Height * 0.1);
//MessageBox.Show(width.ToString()+";"+height.ToString());
this.Location = new Point(width, height);
//SetToDeskTop();
SetParent(this.Handle.ToInt32(), FindWindowW("Progman", null));
}
//API
[DllImport("user32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(int hWndChild, int hWndNewParent);
[DllImport("user32.dll", EntryPoint = "FindWindowW")]
public static extern int FindWindowW(string lpClassName, string lpWindowName);
windows提供了操作窗體的API,SetParent函數可以改變某個子窗口的父窗口,通過它,我們可以實現讓一個窗體一直顯示在桌面上,因為桌面本身也是一個窗體。下面是函數的聲明:
[DllImport("user32.dll", EntryPoint="SetParent")]
public static extern int SetParent (int hWndChild,int hWndNewParent);
第一個參數是要處理的窗體的句柄,也就是我們要編寫的應用程序,第二個參數也是一個窗體句柄,就是你要把編寫的這個程序放到哪個窗體上,就是哪個窗體的句柄。也就是說,我們只需要提供兩個參數就可以了,那么,第一個參數很好提供,this.Handle.ToInt32()即可,但是第二個參數需要我們獲得桌面窗口的句柄,windowsAPI也提供了查找窗口句柄的函數:FindWindow
FindWindow函數聲明:
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
第一個參數是窗體類名,第二個參數是窗體名稱,也就是應用程序窗體名稱,兩者都寫或者寫一個都行,一般以第一個參數類名最好找到窗體,第二個參數就寫null。然后我們在窗體的load事件中這樣寫就可以了:
SetParent(this.Handle.ToInt32(), FindWindow("Progman", null));誰知道一運行窗體消失了,看不見。
于是又上網查找一番,終于找到了原因:FindWindow函數有三個版本,其余兩個是FindWindowA和FindWindowW。有什么區別呢?這里引用網上用戶的回答:
這類函數通常都有至少一個字符串參數,A的接受char*,W的接受wchar_t*,因為編碼不同所以函數內部對字符串參數的處理也不同,不過也僅在處理字符串上有區別,函數行為上沒有任何區別。
以前版本WINDOWS的A版本函數實現是將char*轉成wchar_t*,再調用W版本函數,所以用A版本會產生額外的調用及轉換開銷,而新版本的WINDOWS是將A/W分開實現的,不存在這種問題了。
至于FindWindow這個沒有任何A/W后綴的"函數",它其實是個宏,根據項目配置的默認字符集,來define成相應的FindWindowA或FindWindowW。
也就是說,它們三個函數實現的功能是一樣的,只不過是對參數的處理不同,編者的win10家庭版系統使用FindWindow函數和FindWindowA函數都是隱藏的,只有FindWindowW函數是正常使用。
本文系小博客網站原創,轉載請注明文章鏈接地址
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的句柄操作窗体_winform让窗体一直显示在桌面上以及FindWindow的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第4天:调用样式表
- 下一篇: 线面要素类相互转换-原创