我编写了一堆在线资源,让我来到这里。希望我所拥有的是亲密的。不幸的是我没有Windows编程经验。我来自Linux背景。我也是Lua的alien的新手,但我对Lua很了解。
我想要做的是从sendMessage()
向Win32 API
窗口发送一个带有Notepad.exe
的简单“Hello World”。
我使用以下命令从命令提示符处获取了进程ID:
tasklist /FI "IMAGENAME eq notepad.exe" /FI "USERNAME eq user"
我收到了从here发送0x000C代码的消息。
到目前为止,这就是我所拥有的:
require "luarocks.require"
require "alien"
myTestMessage = 0x000C -- Notepad "Set text" id
notepadPID = 2316 -- Notepad Process ID
-- Prototype the SendMessage function from User32.dll
local SendMessage= alien.User32.SendMessageA
SendMessage:types{ret ='long', abi = 'stdcall','long','long','string','string'}
-- Prototype the FindWindowExA function from User32.dll
local FindWindowEx = alien.User32.FindWindowExA
FindWindowEx:types{ret = 'long', abi = 'stdcall', 'long', 'long', 'string', 'string'}
-- Prototype the GetWindowThreadProcessID function from User32.dll
local GetWindowThreadProcessId = alien.User32.GetWindowThreadProcessId
GetWindowThreadProcessId:types{ret = 'long', abi = 'stdcall', 'long', 'pointer'}
local buffer = alien.buffer(4) -- This creates a 4-byte buffer
local threadID = GetWindowThreadProcessId(notepadPID, buffer) -- this fills threadID and our 4-byte buffer
local longFromBuffer = buffer:get(1, 'long') -- this tells that I want x bytes forming a 'long' value and starting at the first byte of the
-- 'buffer' to be in 'longFromBuffer' variable and let its type be 'long'
local handle = FindWindowEx(threadID, "0", "Edit", nil); -- Get the handle to send the message to
local x = SendMessage(handle, myTestMessage, "0", "Hello World!") -- Actually send the message
很多代码都是从Lua alien documents,msdn和一些Google搜索(namely this result)拼凑而成的。
那里有谁可以成为英雄并向我解释我做错了什么,以及我应该如何解决这个问题。而且,最重要的是,为什么!
答案 0 :(得分:1)
您滥用GetWindowThreadProcessId()和FindWindowEx()。它们的第一个参数是所需窗口的HWND句柄,但是您将进程ID传递给GetWindowThreadProcessId(),并将线程ID传递给FindWindowEx(),这两个都是错误的。
从进程ID获取HWND没有直接的方法。您必须使用EnumWindows()循环遍历当前运行的窗口,在每个窗口上调用GetWindowThreadProcessId(),直到找到与您已有的匹配的进程ID为止。
答案 1 :(得分:1)
我最终使用Windows API中的FindWindow和FindWindowEX找到了一种更简单的方法。这样,您就可以找到记事本的父进程和子进程的正确句柄。
-- Require luarocks and alien which are necessray for calling Windows functions
require "luarocks.require"
require "alien"
local SendMessage= alien.User32.SendMessageA
SendMessage:types{ret ='long', abi = 'stdcall','long','long','string','string'}
local FindWindowEx = alien.User32.FindWindowExA
FindWindowEx:types{ret = 'long', abi = 'stdcall', 'long', 'long', 'string', 'string'}
local FindWindow = alien.User32.FindWindowA
FindWindow:types{ret = 'long', abi = 'stdcall', 'string', 'string'}
local notepadHandle = FindWindow("Notepad", NULL )
local childHandle = FindWindowEx(notepadHandle, "0", "Edit", nil)
local x = SendMessage(childHandle, "0x000C", "0", "Hello World!") -- Actually send the message