我正在尝试自动化第三方 Win32 应用程序,我想在定义的时间间隔捕获特定窗口的图形内容。我处于此的早期阶段,我目前正在尝试通过 C#使用Microsoft UI 自动化API 来完成客户端应用程序和外部应用程序之间的大部分交互。我现在可以让外部应用程序执行我希望它执行的操作,但现在我想从似乎是第三方所有者绘制的控件的特定窗口中捕获图形。我怎样才能做到这一点?我要捕获的窗口是此图像中红色矩形标记的窗口:
我有一个这样的实现,但它依赖于外部应用程序的 UI 位于顶部,这对我来说并不能保证,所以我更愿意找到更通用的东西。
var p = Process.Start("c:\myapp.exe");
var mainForm = AutomationElement.FromHandle(p.MainWindowHandle);
// "workspace" below is the window whose content I want to capture.
var workspace = mainForm.FindFirst(TreeScope.Descendents,
new PropertyCondition(AutomationElement.ClassNameProperty, "AfxFrameOrView70u"));
var rect = (Rect) workspace.GetCurrentPropertyValue(AutomationElement.BoundingRectangleProperty);
using (var bmp = new Bitmap((int)rect.Width, (int)rect.Height))
{
using (var g = Graphics.FromImage(bmp))
{
g.CopyFromScreen((int)rect.Left, (int)rect.Top, 0, 0, new Size((int)rect.Width, (int)rect.Height));
bmp.Save(@"c:\screenshot.png", ImageFormat.Png);
}
}
Run Code Online (Sandbox Code Playgroud)
当自动化应用程序在顶部时,上面的工作足够好,但它只是盲目地复制矩形中的屏幕,所以我的代码受机器上运行的任何东西的支配,并可能覆盖我的应用程序的窗口。
我已经阅读了一些将WM_PRINT消息发送到窗口的建议。几个月前的这个问题/答案似乎很有希望,但是当我使用此代码时,我只得到一个白色矩形,其中没有控件的实际内容。
var prop = (int)workspace.GetCurrentPropertyValue(AutomationElement.NativeWindowHandleProperty);
var …Run Code Online (Sandbox Code Playgroud) 试图为我澄清win32api.只是举了一个简单的例子.获取记事本窗口,将鼠标移动到位置单击并写入字符串.但它不起作用.什么问题?并且任何人都可以澄清我的lParam参数吗?做了什么?它是哪种类型的?看起来怎么样?:) 提前致谢.
import win32api, win32con, win32gui, win32ui, win32service, os, time
def f_click(pycwnd):
x=300
y=300
lParam = y <<15 | x
pycwnd.SendMessage(win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam);
pycwnd.SendMessage(win32con.WM_LBUTTONUP, 0, lParam);
def get_whndl():
whndl = win32gui.FindWindowEx(0, 0, None, 'NB.txt - Notepad')
return whndl
def make_pycwnd(hwnd):
PyCWnd = win32ui.CreateWindowFromHandle(hwnd)
return PyCWnd
def send_input_hax(pycwnd, msg):
f_click(pycwnd)
for c in msg:
if c == "\n":
pycwnd.SendMessage(win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
pycwnd.SendMessage(win32con.WM_KEYUP, win32con.VK_RETURN, 0)
else:
pycwnd.SendMessage(win32con.WM_CHAR, ord(c), 0)
pycwnd.UpdateWindow()
whndl = get_whndl()
pycwnd = make_pycwnd(whndl)
msg = "It works !\n"
send_input_hax(pycwnd,msg)
Run Code Online (Sandbox Code Playgroud) 我一直试图让我的脚本使用Skype4Py库向Skype中的群组对话发送消息,我目前能够发送消息的唯一方法是特定用户.
import Skype4Py
Skype = Skype4Py.Skype()
Skype.Attach()
Skype.SendMessage('namehere','testmessage')
Run Code Online (Sandbox Code Playgroud)
有谁知道如何更改我的代码以向群组对话发送消息?
我已经设法将文本发送到我使用 C++ 创建的自定义文本框,以及使用 1 个窗口和 1 个文本框的记事本、计算和其他程序。但是,我想将文本发送到另一个具有多个文本框并且也在选项卡中的程序。它的结构如下:
我尝试过 winspy++,但没有成功,这是我一直在使用的简单代码。
#include <windows.h>
int main()
{
HWND hNote;
HWND hChild;
if (!(hNote=FindWindow("windowname",NULL)))
exit(1);
if (!(hChild=FindWindowEx(hNote,NULL,"EDIT",NULL)))
exit(2);
SendMessage(hChild,WM_SETTEXT,NULL,(LPARAM)"texttoadd");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题?
我有一个大约 20 秒后结束的操作。为了避免冻结,我想创建一个线程并每秒更新其中的标签文本。我查了很多,因为每个人都有不同的意见,我无法决定使用哪种方法。
我试过 SendMessage 并且它有效,但有些人认为使用 SendMessage 不安全,我应该改用 PostMessage。但 PostMessage 失败ERROR_MESSAGE_SYNC_ONLY(1159)。
char text[20] = "test text";
SendMessage(label_hwnd, WM_SETTEXT, NULL, text);
Run Code Online (Sandbox Code Playgroud)
我搜索了这个,我认为这是因为在 PostMessage 中使用了不允许的指针。这就是它失败的原因。
所以我该怎么做?我糊涂了。你有什么建议?此方法是否适用于更改其他线程中的 UI 元素?
谢谢
我用来发送两个独立进程的数据,但它失败了.它只在相同的过程下工作......这是概念.
// ------------------------------------------------ -----------------------------------
MainApps
// ------------ -------------------------------------------------- ---------------------
Type
PMyrec = ^TMyrec;
TMyrec = Record
name : string;
add : string;
age : integer;
end;
:OnButtonSend
var aData : PMyrec;
begin
new(aData);
aData.Name := 'MyName';
aData.Add := 'My Address';
aData.Age : 18;
SendMessage(FindWindow('SubApps'),WM_MyMessage,0,Integer(@aData));
end;
Run Code Online (Sandbox Code Playgroud)
// ------------------------------------------------ -----------------------------------
SubApps
// ------------ -------------------------------------------------- ---------------------
Type
PMyrec = ^TMyrec;
TMyrec = Record
name : string;
add : string;
age : integer;
end;
Run Code Online (Sandbox Code Playgroud)
:OnCaptureMessage
var
aData : PMyrec;
begin
aData := PMyrec(Msg.LParam);
showmessage(aData^.Name); …Run Code Online (Sandbox Code Playgroud) 嘿伙计们,我正在尝试向游戏发送消息(自动化文本命令),问题是我无法弄清楚如何使用spy ++中的信息来编写C#sendmessage函数.
我能够使用spy ++来获取
00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
任何人都可以提供这意味着什么的细分,以及如何在c#中将消息发送到游戏中?
编辑:我发现我正在查看错误的过程.我没有看javaw.exe,而是看着实际的游戏.这是按t的代码:
<00919> 0038062A WM_INPUT nInputCode:RIM_INPUT hRawInput:189E0973
<00920> 0024052 P WM_KEYUP nVirtKey:'T' cRepeat:1 ScanCode:14fExtended:0fAltDown:0fRepeat:1fUp:1
Run Code Online (Sandbox Code Playgroud)
谢谢,
马克斯
我遇到了 SendMessageA(handle,WM_SETTEXT,0,(LPARAM)text); 如果在构造函数之外的任何其他地方使用它会导致崩溃。
MWC.h
#include <Windows.h>
#include <iostream>
#include <string>
class MWC{
private:
MSG msg;
public:
MWC();
~MWC();
int mLoop();
int mClose(UINT);
class System{
public:
System(){ }
~System(){ }
class Form{
public:
HWND handle; // Need to access it in order to create other controls
Form(char*,int,int,int,int);
Form(char*,int,int);
~Form(){ }
bool Show();
HWND ReturnHandle();
};
class TextBox{
protected:
HWND handle;
private:
int ID;
public:
TextBox(char* text,int width,int height,int x,int y,int id,Form* p);
TextBox(int width,int height,int x,int y,int id,Form* p);
~TextBox(){ } …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JNA (概述)在最小化时将消息发送到应用程序或不在顶部(例如鼠标单击),并且我发现人们正在使用com.sun.jna.platform.win32.User32.SendMessage A(hW,0x0201,0,0);
但我在这堂课中找不到这个功能.
如果我做错了,有人可以给我一个如何实现它的例子吗?
码:
User32 user32;
Pointer hW = user32.GetForegroundWindow().getPointer();
user32.SendMessageA( hW, 0x0201, 0, 0 );
Run Code Online (Sandbox Code Playgroud) 我在我的网站上有一个分享按钮,我想向Telegram APP联系人发送特定消息(当我在Mobile中打开网站时)
问题是我没有找到完整的代码,它只是在移动设备中打开APP
我的代码是:
<a href="tg://" id="telegram_share" class="mobileShare" title="inviteFriends" alt="telegram_share"></a>
Run Code Online (Sandbox Code Playgroud)
如你所见,我没有找到在href属性中发送消息的正确命令
例如,我找到了类似于添加贴纸的类似物:
<a class="tgme_action_button" href="tg://addstickers?set=Saber2">Add Stickers</a>
Run Code Online (Sandbox Code Playgroud)