我目前正在为Microsoft Outlook开发C#.NET加载项. 加载项的目标是从Outlook即时搜索中捕获搜索输入,并在自定义窗格中显示我自己的搜索结果.
它运行得很好,并且通过使用本机窗口将Outlook窗口子类化,我得到了搜索字符串,它已经将它传递到我的面板中.
现在的问题是,当您关闭加载项时(通过" 文件 - >选项 - >加载项 - > COM加载项 ",而不是窗格中的X),加载项立即终止我不能searchboxWindow.ReleaseHandle()事先打电话 来恢复我的WndProc链.Outlook只是崩溃而没有任何明显的错误.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch ((uint)m.Msg)
{
case WindowMessages.WM_DESTROY:
case WindowMessages.WM_QUIT:
case WindowMessages.WM_NCDESTROY:
this.ReleaseHandle();
return;
case WindowMessages.WM_KEYUP:
case WindowMessages.WM_LBUTTONDOWN:
case WindowMessages.WM_RBUTTONDOWN:
OnKeyUp();
break;
case WindowMessages.WM_EXITSIZEMOVE:
OnResize();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试收听一些应该在加载项关闭时调用的窗口消息,但这些消息仅在我以正常方式关闭Outlook时出现.
此外,主外接源文件中的事件,如AppDomain.CurrentDomain.ProcessExit,this.Shutdown或((Outlook.ApplicationEvents_10_Event)this.Application).Quit不会被调用.
当加载项终止时,我可以听到什么事件(可靠地)被触发?有一些吗?如果没有,我有什么替代方案来解决我的问题?
我尝试了test-libstdc ++演示,并且喜欢我可以从控制台启动它,并且无需运行完整的Android应用程序.
我想创建一个opengl上下文,这样我就可以在控制台内执行我的opengl es 2.0应用程序,而不会有太多麻烦.
任何想法如何从不使用本机活动或任何东西的NDK应用程序中初始化EGL,即它甚至不打包在.APKK文件中,只是将main方法打包为可执行的linux文件.
非常感谢!
ANativeWindow_acquire在*android/native_window.h`中有任何机会吗?
谢谢!
我有一个关于创建SurfaceView并随后从中获取ANativeWindow的问题.
mSurfaceView = new SurfaceView(this);:onCreate()onStart()问的理由:据我所知,当我们失去焦点时,SurfaceView会被破坏(其他东西会掩盖整个屏幕),所以每当我们获得焦点时我们都需要重新创建它(onStart()被执行).或者SurfaceView是否保持休眠状态并可重复使用?
继续,现在我想从上面提到的表面(在本机代码中)创建一个本机窗口.这样做是否合适ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface):
onSurfaceCreated_native(..., jobject surface)onSurfaceChanged_native(..., jobject surface)询问的原因:onSurfaceChanged似乎总是被调用,onSurfaceCreated因此我们可以选择何时创建本机窗口.一方面,这样做似乎合乎逻辑onSurfaceCreated,但两者jobject surface似乎引用了不同的对象!(通过在onSurfaceCreated中创建一个弱的全局引用以及在onSurfaceChanged中对NULL和surface进行检查来检查,请参阅下面的代码)
onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}
onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {
if (env->IsSameObject(surface, myWeakObjectGlobal)) {
LOGW("onSurfaceChanged_native: new surface is SAME as old surface");
} else {
LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface");
}
if (env->IsSameObject(NULL, myWeakObjectGlobal)) {
LOGW(" furthermore, old surface is …Run Code Online (Sandbox Code Playgroud) 我的应用程序旨在几乎完全通过Windows 7任务栏项目使用缩略图和跳转列表.我知道我可以很容易地创建一个Form并简单地隐藏它,但这看起来有点矫枉过正.另外,我想NativeWindow尽可能多地玩弄,因为我之前从未使用它.
从本质上讲,我有一个被称为RootWindow派生的类NativeWindow,它将处理热键,希望其他一切.我根本不需要一个可见的窗口,只是处理窗口消息并提供一个任务栏项目,我可以附加缩略图和跳转列表.
CreateParams我需要传递一些特殊选项CreateHandle吗?还是我运气不好?
编辑:嗯,它比我想象的要容易,虽然它不是我想要的.一旦我NativeWindow将ShowWindowAPI 的句柄传递给API,就会出现任务栏项.但是,它还会在屏幕的左上角显示一个窗口.有没有办法摆脱那个窗口,同时仍然显示任务栏项目?
public class RootWindow : NativeWindow {
public const int SW_SHOWNOACTIVATE = 4;
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hWnd, short cmdShow);
public RootWindow() {
CreateHandle(new CreateParams());
ShowWindow(this.Handle, SW_SHOWNOACTIVATE);
}
}
Run Code Online (Sandbox Code Playgroud) 你如何找出系统chrome的大小,以便我可以指定窗口大小来达到我想要的舞台大小?
如果我的主窗口设置为800 x 600(阶段),并且我创建了如下的第二个窗口,它将更小.
public function Main():void
{
var windowOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
windowOptions.systemChrome = NativeWindowSystemChrome.STANDARD;
windowOptions.type = NativeWindowType.NORMAL;
var newWindow:NativeWindow = new NativeWindow( windowOptions );
newWindow.width = 800;
newWindow.height = 600;
newWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
newWindow.stage.align = StageAlign.TOP_LEFT;
newWindow.activate();
}
Run Code Online (Sandbox Code Playgroud)
我假设你增加两者newWindow.width = 800;并newWindow.height = 600;考虑到铬,但你如何找到这个值?
在我的AIR应用程序中,当用户创建一个新项目时,我想要一个弹出框出现在他们可以输入项目名称的位置.我理解这是如何通过制作我自己的弹出框类型,但是在那里使用NativeWindows做到这一点的方法?也就是说,我可以使用包含文本字段和按钮的系统镶边来制作窗口吗?
我在FlashDevelop中使用Flex 4和AIR 2.7.
nativewindow ×6
air ×2
android ×2
c# ×2
.net ×1
android-ndk ×1
flash ×1
opengl-es ×1
outlook ×1
stage ×1
surfaceview ×1
taskbar ×1
windows-7 ×1
wndproc ×1