我有一个用C++编写的Windows控制台应用程序,想要隐藏/删除控制台窗口的完整标题栏,包括关闭,最小/最大控件等.我搜索了很多,但没有发现任何有用的东西.
我用GetConsoleWindow查询控制台HWND,并试图通过删除WS_CAPTION标志来改变使用SetWindowLong的控制台窗口样式,但这似乎完全没有效果:
HWND hwnd = GetConsoleWindow();
LONG style = GetWindowLong(hwnd, GWL_STYLE);
style &= ~(WS_BORDER|WS_CAPTION|WS_THICKFRAME);
SetWindowLong(hwnd, GWL_STYLE, style);
SetWindowPos( hwnd, NULL, 0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
|SWP_FRAMECHANGED );
Run Code Online (Sandbox Code Playgroud)
我也试过GetSystemMenu/RemoveMenu,但这似乎只是禁用像关闭按钮这样的控件.
首先,我必须承认我的编程技巧非常有限,我接手了一个(非常小的)现有的C++ OOP项目,我尝试将自己的东西推进去.不幸的是,我遇到的问题超出了我的知识范围.我希望在这里找到一些帮助.我正在使用第三方库(无法更改)从相机中抓取图像,并在此处使用一些占位符名称.
第三方库有一个函数"ThirdPartyGrab"来启动一个连续的实时抓取,并获取一个指向一个函数的指针,该函数将在每次新帧到达时被调用.所以在普通的C应用程序中它是这样的:
ThirdPartyGrab (HookFunction);
Run Code Online (Sandbox Code Playgroud)
"HookFunction"需要声明为:
long _stdcall HookFunction (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
或"BUF_HOOK_FUNCTION_PTR",声明为
typedef long (_stdcall *HOOK_FUNCTION_PTR) (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
现在我有一个C++应用程序和一个类"MyFrameGrabber",它应该封装我所做的一切.所以我将钩子函数作为私有成员放入这样的:
long _stdcall HookFunction (long, long, void*);
Run Code Online (Sandbox Code Playgroud)
在我班上还有一个公共无效函数"StartGrab",应该启动Grab.在里面我试着打电话:
ThirdPartyGrab (..., HookFunction, ...);
Run Code Online (Sandbox Code Playgroud)
(毫不奇怪)失败了.它说对MyFrameGrabber :: HookFunction的函数调用错过了参数列表,我应该尝试使用&MyFrameGrabber :: HookFunction来创建指针.但是,传递"&MyFrameGrabber :: HookFunction"会导致另一个错误,即无法将其转换为BUF_HOOK_FUNCTION_PTR.
通过阅读C++ FAQ函数指针后,我认为我理解了这个问题,但无法解决问题.我试图使钩子函数静态,但这也导致转换错误.我还想过把钩子函数放在类之外,但我需要在钩子函数中使用类函数.还有其他方式还是我需要改变我的整个概念?
编辑14.01.08:我测试了单例解决方法,因为我无法更改第三方库,并且void指针仅用于在钩子函数内使用的数据.不幸的是它并没有像我希望的那样开箱即用....我不知道静态函数是否需要在一个单独的类中,所以我把它放在我的"MyFrameGrabber"类中:
static MyFrameGrabber& instance()
{
static MyFrameGrabber _instance;
return _instance;
}
long Hook(long, long, void*); // Implementation is in a separate cpp file
Run Code Online (Sandbox Code Playgroud)
在我的cpp文件中,我有call_hook函数:
long MFTYPE call_hook(long x, MIL_ID y, void MPTYPE *z)
{
return MyFrameGrabber::instance().Hook(x,y,z);
} …
Run Code Online (Sandbox Code Playgroud) 我有一个JPEG"图像"(实际上是数据库中的BLOB),我想在内存中导入/转换为"位图"结构.原因是我使用的第三方库无法处理JPEG图像,我需要传递一个未压缩的位图(作为指针).到目前为止我发现的只是在磁盘上转换不同格式的方法,但首先将图像保存为位图并重新导入它将花费太长时间.
我对.NET知之甚少,但我认为System.Drawing.Bitmap应该能够保存未压缩的数据.我正在使用C#和Visual Studio 2008.
我有一个结构数组,它看起来像这样:
public struct DATA
{
public int number;
public int channel;
public string filename;
public string description;
}
DATA[] myData = new DATA[12];
Run Code Online (Sandbox Code Playgroud)
我需要在这里填写很多值,例如 myData[0] = {0, 1, "myfile", "TBD"} 等。
用数据填充这 12 个结构的最简单方法(就 LOC 而言)是什么?使用类会更容易吗?
我目前尝试使用Windows CreateFileMapping机制实现一些进程间通信.我知道我需要首先使用CreateFileMapping创建文件映射对象,然后使用MapViewOfFile创建指向实际数据的指针.然后,该示例使用CopyMemory将数据放入mapfile.
在我的应用程序中,我有一个图像缓冲区(1 MB大),我想发送到另一个进程.所以现在我查询指向图像的指针,然后将整个图像缓冲区复制到mapfile中.但我想知道这是否真的有必要.是不是可以只在共享内存中复制指向图像缓冲区数据的实际指针?我尝试了一下但没有成功.
我在C++中有一个简短的代码片段,我需要在C#中具有相同的功能:
typedef enum {eD=0x0, eV=0x1, eVO=0x2, eVC=0x3} eIM;
#define htonl(x) ( ( ( ( x ) & 0x000000ff ) << 24 ) | \
( ( ( x ) & 0x0000ff00 ) << 8 ) | \
( ( ( x ) & 0x00ff0000 ) >> 8 ) | \
( ( ( x ) & 0xff000000 ) >> 24 ) )
int value = htonl(eV);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不是大程序员,所以我需要一些帮助.