我一直在研究使用C++以编程方式管理我的监视器的方法.
看起来像EnumDisplayDevices,EnumDisplaySettings和ChangeDisplaySettings之类的函数可用于例如改变各个显示设备的分辨率以及将所述设备连接到桌面或从桌面拆卸所述设备.
除了这些操作,我希望能够将我的桌面复制到多个监视器.
一个具体的例子是从桌面跨越两个设备的这种设置...
...到此设置,其中桌面被复制到所述设备.
我曾尝试在MSDN上调查API,并寻找类似的问题,但似乎无法找到任何关于这是否可行的指示.
是否可以使用C++将我的桌面复制到多个显示设备,如果是这样,怎么样?如果没有,是否可以通过其他方式进行,例如使用其他编程语言,或者我是否被迫使用Windows控制面板等选项来更改此类设置?
在Windows 10中,如何获得非活动标题文本的颜色?
在下面的示例中,当窗口处于非活动状态时,"Untitled - Notepad"为灰色:
但是当我尝试以下功能时,我得到的颜色是黑色的:
color = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
//color = black, wrong
HTHEME htheme = OpenThemeData(hwnd, L"WINDOW");
color = GetThemeSysColor(htheme, COLOR_INACTIVECAPTIONTEXT);
//color = black, wrong
GetThemeColor(htheme, WP_CAPTION, CS_INACTIVE, TMT_TEXTCOLOR, &color);
//color = black, wrong
Run Code Online (Sandbox Code Playgroud)
DrawThemeText并DrawThemeTextEx以黑色打印非活动标题.
所有这些功能在Windows 7中都能正常工作,因为非活动标题保持相同的颜色,只有Aero玻璃才会改变颜色.但它在Windows 10中并不相同.
代码分析:
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_HISTORY_TYPE,
&CAssignHistoryDlg::OnTcnSelchangeTabHistoryType)
Run Code Online (Sandbox Code Playgroud)
警告 C26454:
算术溢出:'-' 操作在编译时 (io.5) 产生负的无符号结果。
的定义TCN_SELCHANGE是:
#define TCN_FIRST (0U-550U)
#define TCN_SELCHANGE (TCN_FIRST - 1)
Run Code Online (Sandbox Code Playgroud)
我看不出我还能做什么!
据我了解,COLORREFVC++ 中定义的是一个 DWORD,它看起来像这样,0x00bbggrr其中bb, gg和rr是用于红色、绿色和蓝色的字节。微软的文档指出
高位字节必须为零。
然而在 .NET 中,它用于存储颜色的 alpha 值。我的问题是:
将我的 alpha 值存储在 COLORREF 的高字节中是否危险
以下是我发现的最基本的例子(我知道应该定义例如UNICODE/_UNICODE):
Linux的:
#include <stdio.h>
int main() {
char* str = "Rölf";
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
视窗:
#include <stdio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "");
wchar_t* str = L"Rölf";
wprintf(L"%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
现在,我已经读过,实现它的一种方法是基本上"只使用UTF-8/char到处并且在进行API调用时担心特定于平台的转换".
这将是伟大的 - 让用户提供char*作为我的库的输入,并"简单地"转换它.所以我尝试了基于这个例子的以下片段(我也在其他地方的变化中看到过).如果这实际上有效,那将是惊人的.但它没有:
char* str = u8"Rölf";
int len = mbstowcs(NULL, str, 0) + 1;
wchar_t wstr[len];
mbstowcs(wstr, str, len);
wprintf(L"%s\n", wstr);
Run Code Online (Sandbox Code Playgroud)
我也偶然发现了关于控制台字体的讨论以及不正确渲染的原因,所以为了证明这不是控制台问题 - 以下也不起作用(好吧 - L""字面意思.转换后的u8文字没有):
MessageBoxW(NULL, wstr, L"Rölf", MB_OK);
Run Code Online (Sandbox Code Playgroud)
我误解了转换过程吗?有没有办法做这项工作?(不使用例如ICU)
我一直在 Python3 中使用 win32api 创建一个支持 toast 通知的 Windows 10 应用程序。
我的应用程序已经有一个系统托盘图标,我正在使用以下代码添加 toast 通知
def show_toast(self,msg,title):
flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP
nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, self.hicon,
"SpotiFind")
win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, (self.hwnd, 0,
win32gui.NIF_INFO,
win32con.WM_USER + 20,
self.hicon, "Balloon Tooltip", msg, 200, title))
Run Code Online (Sandbox Code Playgroud)
一切正常,但通知保留在通知区域,我想自动删除它......根据 MSDN ( https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/ns-shellapi -_notifyicondataa )
要移除气球通知,请指定 NIF_INFO 并通过 szInfo 提供一个空字符串。
所以我尝试了以下
def _destroy_toast(self):
win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, (self.hwnd, 0,
win32gui.NIF_INFO,
win32con.WM_USER + 20,
self.hicon, "Balloon Tooltip", "", 200, ""))
Run Code Online (Sandbox Code Playgroud)
这没什么...
提前致谢..
我试图加载位图我用的功能按钮SetImage从CMFCButton。我没有收到任何错误或其他东西,只是一个简单的按钮。我正在做同样的事情icons并且它可以工作,但我也需要加载它bitmap。我需要LoadImage从路径而不是从资源。
这是我的代码:
iconResource = path + m_type + _T("U") + extension; //i.e : C:\test\earthU.bmp
HANDLE hIcon = ::LoadImage(nullptr, iconResource, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//same thing for Hot and Disable bitmap
Run Code Online (Sandbox Code Playgroud)
以及对SetImage函数的调用:
SetImage((HBITMAP)hIcon, 0, (HBITMAP)hIconHot, 0 , (HBITMAP)hIconDis);
Run Code Online (Sandbox Code Playgroud) 所以我试图像往常一样测试运行我的dev c ++并且它说无法执行location/name.exe错误193:%1不是有效的win 32应用程序.我还没有将编译器用于任何复杂的事情.
#include<stdio.h>
#include<math.h>
#define PI 3.14
int main()
{
int r = 3;
float area = PI*pow(r,2);
printf("the area of the circle is %f",area);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Dev c ++ GCC(MinGW)编译器.
它编译正确,但当我尝试运行时,它会收到此错误消息
无法执行"C:\ Users\SIM JONES NIGL TD\Desktop\c language\areaofcircle2.exe":错误193:%1不是有效的Win32应用程序.
按任意键继续
我通过网络进行了一些研究,发现了一些有用的代码.我改变了一下,试图捕获整个屏幕并生成一个我可以通过udp数据包发送的缓冲区:
#include <iostream>
#include <Windows.h>
#include <fstream>
void CapruteScreenAndSaveToFile()
{
uint16_t BitsPerPixel = 24;
uint32_t Width = GetSystemMetrics(SM_CXSCREEN);
uint32_t Height = GetSystemMetrics(SM_CYSCREEN);
// Create Header
BITMAPFILEHEADER Header;
memset(&Header, 0, sizeof(Header));
Header.bfType = 0x4D42;
Header.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// Create Info
BITMAPINFO Info;
memset(&Info, 0, sizeof(Info));
Info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
Info.bmiHeader.biWidth = Width;
Info.bmiHeader.biHeight = Height;
Info.bmiHeader.biPlanes = 1;
Info.bmiHeader.biBitCount = BitsPerPixel;
Info.bmiHeader.biCompression = BI_RGB;
Info.bmiHeader.biSizeImage = Width * Height * (BitsPerPixel > 24 ? 4 : 3);
// Capture screen …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试构建 16 位灰度“渐变”图像,但我的输出看起来很奇怪,所以我显然没有正确理解这一点。我希望有人能够对我的问题提供一些知识。我认为我写的“位图”是错误的?但我不确定。
#include "CImg.h"
using namespace std;
unsigned short buffer[1250][1250];
void fill_buffer()
{
unsigned short temp_data = 0;
for (int i =0;i < 1250; i++)
{
for (int j =0 ;j < 1250;j++)
{
buffer[i][j] = temp_data;
}
temp_data += 20;
}
}
int main()
{
fill_buffer();
auto hold_arr = (uint8_t *)&buffer[0][0];
cimg_library::CImg<uint8_t> img(hold_arr, 1250, 1250);
img.save_bmp("test.bmp");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
电流输出:
