C - win32:AttachThreadInput和SetFocus,64位:没有头绪

Joh*_*ohn 8 c 64-bit winapi setfocus

我已经评论了我所知道的大部分内容.我非常有信心在AttachThreadInput上出现问题.我认为它只能在32位下运行.相信我,如果我能自己解决这个问题,我会很乐意的.我阅读了Windows中事件的完整文档(这里),我没有更接近解决方案.如果你有任何想法,我很乐意听到他们.

#include <stdio.h>
#include <windows.h>

int main()
{
    //Structure prereqs for CreateProcess
    STARTUPINFO         siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;
    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo);

    if(CreateProcess("c:\\windows\\notepad.exe", "", 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)
    {
        GetLastError();
    }
    Sleep(1000);

    //Target thread, I can't seem to get this to return anything !0
    DWORD dwTargetThread = GetWindowThreadProcessId(piProcessInfo.hProcess,NULL);
    //For example:
    //if(dwTargetThread == 0) return -1;

    //Print debugging info
    if (GetCurrentThreadId() == dwTargetThread) return -1; else printf("\nMy thread: %u\n\npiProcessInfo.hThread: %u\n\nDWORD dwTargetThread: %u\n\nunsigned int dwTargetThread: %u", GetCurrentThreadId(), piProcessInfo.hThread,dwTargetThread, GetWindowThreadProcessId(piProcessInfo.hProcess,NULL));

    //I've tried using piProcessInfo.hThread for AttachTo but I can't cast it to a DWORD as it's 64bit
    AttachThreadInput(GetCurrentThreadId(),dwTargetThread,TRUE);
    printf("\n\nAttached...\n");
    Sleep(1000);

    //Set the focus & bring to foreground
    SetFocus(piProcessInfo.hProcess);
    printf("Focus set...\n");
    Sleep(1000);
    SetForegroundWindow(piProcessInfo.hProcess);
    printf("Brought to foreground...\n");
    Sleep(1000);

    //I know I shouldn't use PostMessage for keyboard input but it's just for the example
    PostMessage(piProcessInfo.hProcess, WM_CHAR,  'g', 0);
    printf("Message queued\n");

    //No better than SetForegroundWindow:
    //SetWindowPos(piProcessInfo.hProcess, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

GetWindowThreadProcessId接收窗口句柄作为输入.您正在传递一个完全不同的过程句柄.当然这会导致失败.随后对SetFocus,SetForegroundWindow,PostMessage和SetWindowPos的调用也犯了同样的错误.

使用EnumWindows或FindWindow来获取记事本窗口句柄.

AttachThreadInput使用线程ID进行操作.您试图将句柄传递给该函数,并且在64位进程中句柄为64位宽,并且线程ID仍为32位宽.当然,AttachThreadInput在64位下运行良好.这里要学习的教训是,演员表示编程错误.如果需要将参数转换为适当的类型,那么通常这意味着您将错误的东西传递给函数.避免铸造.