一般方案
#include <windows.h> int main(int argc, char *argv[]) { HWND hWnd = ::GetForegroundWindow(); ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE); return FALSE; }
终极方案
将当前线程附到新的置顶线程上,再置顶
#include <windows.h> // windows置顶窗体终极方案 BOOL OnForceShow(HWND hWnd) { HWND hForeWnd = NULL; DWORD dwForeID = 0; DWORD dwCurID = 0; hForeWnd = ::GetForegroundWindow(); dwCurID = ::GetCurrentThreadId(); dwForeID = ::GetWindowThreadProcessId(hForeWnd, NULL); ::AttachThreadInput(dwCurID, dwForeID, TRUE); ::ShowWindow(hWnd, SW_SHOWNORMAL); ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); ::SetForegroundWindow(hWnd); // 将前台窗口线程贴附到当前线程(也就是程序A中的调用线程) ::AttachThreadInput(dwCurID, dwForeID, FALSE); return TRUE; } int main(int argc, char *argv[]) { HWND hWnd = ::GetForegroundWindow(); if (OnForceShow(hWnd)) return TRUE; ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE); return FALSE; }