1

新しいToshibaSatelliteZ930を購入したばかりで、音量アップ/ダウンファンクションキーが提供されていないことに失望しました。ただし、ultrabookに電源ボタンの横に2つのプログラム可能なキーがあるため、これらのキーから呼び出すことができる小さなC++アプリを開発しようとしています。

これまでのところ、私のコードはすべて、プログラムに渡されたコマンドラインパラメーターに基づいて音量を増減するためにうまく機能しています。私が抱えている唯一の問題は、操作が機能したことをユーザーに知らせるためにマスターボリュームスライダーを表示し、のスピーカーアイコンをクリックしたときに表示される通常の位置に表示したいということです。通知領域。

ATM CreateProcess()を使用して「sndvol.exe-f」を実行しています。これは機能しますが、ウィンドウが奇数の場所(およそ{100、400})に表示されます。そこで、EnumWindows()とGetWindowThreadProcessId()を使用してウィンドウへのハンドルを取得し、SetWindowPos()を使用して目的の場所に移動しようとしましたが、これは効果がありません。プロセスのトップレベルウィンドウへのハンドルを正常に取得できますが、移動できません。

誰かがこの行動を説明できますか?スライダーウィンドウからフォーカスを外すとウィンドウが閉じるという事実と関係がありますか?このページは、私が達成しようとしていること可能であることを示唆していますが、私は何を間違っているのですか?

MTIA:D

4

2 に答える 2

0

STARTUPINFO と SetWindowPos のこの興味深い組み合わせは、どういうわけか機能しているようです。

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

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    const DWORD myProcessId = (DWORD) lParam;

    DWORD processId;
    GetWindowThreadProcessId(hWnd, &processId);
    if (processId == myProcessId) {
        SetWindowPos(hWnd, 0, 1, 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    }
    return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    si.wShowWindow = SW_SHOWNORMAL;
    si.dwFlags = STARTF_USESHOWWINDOW;
    wchar_t cmdline[33000] = L" -f";
    PROCESS_INFORMATION pi;
    BOOL x = CreateProcess(L"c:\\Windows\\System32\\sndvol.exe", &cmdline[0], 0, 0, true, 0, 0, 0, &si, &pi);
    //std::cerr << x << " " << GetLastError() << std::endl;
    WaitForInputIdle(pi.hProcess, 100);

    for (int i = 0; i < 200; ++i)
    {
        x = EnumWindows(EnumWindowsProc, (LPARAM) pi.dwProcessId);
        //std::cerr << x << " " << GetLastError() << std::endl;
        Sleep(20);
    }

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return 0;
}

より良い解決策を得るために、さらに実験することをお勧めします (たとえば、コールバックがウィンドウの移動に少なくとも 1k回成功するかどうかを監視します。1 回の成功を確認しようとしましたが、常にウィンドウを移動するとは限りませんでした。また、プロセスが処理することを確認してください)。まだ有効なプロセスを参照しています - 無限ループを書きたくありません.)

最新の編集により、ソリューションは非常に信頼できるものになりました。

于 2013-01-21T03:36:51.190 に答える