隐藏一个WinForm和从DLL

问题描述:

在我的DDL带回来,我已经定义了以下功能:隐藏一个WinForm和从DLL

extern "C" __declspec(dllexport) void hideme(HWND h) { 
    //ShowWindow(h, SW_HIDE); 
    SendMessage(h, WM_SHOWWINDOW, FALSE, 0); 
} 

正如你所看到的,我已经试过许多东西得到这个工作...

我有它在我的winform声明如下:

typedef void (*HideMe)(HWND); 

在我的系统:视窗:形式:Form Load事件中,我有以下代码:

... 
HINSTANCE hinst = LoadLibrary(_T("My.dll")); 
if (hinst == NULL) 
    System::Diagnostics::Debug::WriteLine("null hinst"); 
else 
    hideme = (HideMe) GetProcAddress(hinst, "hideme"); 
... 

在我的系统:视窗:形式:形式显示的情况下,我有以下代码:

... 
hideme((HWND)this->Handle.ToPointer()); 
... 

我认为这个问题必须躺在我送过来的HWND的方式,但我我一直在寻找,并且找不到替代品。

我也试过设置this-> Visible = false;但后来我无法弄清楚如何从DLL中触发它可见(滥用sendmessage?)。

我不是一个C++程序员,我通常只在托管语言程序,所以任何帮助(和耐心表示赞赏。

感谢,

尼克。

NB

我无法解释一个奇怪的是,我不能从WinForm的调用自身的ShowWindow它会抛出了这个宝石。

Error 2 error LNK2028: unresolved token (0A00001E) "extern "C" int __stdcall ShowWindow(struct HWND__ *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall CheckMSNCpp::frmMain::frmMain_Shown(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 
Error 3 error LNK2019: unresolved external symbol "extern "C" int __stdcall ShowWindow(struct HWND__ *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "private: void __clrcall CheckMSNCpp::frmMain::frmMain_Shown(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 
Error 4 error LNK1120: 2 unresolved externals 

[EDIT1]

汉斯帕桑特说:

你 得到的ShowWindow()尝试

链接器错误消息也是一个 强烈暗示为什么你当前的代码 不工作。您忘记了添加错误 检查代码,GetProcAddress()可能会失败并返回一个NULL指针 。 它将以“hideme”名称将功能导出为 。在一个32位的 构建中,它将被导出为 “_hideme”,注意下划线。其中添加了 以指示 函数使用__cdecl调用 约定。在 的ShowWindow链接器错误表明C++的名字 装修,你忘了#包括 WINDOWS.H并提出了自己, 不正确,声明的ShowWindow。

这不是正确的方法, 您应该将可见 属性设置为false。就像你试过的。为什么 你不能把它设置为真正的 相当无法猜测。

由于几个原因,你说的话对我来说毫无意义。

1)

的WinForm的进口:

#include "stdafx.h" 
#include <windows.h> 
#include <iostream> 
#include <stdio.h> 

正如你所知道的,WINDOWS.H是在那里。

2)ShowWindor错误不在DLL中,我可以称它为好,它在WinForm代码中。

3)我从来没有导出ShowWindow,只是我自己的功能。

[/ EDIT1]

[EDIT2] 乌韦·凯姆说:

为什么你需要一个额外的DLL,它是 仅仅只是一个包装到另一个DLL 功能?

我会像在例如C#使用 PInvoke从您的托管C++ 应用程序。对于 SendMessage函数签名会(在C#):

的PInvoke的东西,只是没有任何意义,就像评论者说。

至于DLL,它需要是一个DLL,因为我需要一个全局钩子来响应我的热键& WH_CBT。在这种情况下,我希望程序开始隐藏&只是在按下组合键时显示设置屏幕。

程序中的所有内容都按预期工作,热键工作起来就像是一种魅力,我唯一无法理解的细节就是显示由DLL触发的应用程序。 [/ EDIT2]

[EDIT3] 示例代码为:http://www.nickkusters.com/CPP_PROBLEM_Demo-NOBIN.zip [/ EDIT3]

+1

这是很多层面上的奇怪。不需要直接win32来隐藏表单。在任何情况下都不需要DLL,可以使用Pinvoke。从托管的C++中,你可以直接调用win api。最后你不会发送这条消息,它会发送给你。再次阅读文档。在win api中隐藏窗口调用ShowWindow。 – 2011-05-28 14:51:16

+0

我很想这样做,但调用ShowWindow与此 - > Handle.ToPointer()不起作用。 – NKCSS 2011-05-28 17:02:29

+0

看起来我们无法帮到你。祝你好运。 – 2011-05-28 18:29:08

为什么你需要一个额外的DLL,它仅仅只是一个包装到另一个DLL中的函数?

我会像在例如C#由using PInvoke from your managed C++ application。对于SendMessage签名会(在C#):

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(
    IntPtr hWnd, 
    UInt32 Msg, 
    IntPtr wParam, 
    IntPtr lParam); 
+2

在C++/CLI程序中使用pinvoke几乎没有什么意义。 – 2011-05-28 14:47:32

+1

编辑我的帖子以添加您的评论和回复,以清楚说明。无法在评论中进行格式设置。 – NKCSS 2011-05-28 16:45:39

你在的ShowWindow()尝试了链接器错误消息也是为什么你当前的代码是不工作强烈暗示。您忘了添加错误检查代码,GetProcAddress()可能会失败并返回一个NULL指针。它会,该功能不会被“hideme”名称导出。在32位版本中,它将作为“_hideme”导出,请注意下划线。添加了哪个以指示函数使用__cdecl调用约定。 ShowWindow上的链接器错误演示了C++的名字装饰,你忘记了#include windows.h,并为ShowWindow组成了你自己的,不正确的声明。

这不是正确的做法,您应该将Visible属性设置为false。就像你试过的。为什么你不能把它设置回真实是不可想象的。

+0

编辑我的帖子以添加您的评论和回复以清楚。无法在评论中进行格式设置。 – NKCSS 2011-05-28 16:45:31

+0

非常规索赔需要非同寻常的证据。将源代码发布到文件共享服务或粘贴文件夹中。不需要DLL来实现热键,可以使用RegisterHotKey。即使是低级别的键盘钩子也可以,不需要DLL。当您在此页面右上方的搜索框中键入'registerhotkey'时,您会发现很多匹配。 – 2011-05-28 17:04:19

+0

为什么你觉得你需要改变设计?你根本没有解决这个问题。请解答所问的问题。 – NKCSS 2011-05-28 17:06:30