2013-06-04 2 views
0

Я собрал множество онлайн-ресурсов, которые привели меня сюда. Надеюсь, что у меня есть близко. К сожалению, у меня нет опыта программирования на Windows. Я родом из Linux. Я также новичок в alien для Lua, но я знаю Lua достаточно хорошо.Lua Alien - SendMessage to Notepad.exe с WinAPI

Что я хочу сделать, это отправить простой «Hello World» с sendMessage() из Win32 API в бегущее окно Notepad.exe.

Я получил идентификатор процесса из командной строки с помощью следующей команды:

tasklist /FI "IMAGENAME eq notepad.exe" /FI "USERNAME eq user" 

notepad PID

И я получил сообщение, чтобы отправить код из 0x000C из here.

До сих пор это то, что у меня есть:

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).

Есть ли кто-нибудь, кто мог бы стать героем и объяснить мне, что я делаю неправильно, и как я должен это делать. И, самое главное, почему!

ответ

1

Вы неправильно используете GetWindowThreadProcessId() и FindWindowEx(). Первый параметр для обоих из них - это дескриптор HWND для нужного окна, но вы передаете идентификатор процесса GetWindowThreadProcessId() и идентификатор потока в FindWindowEx(), оба из которых неверны.

Существует нет простого способа получить HWND из идентификатора процесса. Вам нужно будет использовать EnumWindows() для прокрутки текущих запущенных окон, вызывая GetWindowThreadProcessId() на каждом из них, пока не найдете соответствующий идентификатор процесса к тому, который у вас уже есть.

0

В итоге я нашел более простой способ сделать это, используя как FindWindow, так и FindWindowEX из Windows API. Таким образом, вы можете найти правильные ручки для родительских и дочерних процессов Блокнота.

-- 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 
Смежные вопросы