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)
GetWindowThreadProcessId接收窗口句柄作为输入.您正在传递一个完全不同的过程句柄.当然这会导致失败.随后对SetFocus,SetForegroundWindow,PostMessage和SetWindowPos的调用也犯了同样的错误.
使用EnumWindows或FindWindow来获取记事本窗口句柄.
AttachThreadInput使用线程ID进行操作.您试图将句柄传递给该函数,并且在64位进程中句柄为64位宽,并且线程ID仍为32位宽.当然,AttachThreadInput在64位下运行良好.这里要学习的教训是,演员表示编程错误.如果需要将参数转换为适当的类型,那么通常这意味着您将错误的东西传递给函数.避免铸造.
| 归档时间: |
|
| 查看次数: |
2896 次 |
| 最近记录: |