当我尝试将文本从 RichTextBox 发送到 Notepad++ 时,它仅发送文本的第一个字母。因此,如果我在Send this to Notepad++Notepad++ 的文本框中显示的是S.
这是我的代码
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
private void button2_Click(object sender, EventArgs e)
{
Process[] notepads = Process.GetProcessesByName("notepad++");
if (notepads.Length == 0) return;
if (notepads[0] != null)
{
IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Scintilla", null);
SendMessage(child, 0x000C, 0, RichTextBox1.Text);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将鼠标右键单击发送到窗口指定的坐标。
我用2个代码测试过
代码1:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
public struct POINT
{
public int x;
public int y;
}
var client = Process.GetProcessesByName("client_dx");
var whandle = client.MainWindowHandle;
POINT point = new POINT();
point.x = 1836;
point.y = 325;
ScreenToClient(whandle, ref point);
int lparm = (point.x << 16) + point.y;
int lngResult = SendMessage(whandle, 0x0204, 0, lparm);
int lngResult2 = SendMessage(whandle, 0x0205, 0, lparm); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C#中的SendMessage在Notepad ++中检索文档文本.以下是我目前的代码.第一次调用SendMessage会正确返回文本的长度.对SendMessage的第二次调用不会将文本插入StringBuilder变量文本中.为什么不?
[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam);
var length = SendMessage(hWnd, 2183, 0,0);
var text = new StringBuilder(length +1);
SendMessage(hWnd, 2182, length + 1, text);
Run Code Online (Sandbox Code Playgroud) 我正在尝试修改特定组合框的选择.我已成功检索到句柄.但是,当我调用下面的函数时,我无法正确修改组合框选择:
r = SendMessage(cbox, CBN_SELCHANGE, 2, 0);
Run Code Online (Sandbox Code Playgroud)
什么是最简单的方法来完成我想做的事情?提前致谢.
此处的文档似乎很糟糕:http://code.google.com/chrome/extensions/messaging.html
我想要我的内容脚本,只需要在页面上有textarea时显示pageIcon.
我的content.js(使用jquery)执行此操作:
$('textarea').each(function() {
chrome.extension.sendMessage({greeting: "hello"}, function(response) {
console.log(response);
});
});
Run Code Online (Sandbox Code Playgroud)
然后我的background.js有这个:
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
chrome.pageAction.show(sender.tab.id);
}
});
Run Code Online (Sandbox Code Playgroud)
哪个应该非常简单.如果有textarea,请显示图标.
我已尝试过示例代码中的各种变体,但没有任何作用.我得到的只是:
端口错误:无法建立连接.接收端不存在.
在控制台中.
我出错的任何想法?
javascript google-chrome sendmessage google-chrome-extension
我正在研究提取元数据的chrome扩展程序。解析元数据的代码包含在内容脚本中。background.js和content.js通过sendMessage请求和响应进行通信。我遇到了sendMessage请求具有异步性质的问题,并且不确定如何解决(即使在阅读了有关该问题的讨论之后也是如此)。任何建议或指示,将不胜感激。我怀疑我没有得到如何将它们转换为回调。
background.js:
function onContextClick(info, tab) {
if( info["selectionText"] ){
var x = getMeta(tab);
//do stuff with x
}
}
function getMeta (tab) {
chrome.tabs.sendMessage(tab.id, {fetchTag: "meta,name,author,content"}, function(response) {
//alert(response.data);
//one thing I tired was to put my "do stuff" embedded here, but that didn't work either
return response.data;
});
}
var menu_id = chrome.contextMenus.create({"title": "Get Meta", "contexts":["selection"], "onclick": onContextClick});
Run Code Online (Sandbox Code Playgroud)
content.js:
function fetchTag(string) {
var param = string.split(",");
return $(param[0] + "["+param[1]+ "=\"" + param[2] + "\"]").attr(param[3]);
}
chrome.extension.onMessage.addListener(
function(request, sender, …Run Code Online (Sandbox Code Playgroud) 要解决GenerateConsoleCtrlEvent的限制,我必须创建一个中间"中间人"进程来处理启动一些控制台应用程序.该进程的主要目的是在自身上调用GenerateConsoleCtrlEvent,导致自身和所有子进程干净地关闭以响应ctrl + break信号(而不是使用Process.Kill).这种需要源于GenerateConsoelCtrlEvent基本上没有效果,除非进程组id为零,这意味着它只对调用进程组本身有效.请参阅:https://stackoverflow.com/a/2431295/88409
所以无论如何...我已经创建了这个中间过程,它启动了一个在处理特定用户定义消息的表单上调用Application.Run的线程.
我的问题是......如何向这个进程发送消息来控制它?
我有Process对象及其进程ID,但这就是全部.Process.MainWindowHandle为零.
因此,我需要一种方法将消息发送到特定进程或将消息广播到特定进程中的所有窗口.
FindWindow不是一个选项,因为它试图在任何进程上按名称和类标识一个窗口,这是不可靠的.我想在没有歧义的情况下向特定进程发送消息.
首先是SendMessageTimeout的文档:http:
//msdn.microsoft.com/en-us/library/windows/desktop/ms644952%28v=vs.85%29.aspx
我有这个C++代码,我想将其转换为C#:
LRESULT success = SendMessageTimeout(
HWND_BROADCAST,
WM_SETTINGCHANGE,
0,
(LPARAM) "Environment",
SMTO_ABORTIFHUNG,
5000,
NULL
);
Run Code Online (Sandbox Code Playgroud)
我在C#做了什么:
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd,
uint Msg,
UIntPtr wParam,
IntPtr lParam,
uint fuFlags,
uint uTimeout,
out UIntPtr lpdwResult
);
SendMessageTimeout(
(IntPtr)0xFFFFFFFF, //HWND_BROADCAST
0x001A, //WM_SETTINGCHANGE
(UIntPtr)0,
(IntPtr)"Environment", // ERROR_1: can't convert string to IntPtr
0x0002, // SMTO_ABORTIFHUNG
5000,
out UIntPtr.Zero // ERROR_2: a static readonly field can not be passed ref or out …Run Code Online (Sandbox Code Playgroud) 我有问题,希望你能帮助我.已经离开了我的研究运气...试过stackoverflow,谷歌,甚至雅虎...
如何强制提示工具提示不使用鼠标?
我目前正在实现一些Windows自动化,需要强制显示工具提示.
像这样.通常你必须把鼠标放在那个栏上1到2秒钟.
我想强制使用WINAPI或类似的东西来显示这些工具提示.
想想像"SendMessage/Postmessage(hwnd,"WM_COMEOUTTOOLTIP",0,lParam(带x和y位置)").
WINAPI中是否存在类似的内容?谷歌疯了但没有发现任何东西.
谢谢大家帮助!
乔纳森
我在O'Reilly的"软件开发的并行方法"一书中读到了,
在第93页中有一些"消息传递"的例子.
1> Pid = self().
<0.30.0>
2> Pid ! hello.
hello
3> <0.30.0> ! hello.
* 1: syntax error before: '<'
Run Code Online (Sandbox Code Playgroud)
问题是我不明白为什么会出现语法错误,因为当我输入时1> Pid.
我会得到结果<0.30.0>,那么第2行和第3行之间的区别是什么(期望它是变量的事实)?
sendmessage ×10
c# ×5
.net ×2
winapi ×2
asynchronous ×1
c++ ×1
erlang ×1
javascript ×1
mouseover ×1
pid ×1
right-click ×1
scintilla ×1
tooltip ×1
winforms ×1