winapi — C ++ Почему Sendmessage не работает?

В C # эта функция SendMessage успешно увеличивает громкость:

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

SendMessage(Handle, 0x319, (int)Handle, APPCOMMAND_VOLUME_UP);

Но в C ++ эта функция SendMessage не работает, то есть объем не увеличивается:

// HWND hwnd = CreateWindow(...
SetWindowText(hwnd, "Hi"); // Worked
SendMessage(hwnd, WM_APPCOMMAND, (int)hwnd, APPCOMMAND_VOLUME_UP); // Don't work

Что я не прав? Можете ли вы помочь мне, как это исправить? Спасибо!

Полный код:

#include <windows.h>
HHOOK _hhook;
HWND hwnd;
HINSTANCE _hInstance;

KBDLLHOOKSTRUCT kbdStruct;

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_KEYDOWN)
{
// lParam is the pointer to the struct containing the data needed, so cast and assign it to kdbStruct.
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
// a key (non-system) is pressed.
if (kbdStruct.vkCode == VK_F1)
{
// F1 is pressed!
SetWindowText(hwnd, "Hi");
SendMessage(hwnd, WM_APPCOMMAND, (WPARAM)hwnd, APPCOMMAND_VOLUME_UP);
//MessageBox(NULL, "F1 is pressed!", "key pressed", MB_ICONINFORMATION);
}
}
}
return CallNextHookEx(_hhook, nCode, wParam, lParam);
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow )
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.hCursor = LoadCursor( NULL, IDC_HAND );
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = TEXT("Philip");
wc.lpszMenuName = 0;
wc.style = CS_HREDRAW | CS_VREDRAW;

RegisterClass( &wc );
hwnd = CreateWindow(
TEXT("Philip"),
TEXT("Hello World!"),
WS_OVERLAPPEDWINDOW,
10, 10,
500, 200,
NULL, NULL,
hInstance, NULL );

ShowWindow(hwnd, iCmdShow );
UpdateWindow(hwnd);

_hhook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0);

MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(   HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam )
{

switch( message )
{

case WM_DESTROY:
PostQuitMessage( 0 ) ;
return 0;
break;}
return DefWindowProc( hwnd, message, wparam, lparam );
}

-2

Решение

Вам нужно использовать MAKELPARAM макрос для передачи APPCOMMAND_VOLUME_UP отправить сообщение MAKELPARAM(0,APPCOMMAND_VOLUME_UP)
Финальная версия должна выглядеть так

SendMessage(hwnd, WM_APPCOMMAND, (WPARAM)hwnd, MAKELPARAM(0,APPCOMMAND_VOLUME_UP));
5

Другие решения

После некоторого расследования я смог заставить это работать. Проблема проистекает из прохождения неправильно сформированного lParam значение. Сама команда находится в верхних 16 битах значения, но вы не учитываете это. Следующее изменение должно помочь вам:

SendMessage(hwnd, WM_APPCOMMAND, (WPARAM)hwnd, APPCOMMAND_VOLUME_UP << 16);
1

По вопросам рекламы [email protected]