簡體   English   中英

在SetWindowPos()中獲取跨線程操作無效

[英]Getting Cross-thread operation not valid in SetWindowPos()

我試圖從一個不同的線程訪問一個表單到創建表單的表單,最后得到一個錯誤:

跨線程操作無效

碼:

public static void MakeTopMost(Form form)
{
    SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}

我正在傳遞一個在另一個線程中運行的表單。 我試過測試InvokeRequired ,但它總是假的。

我是線程新手。

確保您正在為InvokeRequired測試正確的對象:

public static void MakeTopMost(Form form)
{
    if (form.InvokeRequired)
    {
        form.Invoke((Action)delegate { MakeTopMost(form); });
        return;
    }

    SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}

我喜歡用這樣的擴展方法包裝所有這些:

public static class SynchronizeInvokeUtil
{
    public static void SafeInvoke(this ISynchroniseInvoke sync, Action action)
    {
        if (sync.InvokeRequired)
            sync.Invoke(action);
        else
            action();
    }

    public static void SafeBeginInvoke(this ISynchroniseInvoke sync, 
                                       Action action)
    {
        if (sync.InvokeRequired)
            sync.BeginInvoke(action);
        else
            action();
    }
}

然后你可以打電話:

form.SafeInvoke(() => SetWindowPos(form.Handle, HWND_TOPMOST, 
                                   0, 0, 0, 0, TOPMOST_FLAGS));

這可能是最具可讀性的。

請注意,如果您在表單類本身中使用它,則必須使用this.SafeInvoke(...)才能訪問擴展方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM