c# winform在win10裡彈出無焦點的視窗
wangmy1988
有個專案需要在右下角彈出廣告視窗,但是又不能影響使用者的使用,視窗不能有焦點。
在網上搜了一堆,都是以下的**,在form中新增一段樣式。
protected override createparams createparams
}
當前用的是win10系統,怎麼嘗試都不行,沒有任何效果,依舊焦點被彈出的視窗擷取了。
然後網上又找到了一段**,是利用系統的api,先獲取之前的啟用的視窗,彈出新視窗了再重置之前視窗為啟用,這樣的話還是會影響之前的操作,不夠完美。
//引用系統api
[dllimport("user32.dll")]
public static extern intptr getactivewindow();
[dllimport("user32.dll")]
public static extern intptr setactivewindow(intptr hwnd);
private adform mf = null;
private void button_click(object sender, eventargs e)
setactivewindow(activeform); //在把焦點還給之前的活動窗體
}
多次嘗試後得到乙個結果,必須給窗體新增ws_child樣式才能生效。最終**如下
protected override createparams createparams
}
有些視窗天生就是為了輔助其它程式而使用的,典型的如「輸入法視窗」。這些視窗不希望搶奪其它視窗的焦點。
有 win32 方法來解決這樣的問題,ws_ex_noactivate
便是關鍵。
具體來說,是給視窗樣式中額外新增乙個ws_ex_noactivate
位。
var handle = getthewindowhandle();
int exstyle = getwindowlong(handle, gwl_exstyle);
setwindowlong(handle, gwl_exstyle, exstyle | ws_ex_noactivate);
當然,這裡需要用到 p/invoke 平台呼叫,可以閱讀 使用 pinvoke.net visual studio extension 輔助編寫 win32 函式簽名 了解快速生成平台呼叫方法簽名的方法。
於是,我們將完整的視窗**寫完,是下面這樣。
注意 64 位系統中需呼叫getwindowlongptr
和setwindowlongptr
,而 32 位系統中是沒有這兩個方法的;在任何版本的 windows 中都是這樣。當然,64 位系統會為其上執行的 32 位程序模擬 32 位系統的環境。
using system;
using system.runtime.interopservices;
using system.windows;
using system.windows.interop;
namespace walterlv.demo
private void onsourceinitialized(object sender, eventargs e)
#region native methods
private const int ws_ex_noactivate = 0x08000000;
private const int gwl_exstyle = -20;
public static intptr getwindowlong(intptr hwnd, int nindex)
public static intptr setwindowlong(intptr hwnd, int nindex, intptr dwnewlong)
[dllimport("user32.dll", entrypoint = "getwindowlong")]
private static extern intptr getwindowlong32(intptr hwnd, int nindex);
[dllimport("user32.dll", entrypoint = "getwindowlongptr")]
private static extern intptr getwindowlong64(intptr hwnd, int nindex);
[dllimport("user32.dll", entrypoint = "setwindowlong")]
private static extern intptr setwindowlong32(intptr hwnd, int nindex, intptr dwnewlong);
[dllimport("user32.dll", entrypoint = "setwindowlongptr")]
private static extern intptr setwindowlong64(intptr hwnd, int nindex, intptr dwnewlong);
#endregion}}
執行這段**,可以發現,即時我們的視窗中文字框獲得了焦點,焦點其實依然在外面的程式中。(我們的文字框依然不會響應鍵盤輸入的。)
不是變數 win10 在win10下安裝manim
manim是製作簡單動畫的乙個python庫,具體介紹請參考 3b1b manim github.com 例如 無論是windows或者是其它作業系統使用者的安裝方式,在鏈結中有詳細說明。下面詳細說明一下安裝步驟,重點放在win10使用者可能遇到的問題上。anaconda,texlive,ffmpe...
win10的錄音機在什麼位置?win10怎麼錄音?
自從系統更新到win10,電腦上許多功能都找不到了,前天想使用錄音機的時候,卻發現找不到了,讓我一番苦找,終於找到了,想到大家都會遇到這種情況,就告訴大家怎麼找吧!首先,點選電腦桌面左下角的 開始 然後輸入 voice recorder,這不找到了嗎?點選開啟,然後點選中間的那個按鈕 開始錄音 然後...
在win10下安裝Octave
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...