我正在设置一个低级鼠标钩子SetWindowsHookEx:
HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL,
&callback,
GetModuleHandle(NULL),
NULL);
Run Code Online (Sandbox Code Playgroud)
因为这是一个低级回调,它将在我自己的进程中执行; 没有执行DLL注入.
现在,我注意到回调有时(间接地)从标准API函数调用,例如GetAncestor,GetWindowRect等等.看起来这些可能会导致某些消息队列被刷新.
实际上,我的问题有三个......
什么叫回调?
可以从任何 API函数内部调用吗?我怎么说?
在什么线程上执行回调?
它只能在安装了挂钩的线程上运行,还是系统可以在任何线程上调用它?
为什么钩子首先被实现为回调?
(Raymond Chen在这里闲逛吗?)对于我来说,将钩子简单地实现为(发送)消息似乎更为明智,就像几乎所有其他Windows一样.对于消息,至少我知道哪个功能可能会导致待处理发送的消息将被处理(GetMessage,PeekMessage以及其他的少数),我会知道哪个线程它们被处理(即在第一时间接收到的消息的线程).
如果您要创建一个像twitter这样的应用程序,那么您将如何设计消息传递系统?
特别是寻找关于基本数据模型的想法,以及如何编写接收用户推文然后将其发送给所有关注者的方法?
例:
Tweets ( tweetID, userID, message, datesend)
User (userID, ...)
Followers(userID, followerUserID)
Inbox(userID, tweetID)
Run Code Online (Sandbox Code Playgroud)
上面的模型是一个很好的起点吗?
您是否先插入推文,然后将消息推送到队列中.然后一个接一个地从队列中取出一条消息并将消息推送给其订户?
(我忽略了twitter的移动功能,只关注基于Web的功能,但我想从一开始就使用队列,以便以后可以添加其他功能)
我正在处理一个巨大的 TSV(制表符分隔值)文件,并希望尽可能高效地执行此操作。为此,我想我会Vec通过在循环之前预先分配它来防止为每一行分配一个新的:
let mut line = String::new();
let mut fields = Vec::with_capacity(headers.len());
while reader.read_line(&mut line)? > 0 {
fields.extend(line.split('\t'));
// do something with fields
fields.clear();
}
Run Code Online (Sandbox Code Playgroud)
自然地,借用检查器不会被逗乐,因为我们正在覆盖line而fields可能仍然有引用:
error[E0502]: cannot borrow `line` as mutable because it is also borrowed as immutable
--> src/main.rs:66:28
|
66 | while reader.read_line(&mut line)? > 0 {
| ^^^^^^^^^ mutable borrow occurs here
67 | fields.extend(line.split('\t'));
| ------ ---- immutable borrow occurs here
| |
| immutable borrow later used …Run Code Online (Sandbox Code Playgroud) 我正在处理一个应用程序,在任何给定时间只能存在一个实例.有几种可能性来实现这一目标:
互斥选项在我看来是最可靠和优雅的.
但是,在我的第二个实例终止之前,我想向已经运行的实例发布一条消息.为此,我需要一个拥有互斥锁的线程(或进程)的句柄.
但是,似乎没有API函数来获取给定互斥锁的创建者/所有者.我只是俯视它吗?有没有其他方法来到这个线程/进程?还有另一种方法可以解决这个问题吗?
更新:这个人只是向所有正在运行的进程广播一条消息.我想这是可能的,但我真的不喜欢它......
我正在开发一个程序,可以动态创建JPEG图像的缩略图.现在我在想:由于JPEG图像是由8x8像素的块构建的(维基百科有一个很好的解释),是否有可能跳过部分解码?
假设我的缩略图至少比原始图像小8倍.然后,我们可以通过仅包括离散余弦变换的常数项,将输入文件中的每个8x8块映射到解码输出中的1个像素.大多数图像数据可以立即丢弃,无需处理.此外,内存使用量减少了64倍.
我不想从头开始实现这个; 这将很快需要一个星期.有没有可以做到这一点的代码?
如果不是,这是因为这种方法不值得,或者仅仅因为没有人想到它?
在Android上,我想创建一个包含其他一些视图的按钮.例如,像这样:
+---------------------------+
| Hello world! +-------+ |
| | image | |
| Some more info +-------+ |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)
但我希望它比这个具体的例子更灵活.理想情况下,按钮只能包含一个ViewGroup,这样我就可以在一个单独的XML文件中实现它的布局.但是,因为Button扩展了View,而不是ViewGroup,所以这似乎不可能.
有没有办法使用标准的Android组件实现这一点,还是我不得不求助于编写自定义按钮类?
根据要求,一些示例XML可以解决这个问题:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
android:clickable="true"
android:background="@android:drawable/btn_default">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/primary_text_light"/>
<TextView
android:id="@+id/additional_line_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/primary_text_light"/>
<TextView
android:id="@+id/additional_line_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/primary_text_light"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我必须明确地在TextViews上设置颜色,否则它们几乎不可读(默认情况下它们是白色的).我从SDK中挖出了标识符:.../platforms/android-7/data/res/values/public.xml.奇怪的是,primary_text_light给出了黑色文本,而primary_text_dark结果是白色......
我正试图在世界空间中找到相机的焦距,位置和方向.
因为我需要这是与分辨率无关的,我归我的图像坐标,以在范围[-1, 1]为x,和一个稍小范围y(取决于纵横比).(0, 0)图像的中心也是如此.我已经纠正了镜头失真(使用k1和k2系数),所以这不会进入图片,除了有时投掷x或y稍微超出[-1, 1]范围.
作为给定,我在已知尺寸的世界空间中具有平面的固定矩形(以毫米为单位).保证矩形的四个角可见,并在图像中手动标记.例如:
std::vector<cv::Point3f> worldPoints = {
cv::Point3f(0, 0, 0),
cv::Point3f(2000, 0, 0),
cv::Point3f(0, 3000, 0),
cv::Point3f(2000, 3000, 0),
};
std::vector<cv::Point2f> imagePoints = {
cv::Point2f(-0.958707, -0.219624),
cv::Point2f(-1.22234, 0.577061),
cv::Point2f(0.0837469, -0.1783),
cv::Point2f(0.205473, 0.428184),
};
Run Code Online (Sandbox Code Playgroud)
实际上,我认为我试图解决的等式是(参见OpenCV文档中的等价物):
/ xi \ / fx 0 \ / tx \ / Xi \
s | yi | = | …Run Code Online (Sandbox Code Playgroud) My HTML5 game has some background music that uses Howler.js in "html5" mode, which apparently triggers Chrome for Android's media playback notifications. This means a notification appears while the user has my game open in any tab:
The game is a good citizen and pauses the music while the tab is not in focus, so there is no need for this notification. It's even actively confusing, because the user can pause and resume the game's background music without being …
我正在开发一个需要在各种投影仪上运行的 Qt 应用程序(部署到 Qt 5.11,但我正在 Qt 5.14 上进行测试)。这些投影仪中至少有一台报告的物理尺寸超过一米,这导致向 Linux 操作系统报告的分辨率仅为 32.5 dpi(与默认值 96 dpi 相比)。此设置对我们的 Qt 应用程序的影响是所有文本都变得难以阅读:
它可以通过运行在任何系统上复制
xrandr --dpi 32.5
Run Code Online (Sandbox Code Playgroud)
在启动应用程序之前。
我们可以不同地配置系统 dpi,但有理由不这样做:这个 dpi 实际上是在正确的范围内(它甚至太高),我们可能想在其他应用程序中使用它,客户可能会使用自己的投影仪,这可能会损坏我们的手动配置。
这个特定用例的安全方法是假装我们仍然生活在石器时代:忽略系统 dpi 设置,只使用设备无关像素和设备像素之间的 1:1 映射。在高DPI显示文档说:
Qt::AA_DisableHighDpiScalingQt 5.6 中引入的application 属性关闭所有缩放。这适用于需要实际窗口系统坐标的应用程序,而不管环境变量如何。此属性优先于Qt::AA_EnableHighDpiScaling。
所以我将其添加为第一行main(在QApplication创建之前):
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
然而,它似乎没有效果;文字仍然小得无法阅读。我还尝试了以下各种组合:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, false);
QCoreApplication::setAttribute(Qt::AA_Use96Dpi);
Run Code Online (Sandbox Code Playgroud)
没有任何可见的效果效果。
什么做的工作是设置QT_AUTO_SCREEN_SCALE_FACTOR=1在环境中。如果我理解正确,这将启用缩放而不是禁用它,但将其设置为0不起作用!
同样,如果我在这样的代码中启用 Qt::AA_EnableHighDpiScaling,一切都变得可读:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
在某种程度上也有效的是硬编码字体大小(在这里找到):
QFont font = qApp->font();
font.setPixelSize(11);
qApp->setFont(font);
Run Code Online (Sandbox Code Playgroud)
然而,布局中的边距似乎仍然被缩放,因此这会导致布局非常狭窄(尽管可用)。
QT_FONT_DPI=96在环境中设置也有效(这个变量似乎没有记录,但它至少在 Qt 5.11 和 …
我正在编写一个以全屏横向模式运行的Android游戏,并在窗口的左下角和右下角放置了按钮.问题是其中一个按钮是(在许多手机上)菜单按钮旁边,因此播放器可能会意外按下菜单.
如果短暂按下,我只需暂停游戏并显示游戏内菜单.没问题.
但如果按下按钮的时间更长,Android会打开屏幕下半部分的软键盘.由于它阻碍了,并且在此Activity中完全没用,我想禁用它.
我尝试了以下方法.
由于我只有一个视图(a GLSurfaceView)我在我的尝试中Activity.onCreate():
InputMethodManager imm = ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE));
imm.hideSoftInputFromInputMethod(glSurfaceView.getApplicationWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)
它不起作用:菜单长按时软键盘仍然出现.
我把它添加到我的清单中:
<activity
android:windowSoftInputMode="stateAlwaysHidden"
>
Run Code Online (Sandbox Code Playgroud)
还有很多东西.
那么......还有办法吗?怎么样?