我必须编写一个监视事件的Windows服务应用程序(没有GUI),如果它发生,将向应用程序发送标准的Windows消息.应用程序的句柄将由DLL释放给服务,然后卸载,因此Windows消息是我们希望使用的方式.
但问题是服务是否需要做任何特殊的事情才能将SendMessage用于窗口句柄,因为它可能位于不同的屏幕上或Vista中.这是可能的,如果可以的话,我该怎么办?
我有当前的代码:
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As HandleRef, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
End Function
Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Public Function WindowHandle(ByVal sTitle As String) As Long
WindowHandle = …Run Code Online (Sandbox Code Playgroud) 我在 C# 中使用 PInvoke,尝试使用已知处理程序读取窗口中可见的工具提示,但是我尝试以这种方式检查的窗口应用程序因内存访问冲突错误而崩溃,或者根本不显示工具提示文本lpszText TOOLINFO 成员。
我正在使用回调调用EnumWindows,然后向该函数中的工具提示窗口发送一条消息:
public delegate bool CallBackPtr(IntPtr hwnd, IntPtr lParam);
static void Main(string[] args)
{
callBackPtr = new CallBackPtr(Report);
IntPtr hWnd = WindowFromPoint(<mouse coordinates point>);
if (hWnd != IntPtr.Zero)
{
Console.Out.WriteLine("Window with handle " + hWnd +
" and class name " +
getWindowClassName(hWnd));
EnumWindows(callBackPtr, hWnd);
Console.Out.WriteLine();
}
public static bool Report(IntPtr hWnd, IntPtr lParam)
{
String windowClassName = getWindowClassName(hWnd);
if (windowClassName.Contains("tool") &&
GetParent(hWnd) == lParam)
{
string szToolText = new string(' ', 250); …Run Code Online (Sandbox Code Playgroud) 是否有可能发送键没有一个程序SendMessage和PostMessageAPI?
我对各种声明SendMessage感到困惑.我怎么知道哪一个是正确的?
在我的c#winforms应用程序(Windows 7)中,我使用以下内容;
public class NativeMethods
{
[DllImport("user32.dll")]
// Currently uses
public static extern int SendMessage(IntPtr hWnd, uint wMsg, int wParam, int lParam);
// Think I should probably be using
// public static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);
}
Run Code Online (Sandbox Code Playgroud)
但是调用SendMessage的代码是
NativeMethods.SendMessage(this.tv.Handle, 277, 1, 0);
Run Code Online (Sandbox Code Playgroud)
我如何确定要使用的参数,以便我可以切换到另一个声明?
这是我的代码:
$this->view->assign('mail', $mail);
$mg = new Mailgun($this->getMailgunAPIKey());
$domain = "sandbox1111.mailgun.org";
$res = $mg->sendMessage($domain, array('from' => 'bob@sandbox3445.mailgun.org',
'to' => 'mee@xxxxx.com',
'subject' => $mail->getSubject(),
'text' => $mail->getBody()));
var_dump( $res);
Run Code Online (Sandbox Code Playgroud)
这是 var_dump 打印出来的内容:
object(stdClass)#228 (2) { ["http_response_body"]=> object(stdClass)#223 (2) { ["message"]=> string(18) "Queued. Thank you." ["id"]=> string(52) "<20131211155824.31559.48115@sandbox1111.mailgun.org>" } ["http_response_code"]=> int(200) }
Run Code Online (Sandbox Code Playgroud)
我尝试过var_dump( json_decode($res));,但打印出 NULL。例如,如何访问 [“http_response_code”]?
回答:
var_dump( $res);
echo __LINE__.'<br/><br/>';
var_dump( $res->http_response_body );
echo __LINE__.$res->http_response_code.'<br/><br/>';
echo $res->http_response_body->message.'<br/><br/>';
Run Code Online (Sandbox Code Playgroud)
印刷
object(stdClass)#228 (2) { ["http_response_body"]=> object(stdClass)#223 (2) { ["message"]=> string(18) "Queued. Thank you." …Run Code Online (Sandbox Code Playgroud) 我的Windows应用程序有一个标签界面.每个选项卡都会呈现一些UI内容.众所周知,如果我在主线程中进行非常耗时的for循环而不让其他人处理任何Windows消息,那么应用程序将被冻结.在冻结期间,我无法切换标签.
我受到了谷歌Chrome的多进程架构的启发.我尝试使用SetParent到嵌入过程到另一个过程.更具体一点:流程A是主人.它可以创建无限的工作流程.每个工作进程都有自己的消息循环.如果进程B被冻结,则不应冻结进程A和任何其他工作进程.
其实我错了:如果我点击按钮工作进程B在主线程中不间断地执行大量UI工作,不仅会阻止进程B的UI,还会阻止进程A的UI,直到我的测试代码结束.
有人可以分享一些灯吗?
我正在尝试通过以下方式向所有窗口发送消息:
PostMessage( HWND_BROADCAST, 0x0401, 0, 0 );
or
SendMessage( HWND_BROADCAST, 0x0401, 0, 0 );
Run Code Online (Sandbox Code Playgroud)
问题是,没有窗口收到此消息。Windows 有自己的线程。问题是...如何向我的应用程序中的所有窗口发送消息,或者为什么此功能不起作用...
提前致谢。
我想从子窗口(CDialog)向父窗口(CFormview)发送消息。如果我按下子窗口上的取消按钮,对话框应该退出,程序应该继续执行父窗口上的停止按钮的代码。
void ChildDialog::OnBnClickedCancel()
{
CDTParentView *pButtonWnd = (CDTParentView *)AfxGetMainWnd();
pButtonWnd->OnBnClickedbuttonStop();
CDialogEx::OnCancel();
}
Run Code Online (Sandbox Code Playgroud)
但是这个objore.cpp中有一个错误:
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
ENSURE(this != NULL);
// it better be in valid memory, at least for CObject size
ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
// simple SI case
CRuntimeClass* pClassThis = GetRuntimeClass(); <------- error
ENSURE(pClassThis);
return pClassThis->IsDerivedFrom(pClass);
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我,有什么问题吗?也许发布一个更好的想法来发送按钮单击的消息?
我正在使用OverlapSphere来检测对象的某个半径内的所有碰撞器.然后我过滤掉了一些我不在乎的东西.剩下的几个,我尝试向这些对象发送消息以更新其渲染颜色.每当它发送消息时,团结就会冻结.我试着做一些研究,我能找到的最好的东西是无限循环可以冻结它.但我认为没有潜力.这是代码:
发送消息的对象:
void sendmyMessage(bool status)
{
Collider[] tiles = Physics.OverlapSphere(gameObject.transform.position, 10);
int i = 0;
while (i < tiles.Length)
{
if(tiles[i].tag == "Tile")
{
//turn light on
if (status == true)
{
tiles[i].SendMessage("Highlight", true);
i++;
}
//turn light off
if (status == false)
{
tiles[i].SendMessage("Highlight", false);
i++;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对象接收消息:
void Highlight(bool status)
{
//turn light on
if(status == true)
{
gameObject.GetComponent<Renderer>().material.color = new Color(0, 0, 0);
}
//turn light off
if(status == false)
{
gameObject.GetComponent<Renderer>().material.color = new …Run Code Online (Sandbox Code Playgroud)