C Winform在win10裡彈出無焦點的視窗

2021-10-04 23:14:34 字數 2813 閱讀 6593

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 位系統中需呼叫getwindowlongptrsetwindowlongptr,而 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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...