在本程序运行之前的焦点窗口怎么得不到,之后运行的可以取得焦点窗口?问题在哪里?#include <windows.h>void Act(HWND hwnd)
{
/// 取当前焦点窗口
TCHAR buf[256];
HWND wnd = GetForegroundWindow();
if(IsWindow(wnd) and wnd!=hwnd)
{
DWORD idAttach = GetWindowThreadProcessId(wnd,NULL);
DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
AttachThreadInput(idAttach, idAttachTo, TRUE);
wnd = GetFocus(); /// ???抓取的窗口先启动,则wnd==hwnd
GetClassName(wnd, buf, 255);
if(wnd==NULL) MessageBox(wnd, TEXT("获取失败=NUll"), buf, MB_OK);
if(wnd==hwnd) MessageBox(wnd, TEXT("获取失败=hwnd"), buf, MB_OK);
if(wnd!=NULL && wnd!=hwnd) MessageBox(wnd, TEXT("当前焦点窗口"), buf, MB_OK);
AttachThreadInput(idAttach, idAttachTo, FALSE);
}
}LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl; wincl.hInstance = hThisInstance;
wincl.lpszClassName = TEXT("Windows Class");
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); if (!RegisterClassEx (&wincl)) return 0;
hwnd = CreateWindowEx (
WS_EX_TOPMOST|WS_EX_NOACTIVATE,
TEXT("Windows Class"),
TEXT("Windows App"),
WS_POPUP|WS_BORDER|WS_CAPTION|WS_SYSMENU,
10, 10, 160, 160,
NULL, NULL, hThisInstance, NULL);
ShowWindow (hwnd, nCmdShow);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
PostQuitMessage (0);
break;
case WM_LBUTTONDBLCLK:
Act(hwnd);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
{
/// 取当前焦点窗口
TCHAR buf[256];
HWND wnd = GetForegroundWindow();
if(IsWindow(wnd) and wnd!=hwnd)
{
DWORD idAttach = GetWindowThreadProcessId(wnd,NULL);
DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
AttachThreadInput(idAttach, idAttachTo, TRUE);
wnd = GetFocus(); /// ???抓取的窗口先启动,则wnd==hwnd
GetClassName(wnd, buf, 255);
if(wnd==NULL) MessageBox(wnd, TEXT("获取失败=NUll"), buf, MB_OK);
if(wnd==hwnd) MessageBox(wnd, TEXT("获取失败=hwnd"), buf, MB_OK);
if(wnd!=NULL && wnd!=hwnd) MessageBox(wnd, TEXT("当前焦点窗口"), buf, MB_OK);
AttachThreadInput(idAttach, idAttachTo, FALSE);
}
}LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl; wincl.hInstance = hThisInstance;
wincl.lpszClassName = TEXT("Windows Class");
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); if (!RegisterClassEx (&wincl)) return 0;
hwnd = CreateWindowEx (
WS_EX_TOPMOST|WS_EX_NOACTIVATE,
TEXT("Windows Class"),
TEXT("Windows App"),
WS_POPUP|WS_BORDER|WS_CAPTION|WS_SYSMENU,
10, 10, 160, 160,
NULL, NULL, hThisInstance, NULL);
ShowWindow (hwnd, nCmdShow);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
PostQuitMessage (0);
break;
case WM_LBUTTONDBLCLK:
Act(hwnd);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
不就是自己吗?
不是自己,应为WS_EX_TOPMOST|WS_EX_NOACTIVATE。比如我先运行本程序,再打开记事本,焦点在记事本输入框中,双击本程序窗口,可以取到记事本编辑框。
但是先运行记事本,再运行本程序,焦点也在记事本,双击本程序窗口,则得到的窗口句柄是本程序。先后运行为什么会不同?
改用GetGUIThreadInfo后正确了,谢谢void Act(HWND hwnd)
{
/// 取当前焦点窗口
TCHAR buf[256];
HWND wnd = GetForegroundWindow();
if(IsWindow(wnd) and wnd!=hwnd)
{
DWORD idAttach = GetWindowThreadProcessId(wnd,NULL);
DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL); /// test
GUITHREADINFO gi;
gi.cbSize = sizeof(GUITHREADINFO);
if ( !GetGUIThreadInfo(idAttach, &gi) )
MessageBox(wnd, "error", "", MB_OK);
wnd = gi.hwndFocus; /// 正确了,感谢VisualEleven /*
AttachThreadInput(idAttach, idAttachTo, TRUE);
wnd = GetFocus(); /// ???抓取的窗口先启动,则wnd==hwnd
AttachThreadInput(idAttach, idAttachTo, FALSE);
*/ GetClassName(wnd, buf, 255);
if(wnd==NULL) MessageBox(wnd, TEXT("获取失败=NUll"), buf, MB_OK);
if(wnd==hwnd) MessageBox(wnd, TEXT("获取失败=hwnd"), buf, MB_OK);
if(wnd!=NULL && wnd!=hwnd) MessageBox(wnd, TEXT("当前焦点窗口"), buf, MB_OK);
}
}