2

ここにたどり着いたオンライン リソースをまとめました。うまくいけば、私が持っているものは近いです。残念ながら、私は Windows プログラミングの経験がありません。私は Linux のバックグラウンドを持っています。私もLua のエイリアンは初めてですが、Lua のことは十分に知っています。

私がやりたいことは、単純な「Hello World」をsendMessage()からWin32 API実行中のNotepad.exeウィンドウに送信することです。

次のコマンドを使用して、コマンド プロンプトからプロセス ID を取得しました。

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

メモ帳 PID

そして、ここから 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 エイリアン ドキュメントmsdn、およびいくつかの Google 検索 (つまり、この結果) からまとめられたものです。

ヒーローになって、私が何を間違っているのか、どうすればいいのかを説明してくれる人はいますか? そして、最も重要なのは、その理由です。

4

2 に答える 2

2

最終的に、Windows API のFindWindowFindWindowEXの両方を使用して、これを行う簡単な方法を見つけました。このようにして、メモ帳の親プロセスと子プロセスへの正しいハンドルを見つけることができます。

-- 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
于 2014-03-05T14:56:15.613 に答える