C 中WinForm的TopMost無效的解決辦法

2022-02-17 00:28:59 字數 1551 閱讀 5953

今天要寫乙個簡單的螢幕尺子,需要在最上層,結果發現topmost無論如何都不起作用了

查了下,各種辦法試盡,最後還是不好用

沒辦法,以前寫mfc的時候,要把視窗置為最頂層,是用setwindowpos系統api的,在c#中這招還靈麼

匯入函式後,一試,果然有效——有時候,治怪病還得靠api啊

1.先要匯入api

[dllimport("user32", entrypoint = "setwindowpos")]

public static extern bool setwindowpos(intptr hwnd, intptr hwndlnsertafter, int x, int y, int cx, int cy, int flags);

2.在需要的地方呼叫

//第乙個引數表示要移動哪個窗體,傳入視窗控制代碼

//第二個引數表示怎麼個移動法,-1就是移動到最頂層,具體值可以看msdn的api定義

//第三到六個引數不解釋

//最後乙個引數,可以設定移動時改變哪些值,0就是位置和大小都改變,具體請查詢msdn

setwindowpos(handle, new intptr(-1), left, top, width, height, 0);

順便記下使用api做的滑鼠穿透的效果,即視窗正常顯示,但是在視窗上點選時則視窗彷彿不存在一樣

[dllimport("user32.dll", entrypoint = "getwindowlong")]

public static extern long getwindowlong(intptr hwnd, int nindex);

[dllimport("user32.dll", entrypoint = "setwindowlong")]

public static extern long setwindowlong(intptr hwnd, int nindex, long dwnewlong);

[dllimport("user32", entrypoint = "setlayeredwindowattributes")]

public static extern int setlayeredwindowattributes(intptr handle, int crkey, byte balpha, int dwflags);

const int gwl_exstyle = -20;

const int ws_ex_transparent = 0x20;

const int ws_ex_layered = 0x80000;

const int lwa_alpha = 2;

2.呼叫開啟滑鼠穿透(其實就是設定一下窗體屬性)

setwindowlong(handle, gwl_exstyle, getwindowlong(handle, gwl_exstyle) | ws_ex_transparent | ws_ex_layered);

setlayeredwindowattributes(handle, 0, 128, lwa_alpha);

c 讀取excel中的資料(winform)

1 開啟選擇檔案對話方塊 1 string path 2 system.windows.forms.openfiledialog fd new openfiledialog 3 fd.title 選擇檔案 選擇框名稱 4 fd.filter xls files xls xls 選擇檔案的型別為xls...

C 中WinForm程式退出方法

1.this.close 只是關閉當前視窗,若不是主窗體的話,是無法退出程式的,另外若有託管執行緒 非主線程 也無法乾淨地退出 4.system.environment.exit 0 這是最徹底的退出方式,不管什麼執行緒都被強制退出,把程式結束的很乾淨。下面看一些例項 當我開啟乙個子窗體,進行某項操...

C 中WinForm窗體事件的執行次序

c 中winform窗體事件的執行次序如下 當 windows form 應用程式啟動時,會以下列順序引發主要表單的啟動事件 system.windows.forms.control.handlecreated system.windows.forms.control.bindingcontextc...