我遇到了 WebGLInput 的非常奇怪的行为。我有一个使用 WebGL Unity 构建的网站。默认情况下,WebGL 会捕获所有键盘输入。但是,我必须在 html 中使用输入字段。
所以首先我禁用 WebGLInput 并且它可以工作:
private void Start()
{
#if !UNITY_EDITOR && UNITY_WEBGL
WebGLInput.captureAllKeyboardInput = false;
#endif
}
Run Code Online (Sandbox Code Playgroud)
然后使用下面的函数向 unity 发送一条消息来切换键盘输入。它首先会启用它,但不会禁用它!
document.addEventListener('click', function(e) {
if (e.target.id == "#canvas") {
this.FocusCanvas("1");
} else {
this.FocusCanvas("0");
}
}.bind(this), false);
Run Code Online (Sandbox Code Playgroud)
这是我用来切换 WebGLInput 的统一代码:
public void FocusCanvas(string focus)
{
#if !UNITY_EDITOR && UNITY_WEBGL
if (focus == "0") {
WebGLInput.captureAllKeyboardInput = false;
} else {
WebGLInput.captureAllKeyboardInput = true;
}
#endif
}
Run Code Online (Sandbox Code Playgroud)
我尽可能地调试了它,并且我非常确定该方法已被触发并且所有内容都已执行。但禁用 captureAllKeyboardInput 不起作用。有人遇到过这样的问题吗?如果是这样,请告诉我我做错了什么?
嘿,我在这里有这个代码:
Call SendMessage(dtPicker.Handle, CB_SHOWDROPDOWN, True, 0&)
Run Code Online (Sandbox Code Playgroud)
这在组合框上运行良好,但在DateTimePicker框中似乎不起作用.
可能是什么问题呢?
谢谢!
大卫
我正试图在我的应用程序中获取文本字段的状态.但是我没有让它发挥作用.我正在使用"SendMessage"获取"WM_GETTEXT",我将内容保存为char*.
我将char*输出到一个文件,但我只返回"D".这就是我现在拥有的:
LRESULT result;
char * output = (char*)malloc(1024);
result = SendMessage(hwnd,WM_GETTEXT,1024,(LPARAM)output);
ofstream file("test.txt");
file << *output;
file.close();
delete [] output;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用标准SendMessageW() 方法从控制台应用程序取消静音.但是,我们有自己的应用程序作为shell运行,而不是explorer.exe.当我试图取消静音时,没有任何反应; 但是一旦我启动资源管理器它就可以了.是否必须运行资源管理器才能发送消息?
码:
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
SendMessageW(Process.GetCurrentProcess().MainWindowHandle, WM_APPCOMMAND, Process.GetCurrentProcess().MainWindowHandle, (IntPtr)APPCOMMAND_VOLUME_MUTE);
Run Code Online (Sandbox Code Playgroud)
返回值为SendMessageW()0.
如果需要资源管理器,是否有人知道另一种取消静音方法?
Side Note
我刚刚尝试使用vbs:
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys(chr(&hAD))
Run Code Online (Sandbox Code Playgroud)
并得到了相同的结果.只有在explorer.exe运行时才取消静音.
我想将"{TAB}"密钥发送到另一个应用程序窗口(将密钥发送到窗口而不是文本框).
我试过了:
SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)
Run Code Online (Sandbox Code Playgroud)
没啥事儿.
我的目标是:
当应用程序窗口不在焦点时,
将tab键发送到我的应用程序或其他应用程序.
(我知道sendkey不专业,在这种情况下没有选择(这是我第一次使用它).)
我做了很多尝试,我总是回到同样的结果:
没啥事儿.
有人知道答案吗?
所以,我正在尝试捕获一个包含2个文本框的窗口,并向这两个文本框发送一些文本.但是两个文本框都没有标题和相同的类名"编辑".到目前为止,我所能做的就是捕获第一个文本框,就是这样.
贴在下面是我的代码.
Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form1
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, _
ByVal lpsz2 …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个类,当它将被释放时,它应该向整个应用程序传播一个自定义消息.我做到了PostMessage,它只有几个错误
PostMessage(Application.Handle, UM_MYMESSAGE, 0, 0);
Run Code Online (Sandbox Code Playgroud)
然后我意识到它应该是同步的 - 通过SendMessage.
SendMessage(Application.Handle, UM_MYMESSAGE, 0, 0);
Run Code Online (Sandbox Code Playgroud)
在我的表单上,我使用TApplicationEvents组件处理消息,但只是切换SendMessage到PostMessage没有使它处理消息
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = UM_MYMESSAGE then
begin
ShowMessage('Ok');
Handled := True;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果我通过表格处理但没有合作,它可以工作Application.Handle......我做错了什么?
我需要编写一个单击Windows的应用程序。
如何将左键单击发送到窗口所在的某个屏幕x / y坐标?
我想使用SendMessage / PostMessage将消息发送到另一个应用程序,但是当另一个应用程序以管理员身份运行时,它永远不会收到消息。如何在不以管理员身份运行“发送”应用程序的情况下克服此问题?
编辑:Remi的答案,接收器应用程序的代码
Const dummyValue = WM_USER + 71423;
Application.HookMainWindow(AppClass.AppHookFunc);
ChangeWindowMessageFilter(dummyValue, MSGFLT_ADD);
Type TAppClass = class
function AppHookFunc(var Message : TMessage): Boolean;
end;
Var AppClass: TAppClass;
function TAppClass.AppHookFunc(var Message : TMessage): Boolean;
begin
Result := False;
Case Message.Msg of
dummyValue: begin
// do stuff
//
Result := True;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud) 在C#中,此SendMessage函数成功提高了音量:
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
SendMessage(Handle, 0x319, (int)Handle, APPCOMMAND_VOLUME_UP);
Run Code Online (Sandbox Code Playgroud)
但是在C++中,这个SendMessage函数不起作用,即卷不会上升:
// HWND hwnd = CreateWindow(...
SetWindowText(hwnd, "Hi"); // Worked
SendMessage(hwnd, WM_APPCOMMAND, (int)hwnd, APPCOMMAND_VOLUME_UP); // Don't work
Run Code Online (Sandbox Code Playgroud)
我错了什么?你能帮我解决一下吗?谢谢!
完整代码:
#include <windows.h>
HHOOK _hhook;
HWND hwnd;
HINSTANCE _hInstance;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_KEYDOWN)
{
// lParam is the pointer to the struct containing the data needed, so cast …Run Code Online (Sandbox Code Playgroud) sendmessage ×10
postmessage ×3
vb.net ×3
winapi ×3
c++ ×2
delphi ×2
api ×1
c# ×1
explorer ×1
findwindow ×1
findwindowex ×1
handle ×1
hwnd ×1
javascript ×1
unity-webgl ×1
visual-c++ ×1
windows ×1
winforms ×1